Encoding Obfuscation
π‘ ν΄λΉ λ€μν μΈμ½λ©μ ν΅ν λλ ν κΈ°λ²μ portswiggerμ μλΉλΆλΆ μ°Έκ³ νμμ΅λλ€.
λ€μν μ·¨μ½μ μ μλ³νμ¬ ν΄λΉ μ·¨μ½μ μ λν Exploitμ μ§ν ν λ Payloadμμ λ¬Έμμ΄ νΉμ dot(.), / λ±μ΄ νν°λ§ λμ΄ μλ κ²½μ°κ³ μ’ μ’ λ€μ μ‘΄μ¬νλ€. μ΄ λ μ΄λ₯Ό μ°νν μ μλλ‘ μΈμ½λ©μ ν΅ν΄ λλ νλ₯Ό μ΄μ©ν μ μλ€.
ν΄λΌμ΄μΈνΈμ μλ²λ λ€μν μΈμ½λ© λ°©μμ μ¬μ©νμ¬ μλ‘ μμ€ν
κ°μ λ°μ΄ν°λ₯Ό μ μ‘νλ€. μ λ¬λ°μ λ°μ΄ν°λ λμ½λ© λμ΄ λ°±μλλ¨μμ μ²λ¦¬λλλ€.
μΌλ°μ μΌλ‘ Query 맀κ°λ³μλ μΌλ°μ μΌλ‘ μλ²μΈ‘μμ URL λμ½λ© λλ©°,
HTML μμμ ν
μ€νΈ μ½ν
μΈ λ ν΄λΌμ΄μΈνΈμΈ‘μμ HTML λμ½λ© λλ€.
URL μΈμ½λ©μ ν΅ν λλ ν
Percent-encoding(νΌμΌνΈ μΈμ½λ©) μ΄λΌκ³ λ λΆλ¦¬λ©°, URLμ ν΅ν΄ GETνμμΌλ‘ μ λ¬ν λ μνλλ μΈμ½λ© λ°©μμ΄λ€.
URL μΈμ½λ©μ κ²½μ° λ체 λ¬Έμμ ASCIIκ°μ λν 16μ§μ ννμ β%β κΈ°νΈμ ν¨κ» μ¬μ©λλ€.
μλμΌλ‘ μΈμ½λ© λλ νΉμ λ¬Έμλ μλ νμ κ°λ€
/ -> %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 μΈμ½λ©μΌλ‘ μΈμ½λ©νμ¬ μ μ‘νκ²λλ©΄, νν°λ§μ μ°νν μ μλ€.
Double URL Encoding μ ν΅ν λλ ν
μΌλΆ λͺλͺ μλ²λ μμ λ°μ URLμ νμΈ ν λ λ²μ URL λμ½λ©μ μννλ€.
λͺ¨λ 보μ λ©μ»€λμ¦μ΄ μ λ ₯μ νμΈ ν λ μ λ ₯κ°μ Double Decoding νμ§λ μλλ€. κ·Έλ¬λ―λ‘
μμκ°μ΄ λ¨μΌ μΈμ½λ©μ ν΅ν΄ XSS PoC λ₯Ό μ£Όμ ν κ²½μ° WAF λ¨μμ μ°¨λ¨λμ΄ λ°±μλκΉμ§ ν΄λΉ payloadκ° μ λ¬λμ§ μλλ€. νμ§λ§ Double Encodingλ₯Ό ν΅ν΄ PoCλ₯Ό μμ±νμ¬ λ³΄λ΄κ² λλ€λ©΄?
λ¨μΌ λμ½λ©μ μν νλλΌλ μμ§ μΈμ½λ©λ μνλ‘ λ¨μμκΈ°μ WAFλ ν΄λΉ payloadλ₯Ό μ λλ‘λ νν°λ§μ μλ³νμ§ λͺ»νκ³ λ°±μλ μλ²μΈ‘μΌλ‘ μ λ¬λκ³ μ΄νμ λ°±μλ μΈ‘μμλ Double Decodingλ₯Ό ν΅ν΄ payloadκ° μ±κ³΅μ μΌλ‘ μ£Όμ λκ² λλ€.
HTML μΈμ½λ© μ ν΅ν λλ ν
HTML λ¬Έμμμ λΈλΌμ°μ κ° λ§ν¬μ
μ μΌλΆλ‘ μλͺ» ν΄μνμ§ μλλ‘ νΉμ λ¬Έμλ₯Ό μ΄μ€μΌμ΄ν μ²λ¦¬νκ±°λ μΈμ½λ© λμ΄ ννλμ΄μΌ νλ€.
μμμ ν
μ€νΈ λ΄μ© νΉμ μμ± κ°κ³Ό κ°μ HTML λ΄μ νΉμ μμΉμμ
λΈλΌμ°μ λ λ¬Έμλ₯Ό ꡬ문 λΆμν λ μλμΌλ‘ λμ½λ©μμ
μ μννλ€.
μ΄λ₯Ό νμ©νλ©΄ ν΄λΌμ΄μΈνΈ μΈ‘ 곡격μ λν νμ΄λ‘λλ₯Ό λλ
ν νμ¬ μλ² μΈ‘ κ²μ¦μ μ°νν μ μλ€
μλ₯Όλ€μ΄ < νμλ μλμ κ°μ΄ ννμ΄ κ°λ₯νλ€.
μ΄μ κ°μ΄ μλ²μΈ‘μμ 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 μ λ¬κ° νν°λ§ λ μ μ¬μ©
<aside>
π‘ [www.nave.com](http://www.nave.com) β www%E3%80%82naver%E3%80%82com
</aside>
url μΈμ½λ©κ³Ό double μΈμ½λ© μ΄ λ λ€ νν°λ§ λμ΄ μμκ²½μ° ν΄λ³Όλ§νλ―
Reference
- https://portswigger.net/web-security/essential-skills/obfuscating-attacks-using-encodings
- https://snyk.io/blog/url-confusion-vulnerabilities/#url-encoded
Leave a comment