引用符で囲まない属性値のクロスサイトスクリプティングのサンプルを作ってみた。

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=inputname="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エンコードされるからです。

参考本

コメント

タイトルとURLをコピーしました