XSS - Cross Site Script
- -
XSS๋ ๋ฌด์์ธ๊ฐ ?
๋์ ์ฒ๋ฆฌ๊ฐ ์ด๋ฃจ์ด์ง๋ ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ํด ์ ์์ ์ธ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ
์ฌ์ฉ์์๊ฒ ๋น์ ์์ ์ธ ํ์๋ฅผ ๊ฐ์ ์ ์ผ๋ก ์ ๋ํ๋ ๊ณต๊ฒฉ
๋์ ์ฒ๋ฆฌ๊ฐ ์ด๋ฃจ์ด์ง๋ ์น ์ดํ๋ฆฌ์ผ์ด์
๋์ ์ฒ๋ฆฌ : ์ฌ์ฉ์์ ์ ๋ ฅ ๊ฐ์ ๋ฐ๋ผ์ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ ์๋ต์ ์ฃผ๋ ๊ฒ
์ ๋ ฅ๊ฐ/์ธ์ /์๊ฐ ๋ฑ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฌผ์ ์ถ๋ ฅ
๊ฒ์ํ,๊ฒ์,๋ก๊ทธ์ธ
์ ์์ ์ธ ์คํฌ๋ฆฝํธ
Server Side Script : PHP, JSP
Client Side Script : Java Script
๋น์ ์์ ์ธ ํ์
Java Script ๋ณ์กฐํ์ฌ ๊ณต๊ฒฉ์์ ์น ์ฌ์ดํธ๋ก ์ ๋
์ฆ XSS๋ ์ฌ์ดํธ ์์ฒด๋ฅผ ๊ณต๊ฒฉํ๋ SQL Injection ๊ฐ์ ๊ณต๊ฒฉ๊ณผ๋ ๋ค๋ฅด๊ฒ ํด๋ผ์ด์ธํธ ์ธก์ ๊ณต๊ฒฉํ๋ ๊ธฐ๋ฒ
์ต๊ทผ XSS๊ฐ ๋จ๊ณ ์๋ ์ด์ ์ค ํ๋๊ฐ ์ ์ ๋ณด์์ด ๊ฐํ๋๋ฉด์ server side ๊ณต๊ฒฉ์ด ์ด๋ ค์์ง๊ณ ์์
๋ฐฉํ๋ฒฝ, ์ํ์ด์ฝ๋ฉ, WAF ๋ฑ๋ฑ
๊ณต๊ฒฉ ์ ํ
- ํผ์ฑ : ์ ์์ ์ธ ์ฌ์ฉ์๊ฐ ์ ๋ํ ์ฌ์ดํธ๋ก ๋ฆฌ๋ค์ด๋ ์
- ์ ์ฑ์ฝ๋ ์ ํฌ : ๋์ฌ ์จ์ด ( Drive-by Download ) ์น ๋ธ๋ผ์ฐ์ ์ทจ์ฝ์ ์ ์ด์ฉํด ์ฌ์ฉ์ ๋ชฐ๋ ๋ค์ด๋ก๋ ์คํ
- ์น ๋ธ๋ผ์ฐ์ ๊ณต๊ฒฉ : ์ฌ์ฉ์์ ์น ๋ธ๋ผ์ฐ์ ๊ถํ, ( ์์น์ถ์ ๋ฑ ), ํค ๋ก๊น , ์ฌํ ๊ณตํ ๊ธฐ๋ฒ
- ์ธ์ ํ์ด์ฌํน : ์ธ์ ํ์ทจ๋ฅผ ํตํด ์ฌ์ฉ์ ๊ณ์ ์ ๋ฌด๋จ์ผ๋ก ์ฌ์ฉ
- CSRF( ํฌ๋ก์ค ์ฌ์ดํธ ์์ฒญ ๋ณ์กฐ )
XSS๊ณต๊ฒฉ์ ์ฌ์ฉ์์ธก ๊ณต๊ฒฉ์ด๋ฉฐ, ๋จ์ํ ์๋จ
๋ชจ์ํดํน ์ง๋จ์ ํ ๋ ์๋ฒ ์นจํฌ ์๋๋ฆฌ์ค ๊ณํ
XSS๊ณต๊ฒฉ์ ์ ์ฝ์ฌํญ๊ณผ ๋๊ธฐ ์๊ฐ, ๋ถํ์ค์ฑ ๋ฑ์ด ์๊ธฐ ๋๋ฌธ์ ๋ง์ด ์ฌ์ฉ๋์ง๋ ์์
์ง๋จ์ ํ ๋ alert์ฐฝ๋ง ๋์์ฃผ๊ณ ๋ง์น๋ ๊ฒฝ์ฐ๊ฐ ๋ง์
XSS ๊ณต๊ฒฉ๋ ๋ค์ํ ๋ฐฉ๋ฒ
๊ณต๊ฒฉ ์๋ฆฌ๋ง ๋ค๋ฅผ ๋ฟ ๋ฐฉ๋ฒ์ ๊ฐ๋ค
๊ณต๊ฒฉ ๋ฐฉ๋ฒ ( ์ธ์ ํ์ด์ฌํน ) : <script> alert(document.cookie) </script>
DOM-based XSS : Document ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ๋จ์์ ์ด๋ฃจ์ด์ง๋ค.
Reflected based XSS : ๊ณต๊ฒฉ์ ๋ณด๋ด๊ณ ์๋ฒ์์ ํด๋น ์ ์ฑ ์คํฌ๋ฆฝํธ๊ฐ ๋์์จ๋ค
stored based XSS : ๋ฐ์ดํฐ ๋ฒ ์ด์ค ์์ ์ ์ฅ๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ถ๋ฌ์จ๋ค.
์ง๋จ์ ์ alert์ผ๋ก ํ๋๊ฐ ?
alert(๊ฒฝ๊ณ ์ฐฝ)์ด ๋ฌ๋ค == Script ์ ์ฉ์ด ๋๋ค.
DOM-based XSS
DOM : Document Object Model
์ ์ฑ์คํฌ๋ฆฝํธ๊ฐ ๋ด๊ธด URL์ ์ฌ์ฉ์ ์น ๋ธ๋ผ์ฐ์ ์์ ํธ์ถ์ด ๋๋ ๊ฒฝ์ฐ
์ ์ฑ ์คํฌ๋ฆฝํธ๊ฐ ๋ฐ์ ๋ ๊ฒฝ์ฐ ์ค์ ์๋ฒ์ธก์์ ํ์ด์ง๋ฅผ ๊ตฌ์ฑํ์ง ์๊ณ ,
==> Response์์ 'test' ๋ฌธ์๊ฐ ๊ฒ์๋์ง ์๋๋ค.
์น ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉ์ ์ ๋ ฅ๊ฐ์ ๋ฐ๋ผ ํ์ด์ง๋ฅผ ๊ตฌ์ฑํ๋ค.
==> ๋ฐ์ Response์์ ๋ฌธ์์ด์ ๊ทธ๋๋ก ์ ๋ ฅ์ด ๋์ด ์ฌ์ฉ์ ์ธก์์ ๊ณ์ฐํ๊ณ ์ถ๋ ฅํ๋ค.
<script>
function searchKeywordPrint(keyword) {
var result1 = "<div class=\"panel panel-default\"><div class=\"panel-body\">\"" + keyword + "\"์ ๋ํ ๊ฒ์ ๊ฒฐ๊ณผ ์
๋๋ค.</div></div>";
document.getElementById('searchResult1').innerHTML = result1;
var result2 = "<div class=\"alert alert-warning alert-dismissible\" role=\"alert\"><button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-label=\"Close\"><span aria-hidden=\"true\">×</span></button><strong>Warning!</strong> ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค.</div>";
document.getElementById('searchResult2').innerHTML = result2;
}
var keyword = (new URLSearchParams(window.location.search)).get('keyword');
if(keyword) {
searchKeywordPrint(keyword);
}
</script>
<!-- jQuery (๋ถํธ์คํธ๋ฉ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ฌ๊ทธ์ธ์ ์ํด ํ์ํฉ๋๋ค) -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<!-- ๋ชจ๋ ์ปดํ์ผ๋ ํ๋ฌ๊ทธ์ธ์ ํฌํจํฉ๋๋ค (์๋), ์ํ์ง ์๋๋ค๋ฉด ํ์ํ ๊ฐ๊ฐ์ ํ์ผ์ ํฌํจํ์ธ์ -->
<script src="./js/bootstrap.min.js"></script>
<script> alert ( "์คํฌ๋ฆฝํธ ์ถ๋ ฅ์
๋๋ค." ) </script> # ๋์ํ์ง ์๋๋ค
# HTML5 ์ด์ ๋ฒ์ ๋ถํฐ Document ๊ฐ์ฒด์์ ์คํฌ๋ฆฝํธ ํ๊ทธ ์ฌ์ฉ ๊ธ์ง๋ผ์ ๋์ํ์ง ์์
<img src=# onerror=alert('XSS๊ณต๊ฒฉ์
๋๋ค')> # ๋์ํ๋ค
<img src=# onerror=alert(document.cookie)>
<img src=# onerror=location.href='../board/view.php?idx=8'>
Reflected based XSS
์๋ฒ์ธก์์ ์ฌ์ฉ์ ์ ๋ ฅ๊ฐ์ ํตํด์ ๊ตฌ์ฑ
์๋ฒ์์ ๋ณ์๋ฅผ ๋ฐ์์จ ๋ค์ ์ฐ์ฐ์ ํ์ฌ ํด๋ผ์ด์ธํธ์๊ฒ ๊ฒฐ๊ณผ๊ฐ์ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ ์ด์ฉ
<script>alert('XSS ๊ณต๊ฒฉ์
๋๋ค.')</script>
Stored Based XSS
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ ์ฅ์์ผ์ ๋ถ๋ฌ์ค๋ ๋ฐฉ์
์ถ๋ ฅ ํฌ์ง์ ํ์ธํ๊ธฐ
'๐ Secure' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
XSS ์ฐํ ๊ณต๊ฒฉ (0) | 2022.07.14 |
---|---|
XSS ๊ณต๊ฒฉ ํ๋ก์ธ์ค (0) | 2022.07.13 |
Secure coding (0) | 2022.07.12 |
SQL Injection ์ค์ต (0) | 2022.07.08 |
CODE Injection (0) | 2022.07.07 |
๋น์ ์ด ์ข์ํ ๋งํ ์ฝํ ์ธ
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค