Webエンジニアの雄大です。
今回もクロスサイトスクリプティングのお話。
ユーザ入力値をHTMLタグの属性値として画面に出力するときの対処方法は2つあるとされています。
・必ず入力値をダブルクォーテーション「””」で囲う。
・ダブルクォーテーションをHTMLエンコードをする。
ダブルクォーテーションで囲っていないとはつまり、value=○○という意味です。
本来であれば
value=”○○”とくくるべきです。
以下はダブルクォーテーションで囲っていないので、攻撃されてしまう例です。
notquote.php
<?php session_start(); if(!isset($_GET['p'])){ $_GET['p'] = ""; } ?> <html> <head> <title>引用符なし</title> </head> <body> <form action="notquote.php" method="GET"> <input type=input name="p" value="<?php echo $_GET['p']; ?>"> <input type="submit" value="submit"> </form> </body> </html>
注:value=<?php echo $_GET[‘p’]; ?>と、今回のサンプルはしてください。クオーテーションで囲わないと、なぜかwordpress上では表示ができないという現象がおきていたので…。
今回はURLに直接パラメータを指定してあげます。
notquote.php?p=test+onmouseover%3dalert(document.cookie)
テキストボックスにカーソルを合わせると、sessionidが表示されます。
上記のパラメータの意味は
「+」はスペース
「%3d」は=
を表しているので、
<input type=input name=”p” value=1 onmouseover=alert(document.cookie)>
という意味になります。
仮にダブルクォーテーションでくくった場合は
<input type=input name=”p” value=”1 onmouseover=alert(document.cookie)”>
となり、1 onmouseover=alert(document.cookie)が一つの値として見なされます。
P.S
ちなみにテキストボックスに
test+onmouseover%3dalert(document.cookie)を入力して、submitしても、アラートはなりません。
それは、フォームを使用して<form method=”GET”>のようにした場合には
自動的にURLエンコードされるからです。
参考本
【送料無料選択可!】体系的に学ぶ安全なWebアプリケーションの作… |
コメント