π‘ ν΄λΉ λ€μν μΈμ½λ©μ ν΅ν λλ ν κΈ°λ²μ portswiggerμ μλΉλΆλΆ μ°Έκ³ νμμ΅λλ€.
λ€μν μ·¨μ½μ μ μλ³νμ¬ ν΄λΉ μ·¨μ½μ μ λν Exploitμ μ§ν ν λ Payloadμμ λ¬Έμμ΄ νΉμ dot(.), / λ±μ΄ νν°λ§ λμ΄ μλ κ²½μ°κ³ μ’ μ’ λ€μ μ‘΄μ¬νλ€. μ΄ λ μ΄λ₯Ό μ°νν μ μλλ‘ μΈμ½λ©μ ν΅ν΄ λλ νλ₯Ό μ΄μ©ν μ μλ€.
ν΄λΌμ΄μΈνΈμ μλ²λ λ€μν μΈμ½λ© λ°©μμ μ¬μ©νμ¬ μλ‘ μμ€ν κ°μ λ°μ΄ν°λ₯Ό μ μ‘νλ€. μ λ¬λ°μ λ°μ΄ν°λ λμ½λ© λμ΄ λ°±μλλ¨μμ μ²λ¦¬λλλ€.
μΌλ°μ μΌλ‘ Query λ§€κ°λ³μλ μΌλ°μ μΌλ‘ μλ²μΈ‘μμ URL λμ½λ© λλ©°,
HTML μμμ ν μ€νΈ μ½ν μΈ λ ν΄λΌμ΄μΈνΈμΈ‘μμ HTML λμ½λ© λλ€.
URL μΈμ½λ©μ ν΅ν λλ ν
Percent-encoding(νΌμΌνΈ μΈμ½λ©) μ΄λΌκ³ λ λΆλ¦¬λ©°, URLμ ν΅ν΄ GETνμμΌλ‘ μ λ¬ν λ μνλλ μΈμ½λ© λ°©μμ΄λ€.
URL μΈμ½λ©μ κ²½μ° λ체 λ¬Έμμ ASCIIκ°μ λν 16μ§μ ννμ ‘%’ κΈ°νΈμ ν¨κ» μ¬μ©λλ€.
μλμΌλ‘ μΈμ½λ© λλ νΉμ λ¬Έμλ μλ νμ κ°λ€.
: -> %3A
/ -> %2F
? -> %3F
# -> %23
[ -> %5B
] -> %5D
@ -> %40
! -> %21
$ -> %24
& -> %26
' -> %27
( -> %28
) -> %29
* -> %2A
+ -> %2B
, -> %2C
; -> %3B
= -> %3D
% -> %25
(곡백) -> %20 OR +
μ΄ μΈμ νΉμ λ¬Έμ νΉμ μΌλ° λ¬Έμλ€λ νμνμ§λ μμ§λ§, μΈμ½λ©μ κ°λ₯νλ€.
λͺ¨λ URL κΈ°λ°μΌλ‘ Query λ§€κ°λ³μλ₯Ό ν΅ν΄ κ΄λ ¨ λ³μμ ν λΉλκΈ° μ μλ²μΈ‘μμλ μλμΌλ‘ URL λμ½λ©μ μννκ² λλ€.
κ°νΉ WAF μ κ°μ μ₯λΉκ° μ¬μ©μμ μ λ ₯κ°μ URL λμ½λ©μ μννμ§ μλ κ²½μ°κ° μ‘΄μ¬νλ€. μ΄λ΄ κ²½μ° λΈλ리μ€νΈ κΈ°λ° νν° μ μ± μ URL μΈμ½λ©μΌλ‘ μΈμ½λ©νμ¬ μ μ‘νκ²λλ©΄, νν°λ§μ μ°νν μ μλ€.
EX) SELECT -> %53%45%4C%45%43%54
Double URL Encoding μ ν΅ν λλ ν
μΌλΆ λͺλͺ μλ²λ μμ λ°μ URLμ νμΈ ν λ λ²μ URL λμ½λ©μ μννλ€.
../../etc/passwd -> %252E%252E/%252E%252E/etc/passwd
λͺ¨λ 보μ λ©μ»€λμ¦μ΄ μ λ ₯μ νμΈ ν λ μ λ ₯κ°μ Double Decoding νμ§λ μλλ€. κ·Έλ¬λ―λ‘
/?payload=%3Cimg%20src%3Dx%20onerror%3Dalert(1)%3E
(<img src=x onerror=alert(1)>)
μμκ°μ΄ λ¨μΌ μΈμ½λ©μ ν΅ν΄ XSS PoC λ₯Ό μ£Όμ ν κ²½μ° WAF λ¨μμ
μ°¨λ¨λμ΄ λ°±μλκΉμ§ ν΄λΉ payloadκ° μ λ¬λμ§ μλλ€.
νμ§λ§ Double Encodingλ₯Ό ν΅ν΄ PoCλ₯Ό μμ±νμ¬ λ³΄λ΄κ² λλ€λ©΄?
/?payload=%253Cimg%2520src%253Dx%2520onerror%253Dalert(1)%253E
λ¨μΌ λμ½λ©μ μν νλλΌλ μμ§ μΈμ½λ©λ μνλ‘ λ¨μμκΈ°μ
WAFλ ν΄λΉ payloadλ₯Ό μ λλ‘λ νν°λ§μ μλ³νμ§ λͺ»νκ³ λ°±μλ μλ²μΈ‘μΌλ‘ μ λ¬λκ³ μ΄νμ λ°±μλ μΈ‘μμλ Double Decodingλ₯Ό ν΅ν΄ payloadκ° μ±κ³΅μ μΌλ‘ μ£Όμ λκ² λλ€.
HTML μΈμ½λ© μ ν΅ν λλ ν
HTML λ¬Έμμμ λΈλΌμ°μ κ° λ§ν¬μ μ μΌλΆλ‘ μλͺ» ν΄μνμ§ μλλ‘ νΉμ λ¬Έμλ₯Ό μ΄μ€μΌμ΄ν μ²λ¦¬νκ±°λ μΈμ½λ© λμ΄ ννλμ΄μΌ νλ€.
μμμ ν μ€νΈ λ΄μ© νΉμ μμ± κ°κ³Ό κ°μ HTML λ΄μ νΉμ μμΉμμ
λΈλΌμ°μ λ λ¬Έμλ₯Ό ꡬ문 λΆμν λ μλμΌλ‘ λμ½λ©μμ μ μννλ€.
μ΄λ₯Ό νμ©νλ©΄ ν΄λΌμ΄μΈνΈ μΈ‘ 곡격μ λν νμ΄λ‘λλ₯Ό λλ ν νμ¬ μλ² μΈ‘ κ²μ¦μ μ°νν μ μλ€.
μλ₯Όλ€μ΄ < νμλ μλμ κ°μ΄ ννμ΄ κ°λ₯νλ€.
< -> a
μ΄μ κ°μ΄ μλ²μΈ‘μμ alert() λΌλ Payloadλ₯Ό λͺ μμ μΌλ‘ νν°λ§ νκ³ μλ€λ©΄ μ΄λ₯Ό HTML μΈμ½λ© νμ¬ μλμ κ°μ΄ Payloadλ₯Ό ꡬμ±ν μ μλ€.
<img src='' onerror="=lert(1)">
μμ κ°μ΄ Payloadλ₯Ό μμ±ν΄μ μμ²μ λ³΄λΌ κ²½μ° μλ²μΈ‘ νν°λ§ λ‘μ§μ μ°ννκ³ λΈλΌμ°μ κ° νμ΄μ§λ₯Ό λ λλ§ ν λ μ¬μ λ Payloadλ₯Ό λμ½λ©νκ³ μ€ννκ²λλ€.
μ΄λ¬ν HMTL μΈμ½λ©μ 10μ§μ νΉμ 16μ§μ μ½λ ν¬μΈνΈλ₯Ό μ¬μ©νμ¬ μ°Έμ‘°λ₯Ό μ 곡νλ€.
: === : === '<'
μ¬κΈ°μ μ κΈ°ν μ μ HTMLμΈμ½λ©μ μ¬μ©ν λ μ½λ ν¬μΈνΈμ μ«μ 0 μ μμ κ°μλ‘ ν¬ν¨ν μ μλλ° μ΄λ κ² 0μ ν¬ν¨νμ¬ WAFλ° κΈ°ν νν°λ§μ μ°νν μ μλ€.
<a href="javascript:alert(1)">Check here</a>
XML μΈμ½λ© μ ν΅ν λλ ν
XML ꡬ문μμλ HTMLμΈμ½λ©κ³Ό μ μ¬νκ² μ«μ μ΄μ€μΌμ΄ν μνμ€λ₯Ό μ¬μ©νμ¬ μΈμ½λ©νκ²λλ€. μ΄ λ XML μ λ ₯μ ν΅ν΄ λ°μ΄ν°λ₯Ό μ λ¬νλ λ‘μ§μ΄ μ‘΄μ¬νλ€λ©΄ μ¬λ¬ μ·¨μ½μ μ μ°νν μ μλ€.
νΉμ§μ XMLμΈμ½λ©μ ν΅ν μ°νλ HTMLκ³Ό λ¬λ¦¬ λΈλΌμ°μ μ μν ν΄λΌμ΄μΈνΈμΈ‘μμ λμ½λ© λλκ²μ΄ μλλΌ μλ² μ체μ μν΄ λμ½λ©λμ΄ WAFλ° κΈ°ν νν°λ₯Ό μ°νν μ μλ€.
<test>
<list>
1
</list>
<mode>
100 5ELECT * FROM information_schema.tables
</mode>
<test>
μμ κ°μ XML μμ² μ½λκ° μ‘΄μ¬ν λ modeλΆλΆμμ SQL μΈμ μ μ μ£Όμ νκ²λλ€. μ΄ λ select λ¬Έμμ΄ νν°λ§μ μ°ννκΈ°μν΄ μΈμ½λ©μ μ¬μ©ν μ μλ€.
Unicode λ₯Ό ν΅ν λλ ν
μ λμ½λμ μ΄μ€μΌμ΄ν μνμ€ λ¬Έμμ λν 4μλ¦¬λ‘ κ΅¬μ±λ 16μ§μ μ½λμ μ λμ¬λ‘ ꡬμ±λμ΄ μλ€
\\u003a === U+003A === ':'
μμ κ°μ΄ \u003aλ‘ μΈμ½λ©ν κ²½μ° : κ³Ό λμΌν μλ―Έλ₯Ό κ°μ§κ³ μλ€.
ES6λ μ€κ΄νΈλ₯Ό μ¬μ©νλ μλ‘μ΄ ννμ μ λμ½λ μ΄μ€μΌμ΄νλ₯Ό μ§μνλ€.
\\u{3a} === \\u003a === ':'
π‘ ES6 λ 2015λ μ λμ λ λ²μ μ JavaScriptμ΄λ€.
νλ‘κ·Έλλ° μΈμ΄μμλ μ λμ½λ μ΄μ€μΌμ΄ν μνμ€λ₯΄ λμ½λ© νλλ‘γ± λμ΄μλ€. μ΄ λ λΈλΌμ°μ μΈ‘μμ μ¬μ©λλ Javascriptμμ§μ κ²½μ° μ λμ½λ μΈμ½λ©μ ν΅ν΄ ν΄λΌμ΄μΈνΈ μΈ‘ νν°λ§μ μ°νν μ μλ€.
μλ₯Ό λ€μ΄ μ·¨μ½ν¨μμΈ eval ν¨μμ μΈμλ‘ μ λ ₯κ°μ μ λ¬λ°μ λ‘μ§μ μ²λ¦¬νλ κ΅¬λ¬Έμ΄ μμ κ²½μ°, alertκ° μ°¨λ¨λμλλΌλ μλμ κ°μ΄ μ°νν μ μλ€.
eval("\\x611ert")
μμ κ²½μ° μΈμ½λ© λ μλ²μΈ‘μ λ¨μ μμΌλ―λ‘, λΈλΌμ°μ κ° λ€μ λμ½λ©ν λ κΉμ§ νν°λ§μ νμ§λμ§ μμ μ μλ€.
ES6μ κ²½μ° HTMLμΈμ½λ©λμ κ°μ΄ μ«μ0μ μμλ‘ λΆμ΄λλΌλ νμ©νλ―λ‘ μΌλΆ WAFμ νν°λ₯Ό μμΌ μ μλ€.
<a href="javascript\\u{0000000003a}alert(1)">Test</a>
16μ§μ λ° 8μ§μ μ΄μ€μΌμ΄νλ₯Ό ν΅ν λλ ν
16μ§μ λ° 8μ§μλ‘ μΈμ½λ©νμ¬ μ λ¬νκ² λλ©΄ μλ²μΈ‘ νν°λ§μ μ°νν μ μμΌλ©° λ¬Έμμ΄λ‘ μ μ‘λμ΄, ν΄λΌμ΄μΈνΈ μΈ‘μμ λμ½λ©λλ€.
eval("\\x61lert") # 16μ§μ
0x53454c454354 -> SELECT μ΄μ κ°μ΄ SQLλ¬Έλ λλ
ν ν μ μλ€.
eval("\\141lert(1)") # 8μ§μ
λ€μ€ μΈμ½λ©μ ν΅ν λλ ν
νλμ μΈμ½λ© κΈ°λ²μ μ¬μ©νμ¬ ν μ€νΈν΄λ³Ό μ μμ§λ§, λ€μν μΈμ½λ© λ°©μμ ν©μ³μ Payloadλ₯Ό μμ±ν μ μλ€.
<a href="javascript:\u0061lert(1)">test</a>
\ → HTMLμΈμ½λ©
a → Unicode μΈμ½λ©
μ ν΅ν΄ μλμ μ½λλ₯Ό λλ ν μμΌ°λ€.
<a href="javascript:alert(1)">test</a>
Functionμ ν΅ν λλ ν
SQL CHAR() ν¨μ
CHAR(83)+CHAR(69)+CHAR(76)+CHAR(69)+CHAR(67)+CHAR(84)
=== SELECT
concat(CHAR(83)+CHAR(69)+CHAR(76)+CHAR(69)+CHAR(67)+CHAR(84))
JS String.frimCharCode()
<img src=x: oNerroR=’alert(String.fromCharCode(72, 97, 99, 107))”>
.(dot)μ°ν
%E3%80%82 λ₯Ό ν΅ν΄ . νν°λ§μ μ°νν μ μμ
ex get λ°©μμΌλ‘ url μ λ¬κ° νν°λ§ λ μ μ¬μ©
url μΈμ½λ©κ³Ό double μΈμ½λ© μ΄ λ λ€ νν°λ§ λμ΄ μμκ²½μ° ν΄λ³Όλ§νλ―
Reference
μ°Έκ³ μλ£
https://portswigger.net/web-security/essential-skills/obfuscating-attacks-using-encodings
URL confusion vulnerabilities in the wild: Exploring parser inconsistencies | Snyk
'Web > Web Hacking Techniques' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
λΈλΌμ°μ μ URL μ κ·ν λ°©μ(Proxy Tool Bypass) (0) | 2025.05.13 |
---|---|
Servcer Side Requests Forgery (SSRF) (1) | 2025.05.07 |
401&403(Access Control) Bypass (0) | 2025.05.07 |
ZIP Slip Vulnerability (0) | 2025.05.06 |
Deserialize_Vulnability for Python_Pickle (0) | 2025.05.06 |