從經典案例學習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跳轉的方式繞過檢測。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章