簡(jiǎn)介
SSRF即服務(wù)端請(qǐng)求偽造,利用漏洞偽造服務(wù)端發(fā)起請(qǐng)求,從而突破客戶(hù)端獲取不到數(shù)據(jù)的限制
形成的原因
服務(wù)端提供了從其他服務(wù)器獲取數(shù)據(jù)的功能且沒(méi)有對(duì)目標(biāo)地址做過(guò)濾和限制
場(chǎng)景
當(dāng)我們向一臺(tái)服務(wù)器發(fā)起請(qǐng)求的時(shí)候,我們把請(qǐng)求的地址改成了獲取與該服務(wù)器相連的內(nèi)網(wǎng)服務(wù)器資源的地址,從而可以獲取另一臺(tái)服務(wù)器上的數(shù)據(jù)
解決方案
協(xié)議的限制
當(dāng)請(qǐng)求方法允許其他協(xié)議的時(shí)候,可能利用file,ftp等協(xié)議進(jìn)行第三方服務(wù)利用來(lái)獲取權(quán)限
對(duì)URL的協(xié)議默認(rèn)只能允許http和https,當(dāng)然用戶(hù)可以根據(jù)自己的實(shí)際情況再補(bǔ)充一些允許訪(fǎng)問(wèn)的協(xié)議
IP限制
- 當(dāng)IP為內(nèi)網(wǎng)IP時(shí),默認(rèn)情況下是不允許訪(fǎng)問(wèn)的,通常將以下四個(gè)段設(shè)置為內(nèi)網(wǎng)IP段:
192.168.0.0 ~ 192.168.255.255
10.0.0.0 ~ 10.255.255.255
127.0.0.0 ~ 127.255.255.255
172.16.0.0 ~ 172.31.255.255
如何判斷一個(gè)IP地址是否屬于內(nèi)網(wǎng)IP段呢?眾所周知,IP地址是可以轉(zhuǎn)換成一個(gè)整數(shù)的,而且IP地址是和整數(shù)一一對(duì)應(yīng)的,我們判斷一個(gè)IP是否在一個(gè)IP段里面,只需將Ip段的起始值,目標(biāo)IP值全部轉(zhuǎn)換為整數(shù),然后比較大小即可。
- 利用這個(gè)理論還能解決另外一個(gè)問(wèn)題,假設(shè)此時(shí)有一個(gè)ip:10.0.0.1,它的八進(jìn)制形式為012.0.0.1,相應(yīng)的還有它的十六進(jìn)制,十進(jìn)制以及省略寫(xiě)法,請(qǐng)求012.0.0.1將相當(dāng)于請(qǐng)求10.0.0.1,所以?xún)H僅憑借IP字符串是否相同是不能做到有效的過(guò)濾的,為了解決這個(gè)問(wèn)題,采用了和上面一樣的解決辦法,將IP的各個(gè)形式轉(zhuǎn)換成一個(gè)整數(shù),比較整數(shù)是否相等判斷是否是同一個(gè)IP
在這里我調(diào)用了一個(gè)第三方的庫(kù)來(lái)實(shí)現(xiàn)這個(gè)功能。 - 設(shè)置白名單和黑名單驗(yàn)證:首先判斷該IP是否在黑名單中,不在直接訪(fǎng)問(wèn);在的話(huà)接著判斷是否在白名單中,在則允許訪(fǎng)問(wèn),否則不允許訪(fǎng)問(wèn)
域名限制
不能通過(guò)簡(jiǎn)單的將域名放到白名單黑名單中對(duì)比來(lái)判斷是不是允許訪(fǎng)問(wèn),我們需要首先將域名解析成ip,因?yàn)樵撚蛎壎ǖ腎P可能是一個(gè)惡意IP,然后再對(duì)IP進(jìn)行上述的判斷
URL跳轉(zhuǎn)
當(dāng)我們請(qǐng)求的目標(biāo)返回3xx狀態(tài)的時(shí)候,如果沒(méi)有禁止跳轉(zhuǎn)的設(shè)置,如果跳轉(zhuǎn)的地址是內(nèi)網(wǎng)地址,將會(huì)造成SSRF漏洞
對(duì)此有兩種解決辦法:
- 不允許目標(biāo)進(jìn)行跳轉(zhuǎn)
- 每跳轉(zhuǎn)一次就檢查新的HOST是否符合上面的驗(yàn)證規(guī)范
實(shí)現(xiàn)過(guò)程:
- 創(chuàng)建一個(gè)HttpURLConnection連接對(duì)象
- 使用這個(gè)對(duì)象創(chuàng)建一個(gè)URL連接,如果返回的狀態(tài)碼為3xx,說(shuō)明發(fā)生了重定向,再去返回的頭信息的location字段中找到要重定向的url
- 接著重復(fù)上述過(guò)程