簡介
SSRF,Server-Side Request Forgery,也就是服務器端請求偽造,是一種由攻擊者構造形成而由服務器端發起請求的一個安全漏洞。一般情況下,SSRF攻擊的目標是從外網無法訪問的內部系統。其目標是與服務器端相連的內部網絡。
其根本原因在於服務端提供了從其他服務器應用獲取數據的功能且沒有對地址和協議等做過濾和限制,導致網絡邊界被穿透。攻擊者常利用一個可以發起網絡請求的服務當作跳板來攻擊內部其他服務(訪問讀取內網文件、探測內網存活主機、掃描內網端口開放、攻擊內網其他應用),而這些服務或攻擊手段正常來說通過外部訪問不到的、無法利用的,即請求是由服務器端發起的。
SSRF在PHP中危害較大,比如常見的相關函數file_get_contents()、readfile()、curl_exec()、fopen()、fsockopen()
ssrf常用協議
-
file協議:在有回顯的情況下,利用file協議可以讀取任意文件的內容
-
dict協議:泄露安裝軟件版本信息,查看端口,操作內網redis服務等
-
gopher協議:gopher支持發出GET、POST請求,可以先截取get請求包和post請求包,再構造符合gopher協議的請求,gopher協議是ssrf利用中最強大的協議,可用於反彈shell
-
http/s協議:探測內網主機存活
在說協議之前有個東西非常重要,curl。curl是常用的命令行工具,用來請求web服務器,它的名字就是客戶端(client)的URL工具的意思。不帶有任何參數的時候,curl就是發出GET請求,例如curl https://www.example.com
file協議
主要是用於訪問本地計算機中的文件,利用它可以直接讀取系統文件,例如:ssrf.php?url=file:///etc/passwd
dict協議
dict://serverip:port/命令:參數
gopher協議
gopher協議是一個在http協議誕生之前用來訪問Internet資源的協議可以理解為http協議的前身或簡化版,雖然古老但現在很多庫都還支持gopher。
gopher協議允許數據包整合發送,用一條gopher協議命令就可以完成復雜的操作 。gopher://<host>:<port>/<gopher-path>
后接TCP數據流。
如傳遞curl gopher://192.168.25.203:9999/_hello%0alcx
對面會受到hello、lcx,注意:如果url訪問,需要再進行一次url編碼(其他的協議也是如此,不再復述)
GET 利用:
后台get.php:<?php echo "Hello".$_GET["name"]; ?>
數據包: GET /ssrf/base/get.php?name=Lcx HTTP/1.1
Host:192.168.25.203
利用
curl gopher://192.168.25.203:80/_GTE%20/ssrf/base/get.php%3fname=Lcx%20HTTP/1.1%0d%0AHost:%20192.168.25.203%0d%0a
POST利用:
后台post.php:<?php echo "Hello".$_GET["name"]; ?>
數據包:
POST /ssrf/base/post.php HTTP/1.1
host:192.168.25.203
Content-Type:application/x-www-form-urlencoded
Content-Length:8
name=Lcx
利用:
curl gopher://192.168.25.203:80/_POST%20/ssrf/base/post.php%20HTTP/1.1%0d%0AHost:192.168.25.203%0d%0AContent-Type:application/x-www-form-urlencoded%0d%0AContent-Length:8%0d%0A%0d%0Aname=Lcx%0d%0A
http/s協議
例如:
ssrf.php?url=http://192.168.25.203
注意與file協議的一些區別:file協議用於靜態讀取,而http/s可用於動態解析,file訪問的是服務器的一個靜態的文件,而http/s訪問的是服務器的html這種資源文件,即多了一個把訪問的機器當作http服務器,解析請求后再去訪問資源的過程。還有file不能跨域讀取的。
防御
-
限制允許的協議,通常只允許http/s協議
-
限制可請求的端口號
-
對IP進行白名單限制,如果請求的是內網IP可以看情況拒絕
-
禁止所有重定向請求或者在服務器端以五跳轉模式請求內容
-
對返回信息進行過濾,響應數據包如果存在類型不不符的直接干掉。
繞過
常規繞過思路
-
HTTP基本身份繞過
如果之限制了
http://www.lcx.com
可以加@繞過?url=http://www.lcx.com@www.baidu.com
實現對惡意地址的訪問
-
IP轉換繞過
如果對IP有限制,如127.0.0.1,可以嘗試以下方法去繞過
八進制:0177.0.0.1
十六進制:0x7F.0.0.1
十進制整數格式:2130706433
或者
http://localhost/ # localhost就是代指127.0.0.1
http://0/ # 0在window下代表0.0.0.0,而在liunx下代表127.0.0.1
http://[0:0:0:0:0:ffff:127.0.0.1]/ # 在liunx下可用,window測試了下不行
http://[::]:80/ # 在liunx下可用,window測試了下不行
http://127。0。0。1/ # 用中文句號繞過
http://①②⑦.⓪.⓪.①
http://127.1/
http://127.00000.00000.001/ # 0的數量多一點少一點都沒影響,最后還是會指向127.0.0.1
-
跳轉繞過
如果URL存在臨時302或者永久301跳轉,或許可以通過http/s跳轉利用那些協議。
-
DNS重綁定繞過
利用
打Redis
可以參考下面這篇博文:https://zhuanlan.zhihu.com/p/113396148
打mysql、ftp、fastcgi
文章參考