๋ฌธ์ : DreamHack โ access-log ๋ถ๋ฅ: Forensics ๋์ด๋: ๐ฅ ๋ธ๋ก ์ฆ 2 FLAG:
DH{anA1yz1nGVe3yB19L0g}
๋ฌธ์ ์ค๋ช ์ ๋ด๋ฐฑํ๋ค.
๋น์ ์ ์ด๋ฒ ํดํน ์ฌ๊ฑด์ ๋ถ์์ ๋ด๋นํ๊ฒ ๋์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ
access.logํ์ผ ํ๋๋ง์ด ์ ๊ณต ๊ฐ๋ฅํ๋ค๊ณ ํฉ๋๋ค. ๊ณผ์ฐ ๋ถ์์ ๋ง์น๊ณ ํ๋๊ทธ๋ฅผ ์ฐพ์๋ผ ์ ์์๊น์?
์ฆ ๊ณต๊ฒฉ์๊ฐ ์๋ฒ์ ๋ฌด์จ ์ง์ ํ๋์ง ๋ก๊ทธ๋ง ๋ณด๊ณ ๋์ง์ด์ผ ํ๋ค. ๋ก๊ทธ๋ฅผ ์ด์ด ๋ณด๋ฉด ์ฒ์๋ถํฐ ๋๊น์ง sqlmap์ SQL ์ธ์ ์
ํ์ ์ด๋ค. ๊ณต๊ฒฉ์๊ฐ blind SQLi๋ก ๋ฌด์ธ๊ฐ๋ฅผ ํ ๊ธ์์ฉ ๋นผ๋ด ๊ฐ๊ณ , ๊ทธ "๋ฌด์ธ๊ฐ"๊ฐ ํ๋๊ทธ๋ค. ๋ก๊ทธ๋ฅผ ๊ฑฐ๊พธ๋ก ๋๋ ค ๊ณต๊ฒฉ์๊ฐ ์ป์ด ๋ธ ๊ฐ์ ๊ทธ๋๋ก ์ฌ๊ตฌ์ฑํ๋ ๊ฒ ๋ชฉํ๋ค.

