はじめに
先日セキュリティを題材にワークショップを受けてきたのでそのメモ。iOSのクライアント側の開発ばかりやってきた自分にとって新鮮で面白い内容でした。講義の内容はXSSやSQLインジェクション、CSRFの脆弱性などでとりあえずXSSの初歩についてまとめてみる。
XSSとは
ネットワークを通じた攻撃手法の一つで、保安上の弱点(脆弱性)のあるWebサイトを踏み台に、悪意のあるプログラムをそのサイトの訪問者に送り込む手法。また、そのような攻撃に利用される脆弱性のこと
[クロスサイトスクリプティングとは 【 XSS 】 【 Cross Site Scripting 】 - 意味/解説/説明/定義 : IT用語辞典]
(http://e-words.jp/w/E382AFE383ADE382B9E382B5E382A4E38388E382B9E382AFE383AAE38397E38386E382A3E383B3E382B0.html)
初めてのXSS
http://localhost:8888/enquiry-form.php?msg=aaaa
上記のようにURLのmsgを受け取って
<dd>
<textarea style="width: 300px; height: 300px;">
aaaa
</textarea>
</dd>
このようにhtmlを表示するとき
<dd>
<textarea style="width: 300px; height: 300px;">
<?php print isset($_GET['msg']) ? $_GET['msg'] : '' ?>
</textarea>
</dd>
とphpが記述されていた場合、以下のようなURLでscriptを実行することができる。
http://localhost:8888/enquiry-form.php?msg=</textarea></dd><script>alert(document.cookie)</script>
これで簡単にcookieが取得できてしまう。
例えば攻撃者が誰かにこのようなURLを踏ませてcookieを送信させればcookieをゲットできてしまう。
対処法としてphp部分を以下のように変更することで解決できる。
<dd>
<textarea style="width: 300px; height: 300px;">
<?php print htmlspecialchars(isset($_GET["msg"]) ? $_GET["msg"]: '')?>
</textarea>
</dd>
ここで使っているのがhtmlspecialchars関数で以下のような特徴を持つ。
htmlspecialchars関数とは
HTMLには特殊な意味(役割)を持っている文字(特殊文字)があり、その文字をHTMLでの意味(役割)としてではなく、ただの文字(見た目は記号)として表示する(させる)ために文字参照値(という言い方が正しいかどうかは分からないが)に置き換える機能を持つ関数。
フォームなどでユーザー(他者)からの悪意ある入力を無害化するのに用いられ、安全性を高めるためにも指定しておくことが望ましい。
htmlspecialchars関数
これでさっきのscriptは無効化できる。
楽しい٩( 'ω' )و