Encoding Obfuscation
๐ก ํด๋น ๋ค์ํ ์ธ์ฝ๋ฉ์ ํตํ ๋๋ ํ ๊ธฐ๋ฒ์ 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 |