๋ฌธ์ ๊ฐ์
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ๋ฌธ์ ๋ช | access-log |
| ๋์ด๋ | ๐ฅ ๋ธ๋ก ์ฆ 2 |
| ๋ถ๋ฅ | Forensics |
| ์ ๊ณต ํ์ผ | access.log (nginx ์ ๊ทผ ๋ก๊ทธ 6655์ค) |
| ๋ชฉํ | ๋ก๊ทธ ๋ถ์์ผ๋ก ๊ณต๊ฒฉ์๊ฐ ๋นผ๋ธ ํ๋๊ทธ ๋ณต์ |
| ํต์ฌ ๊ธฐ๋ฒ | time-based blind SQLi๋ฅผ ์๋ต ํฌ๊ธฐ ์ค๋ผํด๋ก ์ญ์ฌ๊ตฌ์ฑ |
์ ๋ต ํ๋๊ทธ๋ ์๋ฒ ์ด๋๊ฐ์ DB์ ์์๊ณ , ๊ณต๊ฒฉ์๊ฐ ๊ทธ๊ฑธ blind SQLi๋ก ์ด๋ฏธ ๋นผ ๊ฐ๋ค. ์ฐ๋ฆฌ๋ ๊ทธ ๊ณผ์ ์ ๋ก๊ทธ๋ก๋ง ์ง์ผ๋ณธ ์ ์ด๋ผ, ๊ณต๊ฒฉ์๊ฐ ์ป์ ๋ต์ ๋๊ฐ์ด ๊ณ์ฐํด ๋ด๋ฉด ๋๋ค.
๋ฐฐ๊ฒฝ โ DVWA, sqlmap, ๊ทธ๋ฆฌ๊ณ time-based blind SQLi
๋ก๊ทธ์ ์์ฒญ ๊ฒฝ๋ก๋ /vulnerabilities/sqli/, User-Agent๋ sqlmap/1.2.4๋ค. ๋ ๋ค ์ต์ํ ์ด๋ฆ์ด๋ค.
- DVWA(Damn Vulnerable Web Application)๋ ์น ์ทจ์ฝ์ ์ค์ต์ฉ ์ฑ์ด๋ค.
/vulnerabilities/sqli/๋idํ๋ผ๋ฏธํฐ๋ฅผ ๊ทธ๋๋ก ์ฟผ๋ฆฌ์ ๋ฃ๋ ์ ํ์ ์ธ SQL ์ธ์ ์ ์ง์ ์ด๋ค. - sqlmap์ SQL ์ธ์ ์ ์๋ํ ๋๊ตฌ๋ค. ์ทจ์ฝ์ ์ ์ฐพ์ผ๋ฉด DB ๊ตฌ์กฐ๋ถํฐ ํ ์ด๋ธยท์ปฌ๋ผยท๋ฐ์ดํฐ๊น์ง ์๋์ผ๋ก ๋นผ๋ธ๋ค.
- blind SQLi๋ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ํ๋ฉด์ ์ง์ ์ ๋ณด์ผ ๋, ์ฐธ/๊ฑฐ์ง๋ง ์ ์ ์๋ ์ ํธ๋ก ๋ฐ์ดํฐ๋ฅผ ํ ๋นํธ์ฉ ์บ๋ด๋ ๊ธฐ๋ฒ์ด๋ค. ๊ทธ์ค time-based๋ "์กฐ๊ฑด์ด ์ฐธ์ด๋ฉด
SLEEP()์ผ๋ก ์๋ต์ ์ง์ฐ์์ผ๋ผ"๋ผ๊ณ ์ฃผ์ ํด, ์๋ต์ด ๋ฆ๋์ง ์๋์ง๋ก ์ฐธ/๊ฑฐ์ง์ ์ฝ๋๋ค.
sqlmap์ time-based ํ์ด๋ก๋๋ ๋๋ต ์ด๋ ๊ฒ ์๊ฒผ๋ค.
id=1' AND 9329=IF(
(ORD(MID((SELECT `value` FROM dvwa.flag ORDER BY id LIMIT 0,1), 1, 1)) > 64),
SLEEP(1), 9329
)-- -dvwa.flag ํ
์ด๋ธ value์ ์ฒซ ๊ธ์ ์์คํค ์ฝ๋๊ฐ 64๋ณด๋ค ํฌ๋ฉด SLEEP(1)๋ก 1์ด ์ฌ๊ณ , ์๋๋ฉด ์ ์ฐ๋ค. ์ด๋ ๊ฒ > N์ N์ ์ด์งํ์์ผ๋ก ๋ฐ๊ฟ ๊ฐ๋ฉฐ ํ ๊ธ์์ ์์คํค ๊ฐ์ ์ขํ ๋๊ฐ๋ค. ๊ณต๊ฒฉ์๋ ์ด ์ง์ ๋ฌธ์ ํ๋ํ๋, ์ปฌ๋ผ ํ๋ํ๋ ๋ฐ๋ณตํด DB๋ฅผ ํต์งธ๋ก ๋ ๊ฐ๊ณ , ๊ทธ ์์ฒญ์ด ์ ๋ถ ๋ก๊ทธ์ ๋จ์๋ค.
๐ฌ ์ ์ฐฐ โ ๋ก๊ทธ๋ ์ ๋ถ sqlmap
๋จผ์ ๋ก๊ทธ์ ๊ท๋ชจ์ ์ฑ๊ฒฉ์ ๋ณธ๋ค.
echo "์ด $(wc -l < access.log) ์ค"
grep -oE "sqlmap/[0-9.]+" access.log | sort | uniq -c # User-Agent ๋ถํฌ
head -1 access.log # ์ฒซ ์์ฒญ
6655์ค ์ค 6649์ค์ด sqlmap/1.2.4๋ค. ์ฌ๋์ด ์๋๋ผ ๋๊ตฌ๊ฐ ์์ฒ ๋ฒ ์์ฒญ์ ๋๋ฆฐ ํ์ ์ด๋ค. ์์ฒญ ํ๋๋ฅผ URL ๋์ฝ๋ํด์ ๋ฌด์จ ์ฟผ๋ฆฌ์ธ์ง ๋ฏ์ด๋ดค๋ค.
# decode_one.py โ ๋ก๊ทธ ํ ์ค์ URL ๋์ฝ๋ํด blind ์ฟผ๋ฆฌ ๊ตฌ์กฐ ๋ณด๊ธฐ
import urllib.parse
for ln in open("access.log"):
q = urllib.parse.unquote(ln)
if "value` AS CHAR" in q and "FROM dvwa.flag" in q and ">64)" in q:
print(q[q.find("id="):q.find(" HTTP")])
break
๋์ฝ๋ํ๋ฉด ์์ ๋ฐฐ๊ฒฝ์์ ๋ณธ ๊ทธ ํ์ด๋ก๋๋ค. SELECT \value` FROM dvwa.flag์ ์ฒซ ๊ธ์๋ฅผ ORD(MID(...)) > 64๋ก ๋ ๋ณด๊ณ ์๋ค. ๊ณต๊ฒฉ ๋์์ด dvwa.flagํ
์ด๋ธ์value` ์ปฌ๋ผ์์ด ์ฌ๊ธฐ์ ๋๋ฌ๋๋ค.
๐ฃ ํต์ฌ โ time-based์ธ๋ฐ ๋ก๊ทธ์ ์๊ฐ์ด ์๋ค
๋ฌธ์ ๊ฐ ํ๋ ์๋ค. time-based blind์ ์๋ ์ค๋ผํด์ ์๋ต ์ง์ฐ ์๊ฐ์ธ๋ฐ, ์ด ๋ก๊ทธ์ ์๊ฐ ์ ๋ณด๊ฐ ์๋ค.
# timing.py โ ๋ก๊ทธ ํฌ๋งท์ ์๋ต์๊ฐ ํ๋๊ฐ ์๋?
line = open("access.log").readline().rstrip()
print(line)
# 172.20.0.1 - - [26/Apr/2024:...] "GET ... HTTP/1.1" 200 1686 "-" "sqlmap/..."
nginx ๊ธฐ๋ณธ combined ํฌ๋งท์ IP - user [์๊ฐ] "์์ฒญ" ์ํ ์๋ต๋ฐ์ดํธ "referer" "UA"๋ค. $request_time ๊ฐ์ ์์ ์๊ฐ ํ๋๊ฐ ์์ด์, SLEEP์ผ๋ก ์ค์ ๋ก ์ผ๋ง๋ ์ง์ฐ๋๋์ง๋ ๋ก๊ทธ๋ง ๋ด์ ์ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ ์ฌ์ํ์ง๋ง ๊ฒฐ์ ์ ์ธ ํ์ด ์๋ค. sqlmap์ ํ์ด๋ก๋๋ AND X=IF(์กฐ๊ฑด, SLEEP(1), X) ๊ผด์ด๋ค. ์ด๊ฑธ ๊ทธ๋๋ก ์๋ ์ฟผ๋ฆฌ์ ๋ถ์ด๋ฉด WHERE user_id='1' AND X=IF(...)๊ฐ ๋๋ค.
- ์กฐ๊ฑด์ด ์ฐธ์ด๋ฉด
IF๊ฐSLEEP(1)์ ์คํํ๊ณ ๊ทธ ๋ฐํ๊ฐ์0์ด๋ค. ๊ทธ๋ฌ๋ฉดX=0์ด ๋์ด ๊ฑฐ์ง,WHERE ... AND ๊ฑฐ์งโ ํ์ด ๋ฐํ๋์ง ์๋๋ค. - ์กฐ๊ฑด์ด ๊ฑฐ์ง์ด๋ฉด
IF๊ฐX(=9329)๋ฅผ ๋ฐํํ๋ค.X=X๋ ์ฐธ,WHERE ... AND ์ฐธโ ์๋ ํ์ด ๋ฐํ๋๋ค.
์ฆ ์กฐ๊ฑด์ ์ฐธ/๊ฑฐ์ง์ด ๊ฒฐ๊ณผ ํ์ ์ ๋ฌด๋ฅผ ๋ฐ๊พธ๊ณ , ๊ทธ๊ฑด ๊ณง ์๋ต ๋ณธ๋ฌธ ํฌ๊ธฐ์ ์ฐจ์ด๋ก ๋ก๊ทธ์ ์๋ต ๋ฐ์ดํธ ํ๋์ ๋จ๋๋ค. ์ง์ฐ์ ๋ชป ๋ด๋ ์๋ต ํฌ๊ธฐ๋ก ์ฐธ/๊ฑฐ์ง์ ์ฝ์ ์ ์๋ ๊ฒ์ด๋ค. ์ค์ ๋ก ์ถ์ถ ์ฟผ๋ฆฌ๋ค์ ์๋ต ๋ฐ์ดํธ๋ฅผ ์ธ์ด ๋ดค๋ค.
# oracle.py โ ์ถ์ถ ์ฟผ๋ฆฌ ์๋ต ๋ฐ์ดํธ ๋ถํฌ
import collections, urllib.parse
bc = collections.Counter()
for ln in open("access.log"):
if "SLEEP" in ln and "ORD(MID" in urllib.parse.unquote(ln):
bc[int(ln.split()[9])] += 1
print(bc.most_common(6))
1664 ๋ฐ์ดํธ๊ฐ ์๋์ ์ผ๋ก ๋ง๊ณ (2136ํ), ๋๋จธ์ง๋ 1808~1860์ ํฉ์ด์ ธ ์๋ค. 1664๊ฐ ๋ฐ๋ก "ํ์ด ์ฌ๋ผ์ง" ์งง์ ์๋ต, ์ฆ ์กฐ๊ฑด์ด ์ฐธ์ผ ๋์ ์ ํธ๋ค. ์ด๊ฒ ์ฐ๋ฆฌ์ blind ์ค๋ผํด์ด๋ค.
โถ ์ฝ์ง: ์๋ต์๊ฐ์ ์ฐพ์ ํค๋งค๊ณ , flag ํ ์ด๋ธ ์ด๋ฆ์ ํ ๋ฒ ์๋ค
์ฒ์์ time-based๋ผ๋ ๋ง์ ๊ฐํ "๋ก๊ทธ์์ ์๋ต ์๊ฐ์ ์ด๋ป๊ฒ๋ ๋ฝ์์ผ ํ๋ค"๊ณ ์๊ฐํ๋ค. ๋ก๊ทธ ํฌ๋งท์ ๋ช ๋ฒ์ด๋ ๋ค์ ๋ณด๋ฉฐ $request_time์ด ์จ์ด ์๋ ๋ค์ก์ง๋ง ์์๋ค. ํ์ฐธ ๋ค์์ผ "์ง์ฐ์ด ์๋๋ผ ์ฃผ์
์ด ๊ฒฐ๊ณผ ์งํฉ์ ๋ฐ๊พธ๋ ์๋ต ํฌ๊ธฐ๋ฅผ ๋ณด๋ฉด ๋๋ค"๋ ๋ฐ ์๊ฐ์ด ๋ฏธ์ณค๋ค. time-based ํ์ด๋ก๋์ง๋ง ์ฌ์ค์ boolean ์ค๋ผํด์ ๊ณต์ง๋ก ์ป๋ ์
์ด์๋ค.
๋ ๋ฒ์งธ ์ฝ์ง์ ํ
์ด๋ธ ์ด๋ฆ์ด์๋ค. ์ฒ์ ํ์ฑํ์ ๋ FROM dvwa.flag๋ง ๋์ ๋ค์ด์์ "flag ํ
์ด๋ธ์์ id๋ฐ์ ์ ๋นผ๊ฐ๋ค?"๋ผ๊ณ ๊ฒฐ๋ก ์ง์ ๋ปํ๋ค. ๊ทธ๋ฐ๋ฐ ์ปฌ๋ผ ์ด๊ฑฐ ์ฟผ๋ฆฌ์ WHERE table_name=0x666c616773์ ๋์ฝ๋ํ๋ 0x666c616773 = "flags"์๋ค. flag์ flags, ๋ ํ
์ด๋ธ์ด ๋ฐ๋ก ์์๋ ๊ฒ.
>>> bytes.fromhex("666c616773").decode()
'flags'
>>> bytes.fromhex("666c6167").decode()
'flag'flags ํ
์ด๋ธ์ ์ปฌ๋ผ ์๋ฅผ ์ธ๋ฉด 0์ด ๋์ค๋ ๋น ๊ป๋ฐ๊ธฐ(๋์ฝ์ด)์๊ณ , ์ง์ง ๋ฐ์ดํฐ๋ flag ํ
์ด๋ธ์ value ์ปฌ๋ผ์ ์์๋ค. ์ฌ๊ตฌ์ฑ ํค๋ฅผ FROM ... ์ ์ ์ฒด(WHERE ํฌํจ)๋ก ์ก์ ๋ ํ
์ด๋ธ์ ๊ตฌ๋ถํ๊ณ ๋์์ผ ๊ฐ์ด ์ ๋๋ก ๋จ์ด์ก๋ค.
๐ ์ด์งํ์ ๋๊ฐ๊ธฐ โ ๊ณต๊ฒฉ์๊ฐ ์ป์ ๊ฐ์ ๊ทธ๋๋ก ๊ณ์ฐ
์ค๋ผํด์ ์ ํ์ผ๋ ์ฌ๊ตฌ์ฑ์ ๊ธฐ๊ณ์ ์ด๋ค. ๊ฐ ์ถ์ถ ์ฟผ๋ฆฌ์์ (์ถ์ถ ๋์, LIMIT ํ, ๋ฌธ์ ์์น)์ ORD(MID(...)) ์ฐ์ฐ์ ๊ฐ, ๊ทธ๋ฆฌ๊ณ ์๋ต ๋ฐ์ดํธ๋ฅผ ๋ฝ์, ์๋ต์ด 1664๋ฉด ์กฐ๊ฑด ์ฐธ์ผ๋ก ๋ณด๊ณ >ยท<ยท=ยท!=์ ๋ง์ถฐ ๊ทธ ๋ฌธ์์ ํํยท์ํ์ ์ขํ๋ค. ์์น๋ณ๋ก ๊ฐ์ด ํ๋๋ก ํ์ ๋๋ฉด ๋ฌธ์๊ฐ ๋์จ๋ค.
import urllib.parse, re, collections
lines = open("extracted/access.log").read().splitlines()
pat = re.compile(
r"ORD\(MID\(\(SELECT IFNULL\(CAST\((?P<expr>.+?) AS CHAR\),0x20\) FROM (?P<src>.+?)\),"
r"(?P<pos>\d+),1\)\)(?P<op>!=|>=|<=|=|>|<)(?P<val>\d+)")
bytecnt = collections.Counter(); recs = []
for ln in lines:
if "SLEEP" not in ln: continue
q = urllib.parse.unquote(ln)
m = pat.search(q)
if not m: continue
by = int(ln.split()[9]); bytecnt[by] += 1
src = m.group("src"); rr = re.search(r"LIMIT (\d+),1", src)
r = int(rr.group(1)) if rr else 0
recs.append((m.group("expr"), re.sub(r" ORDER BY.*$", "", src), r,
int(m.group("pos")), m.group("op"), int(m.group("val")), by))
TRUE_BYTES = bytecnt.most_common(1)[0][0] # ๊ฐ์ฅ ํํ ์๋ต = ์กฐ๊ฑด ์ฐธ(SLEEP)
bounds = collections.defaultdict(lambda: [0, 255]); eqs = {}; neq = collections.defaultdict(set)
for expr, src, r, pos, op, val, by in recs:
cond = (by == TRUE_BYTES); k = (expr, src, r, pos); lo, hi = bounds[k]
if op == ">": lo, hi = (max(lo, val+1), hi) if cond else (lo, min(hi, val))
elif op == "<": lo, hi = (lo, min(hi, val-1)) if cond else (max(lo, val), hi)
elif op == "=": eqs[k] = val if cond else eqs.get(k)
elif op == "!=": (neq[k].add(val) if cond else eqs.__setitem__(k, val))
bounds[k] = [lo, hi]
def ch(k):
if k in eqs and eqs[k] is not None: c = eqs[k]
else:
lo, hi = bounds[k]; cand = [x for x in range(max(lo,1), hi+1) if x not in neq[k]]
c = lo if lo == hi else (cand[0] if len(cand)==1 else None)
return chr(c) if c and 32 <= c < 127 else "?"
groups = collections.defaultdict(dict)
for k in bounds:
expr, src, r, pos = k; groups[(expr, src, r)][pos] = ch(k)
for k, pm in groups.items():
if "dvwa.flag" in k[1] and "value" in k[0]:
flag = "".join(pm[p] for p in sorted(pm))
print("[+] dvwa.flag.value =", flag[:flag.index("}") + 1])์ด ์ฌ๊ตฌ์ฑ๊ธฐ๋ฅผ WHERE ์ ๊น์ง ํฌํจํด ํค๋ก ์ก๊ณ ๋๋ฆฌ๋ฉด ๊ณต๊ฒฉ์๊ฐ ํ์ DB ๊ตฌ์กฐ ์ ์ฒด๊ฐ ๋์ด์๋๋ค. ์คํค๋ง์ flag ํ
์ด๋ธ์ ๋ณด๋ฉด ์ ์ฒด๊ฐ ๋ถ๋ช
ํ๋ค.

dvwa ์คํค๋ง์ flag, users, guestbook ์ธ ํ
์ด๋ธ์ด ์๊ณ , flag ํ
์ด๋ธ์ idยทvalue ๋ ์ปฌ๋ผ์ ๊ฐ์ง๋ค. ๊ทธ value๊ฐ DH{anA1yz1nGVe3yB19L0g} โ ํ๋๊ทธ๋ค. leet๋ฅผ ํ๋ฉด "analyzing very big log", ๋ฑ ์ด ๋ฌธ์ ๊ทธ ์์ฒด๋ค.
์ฌ๊ตฌ์ฑ์ด ์ ๋๋ก ๋๋์ง ํ์ธ ์ผ์ users ํ
์ด๋ธ๋ ๋ ๋ดค๋ค. ๊ณต๊ฒฉ์๋ flag๋ง์ด ์๋๋ผ ์ฌ์ฉ์ ํ
์ด๋ธ์ ํต์งธ๋ก ๋นผ ๊ฐ๋ค.

DVWA ๊ธฐ๋ณธ ๊ณ์ ๋ค(admin, gordonb, โฆ)์ MD5 ํด์๊น์ง ์ ํํ ๋ณต์๋๋ค. ์ฌ๊ตฌ์ฑ ๋ก์ง์ด ์ฌ๋ฐ๋ฅด๋ค๋ ๋ฐฉ์ฆ์ด๋ค.
Full Exploit
์ ์คํฌ๋ฆฝํธ๋ฅผ ๊ทธ๋๋ก ์คํํ๋ฉด ํ๋๊ทธ๊ฐ ๋์จ๋ค.

