注意事項
この検証は自身の管理下にある仮想マシン上のWebサーバで行っているものです.
自身の管理下にないサーバの攻撃行為は罪に問われる可能性があります。
概要
クロスサイトスクリプティング(以下XSS)を実際に試してざっくり理解する目的.
簡単なXSSが成り立つ環境の構築とXSSの実行です.
本記事ではサーバで行っている処理の内容とXSSの方法について記します.
環境
VirtualBox 6.0.2.0
Ubuntu 18.04.4 LTS
Apache 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文章として成立してしまったのですね.
対策として
入力されるスクリプトが成立しないようにしてしまえば,この方法で任意のスクリプトが実行することができないようになります.
処理で,<>'"\$
などの制御文字を別の文字に置き換えてしまう もしくは そもそも制御文字の入力を禁止する などの対策が考えられます.
おしまい
雑にWebページを実装してXSSを試してみました.
この例では,入力したユーザのみがスクリプトを影響を受けるようになっています.
実際にこの攻撃が意味を成すのはここのコメント欄のような,入力したものが他のユーザにも公開されるような場所でしょう.
コメントに攻撃者がサイトを見た人を悪意のあるページ誘導するようなスクリプトを入力するというようなイメージで.
XSS はここで紹介したもののほかにもいくつか種類があるようなので調べてみるのも良いかもしれません.
付録
入力用ページ
<!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>
入力されたものを出力するやつ
#!/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;
あやしいサイト
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>とても怪しいサイト</title>
</head>
<style>
h1{
color:red
}
</style>
<body>
<h1>なにかあやしい処理</h1>
</body>
</html>