從經典案例學習SSRF漏洞的產生原因和修復方法


案例一:Discuz論壇SSRF漏洞

復現版本:Discuz! X3.1 Release 20150609

discuz有一個下載遠程圖片的ajax接口,該接口對用戶傳入的圖片URL校驗不嚴格導致SSRF漏洞。

將遠程圖片的URL構造為:http://45.xx.xx.60:8080/ssrf.php?765.jpg,當網站服務器訪問ssrf.php時被302重定向到內網服務器,從而導致SSRF漏洞。

漏洞證明

漏洞觸發點在/source/module/forum/forum_ajax.php文件中,開發者使用dfsockopen()函數加載遠程圖片,但沒有對圖片URL嚴格檢查。

dfsockopen()函數優先使用curl庫加載圖片,並且設置了CURLOPT_FOLLOWLOCATION,可利用http 302跳轉繞過“http://”前綴限制。

修復方法

1、取消curl的CURLOPT_FOLLOWLOCATION選項,禁止302跳轉。

2、利用curl加載圖片前對URL進行嚴格判斷,具體來說就是先利用parse_url()函數解析圖片URL,然后判斷是否是http協議或https協議,如果不是這兩種被允許的協議則終止程序;再判斷URL中域名部分是IP形式還是域名形式,如果是IP形式,則不允許內網IP;如果是域名,則通過gethostbyname()函數獲取DNS解析記錄,然后判斷DNS解析記錄是否是內網IP。最后在設置CURLOPT_URL時要優先設置成IP形式的URL,並且要把http請求頭中的Host字段設置為剛才parse_url()函數解析出來的host,這樣可以避免DNS重綁定(DNS ReBinding)攻擊。

3、限制http協議和https協議的端口,如:只允許80、443、8080等端口。

 

案例二:UEditor編輯器SSRF漏洞

復現版本UEditor 1.4.3 JSP版

UEditor有個catchimage的接口,通過這個接口可下載遠程圖片,但開發者沒有對用戶傳入的圖片URL進行嚴格檢查導致SSRF漏洞。

漏洞證明

漏洞觸發的入口在\src\com\baidu\ueditor\ActionEnter.java文件中,當action=catchimage時開始捕獲遠程圖片。

list是用戶傳入的圖片URL,capture()方法實際上是調用了captureRemoteData()方法,具體代碼如下:

開發者先用validHost()方法檢測圖片URL中的host是否合法,然后再通過HttpURLConnection加載URL,validHost()方法具體代碼如下:

validHost()方法只判斷hostname是否是127.0.0.1、localhost或img.baidu.com,如果不是這三者則返回true。

此處對圖片URL的檢測過於寬松,可對內網192.168.x.x網段、172.16.x.x網段等進行信息刺探。

修復方法

在UEditor 1.4.3.1版本中開發者修改了validHost()方法,加強了對圖片URL的檢測,但可通過http 302跳轉的方式繞過檢測。

 

 


免責聲明!

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



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