[+] dvwa.flag.value = DH{anA1yz1nGVe3yB19L0g}๐ ๊ฒฐ๋ก
time-based blind๋ผ๋ ์๋ต ํฌ๊ธฐ๊ฐ ์ค๋ผํด์ด ๋ ์ ์๋ค.
์ด ๋ฌธ์ ์ ํต์ฌ์ "์ง์ฐ์ ๋ชป ๋ณด๋๋ฐ ์ด๋ป๊ฒ ์ฐธ/๊ฑฐ์ง์ ์ฝ์ง?"์๋ค. ๋ต์ ํ์ด๋ก๋์ ๋ถ์์ฉ์ ์์๋ค. AND X=IF(์กฐ๊ฑด, SLEEP, X)๋ ์กฐ๊ฑด์ ๋ฐ๋ผ WHERE์ ๊ฒฐ๊ณผ ํ ์ ๋ฌด๋ฅผ ๋ฐ๊พธ๊ณ , ๊ทธ๊ฒ ์๋ต ํฌ๊ธฐ ์ฐจ์ด๋ก ๋ก๊ทธ์ ๋จ๋๋ค. blind SQLi๋ฅผ ๋ก๊ทธ๋ก ์ญ์ถ์ ํ ๋ ์๊ฐ๋ฟ ์๋๋ผ ์๋ต ๋ฐ์ดํธยท์ํ ์ฝ๋ยท์๋ต ๊ธธ์ด์ ๋ฏธ์ธํ ์ฐจ์ด๊ฐ ์ ๋ถ ์ค๋ผํด ํ๋ณด๋ค.
๊ณต๊ฒฉ ์๋ํ ๋๊ตฌ๋ ๋ก๊ทธ์ ์๊ธฐ ํ์ ์ ์ด์ดํ ๋จ๊ธด๋ค.
sqlmap์ ๋ฐ์ดํฐ๋ฅผ ๋นผ๋ด๋ ค๊ณ ์์ฒ ๋ฒ์ ์์ฒญ์ ์์ฐจ์ ์ผ๋ก ๋์ก๊ณ , ๊ทธ ์ด์งํ์ ๊ณผ์ ์ด ๊ณ ์ค๋ํ ๋ก๊ทธ์ ์ ํ๋ค. ๋ฐฉ์ด์ ์
์ฅ์์ ์ด๊ฒ ์๋ ์ ๊ฒ์ด๋ค. blind SQLi๋ ํ ๋ฒ์ ๊ณต๊ฒฉ์ผ๋ก ๋๋์ง ์๊ณ ๋๋์ ๊ท์น์ ์ธ ์์ฒญ์ ๋จ๊ธฐ๋ฏ๋ก, ๊ฐ์ ์๋ํฌ์ธํธ์ ์งง์ ์๊ฐ ์์ฒ ๊ฑด, ๋์ผ UA, SLEEPยทORDยทinformation_schema ๊ฐ์ ํค์๋๊ฐ ๋ณด์ด๋ฉด ์ฆ์ ํ์งยท์ฐจ๋จํด์ผ ํ๋ค. ๋ฐ๋๋ก ์ฌ๊ณ ๋ถ์ ๋จ๊ณ์์ ๊ทธ ๊ท์น์ฑ ๋์ ๊ณต๊ฒฉ์๊ฐ ๋ฌด์์ ์ผ๋ง๋ ๋นผ ๊ฐ๋์ง๊น์ง ์ ํํ ๋ณต์ํ ์ ์๋ค. ๋ก๊ทธ๋ฅผ combined ํฌ๋งท ๊ทธ๋๋ก ๋์ง ๋ง๊ณ $request_timeยท์์ฒญ ๋ฐ๋๊น์ง ๋จ๊ธฐ๋ฉด, ์ด๋ฐ ์ญ์ถ์ ์ ๋ ์ฌ์์ง๋ค.
Comments
๋๊ธ
๋๊ธ์ ๋จ๊ธฐ๋ ค๋ฉด ๋ก๊ทธ์ธ์ด ํ์ํด์. (๋ค์ด๋ฒ ยท ๊ตฌ๊ธ ๊ณ์ )
๋๊ธ ๋ถ๋ฌ์ค๋ ์คโฆ