XSS 사용해보기

주의사항



이 검증은 자신이 관리하는 가상 머신의 웹 서버에서 수행됩니다.
자신의 통제하에 있지 않은 서버의 공격 행위는 죄에 묻힐 수 있습니다.

개요



크로스 사이트 스크립팅 (이하 XSS)을 실제로 시도하고 철저히 이해하는 목적.
간단한 XSS가 성립하는 환경의 구축과 XSS의 실행입니다.

이 기사에서는 서버에서 수행하는 처리 내용과 XSS 방법에 대해 설명합니다.

환경



VirtualBox 6.0.2.0
우분투 18.04.4 LTS
아파치 2.4.29

XSS 시도해보기



웹 서버에 다음 페이지를 준비했습니다.


내용으로서는, 입력을 5개 받고 Perl의 스크립트에 값을 건네주는 느낌입니다.

실제로 값을 전달하면


↓ 페이지 천이


라는 느낌으로 날아간 페이지에서 입력 내용을 그대로 표시하는 다음과 같은 페이지입니다.
<html>
    <body>
        your input<br>
        1<br>
        2<br>
        3<br>
        4<br>
        5<br>
    </body>
</html>





여기에서 공격자로

시험에 <>'"\$ 등의 제어 문자를 입력해 보면


날아간 곳에서 그대로 표시되었습니다.
이것은 XSS가 될 것 같습니다!

시험에 다음 코드를 입력해보십시오.
이것은 곧바로 ayashii.html로 날아가는 처리입니다.
<script>
setTimeout("location.href='http://サーバのIPアドレス/ayashii.html'",1);
</script>

이 스크립트를 입력하면 다음과 같은 HTML 페이지가 표시됩니다.
<html>
    <body>
        your input<br>
        <script> 
            setTimeout("location.href='http://サーバのIPアドレス/ayashii.html'",1); 
        </script><br>
        2<br>
        3<br>
        4<br>
        5<br>
    </body>
</html>


위의 페이지에서 ayashii.html(下の画像)로 리디렉션됩니다.



수상한 처리가 이루어졌습니다.

왜 스크립트가 실행 되었습니까?



이번에 사용한 페이지에서는 입력된 내용을 그대로 HTML로 출력하는 처리가 이루어지고 있었습니다.

입력 내용에 스크립트가 입력되어 버린 것으로 그 부분도 포함하여 HTML 문장으로서 성립해 버렸군요.

대책으로서



입력되는 스크립트가 성립하지 않게 하면, 이 방법으로 임의의 스크립트가 실행할 수 없게 됩니다.

처리에서 <>'"\$ 등의 제어 문자를 다른 문자로 바꾸어 버리거나 원래 제어 문자의 입력을 금지하는 등의 대책을 생각할 수 있습니다.

오시마



저는 웹 페이지를 구현하고 XSS를 사용해 보았습니다.
이 예에서는 입력 한 사용자 만 스크립트에 영향을받습니다.
실제로 이 공격이 의미를 이루는 것은 여기의 코멘트란과 같이, 입력한 것이 다른 유저에게도 공개되는 것 같은 장소일 것입니다.
코멘트에 공격자가 사이트를 본 사람을 악의가 있는 페이지 유도하는 스크립트를 입력하는 것과 같은 이미지로.

XSS는 여기서 소개한 것 외에도 몇 가지 종류가 있는 것 같기 때문에 조사해 보는 것도 좋을지도 모릅니다.

부록



입력 페이지

input.html

<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title>入力フォーム</title>
    </head>

    <body>
        <form action="cgi-bin/cal.cgi" method="GET">
            <h3>5つの数値を入力</h3>
            <p>
            num1 : <input type="text" name="value1" size="10"><br>
            num2 : <input type="text" name="value2" size="10"><br>
            num3 : <input type="text" name="value3" size="10"><br>
            num4 : <input type="text" name="value4" size="10"><br>
            num5 : <input type="text" name="value5" size="10"><br>
            </p>
            <p>
            <input type="submit" value="OK"><input type="reset" value="reset">
            </p>
        </form>
    </body>
</html>



입력한 것을 출력하는 사람

cal.cgi
#!/usr/bin/perl
use CGI;
$q = new CGI;

$value1 = $q->param('value1');
$value2 = $q->param('value2');
$value3 = $q->param('value3');
$value4 = $q->param('value4');
$value5 = $q->param('value5');

print"Content-type: text/html\n\n";
print"<html><body>\n";
print"your input<br>";
print"$value1<br>";
print"$value2<br>";
print"$value3<br>";
print"$value4<br>";
print"$value5<br>";
print"</body></html>\n";
exit;

멍청한 사이트

ayashii.html

<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title>とても怪しいサイト</title>
    </head>

<style>

h1{
    color:red
}
</style>

    <body>
            <h1>なにかあやしい処理</h1>
    </body>
</html>

좋은 웹페이지 즐겨찾기