ssrf(Server-Side Request Forgery,服务器端请求伪造)
漏洞产生原因:由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据。
数据流:攻击者----->存在ssrf漏洞的服务器---->目标地址(目标服务器)
根据后台使用的函数的不同,对应的影响和利用方法又有不一样。PHP中下面函数的使用不当会导致SSRF漏洞:
file_get_contents()
fsockopen()
curl_exec()
1.SSRF(curl)
该漏洞使用了curl_exec()函数,存在的问题是前端传进来的url被后台使用curl_exec()进行了请求,然后将请求的结果又返回给了前端。
-
点击链接,进行访问,发现网址中出现了一个url参数。
-
修改url参数为目标地址,借助这个存在ssrf漏洞的服务器将目标地址的内容打印出来。该内容可以是一些敏感文件,端口等等。
测试目标网站的80端口,注意这里我为了方便,使用的是本机的ip,其实应该使用你想要攻击的服务器的ip。
curl支持很多协议,有FTP,FTPS,HTTP,HTTPS,GOPHER,TELNET,FILE,LOAD
2.SSRF(file_get_content)
该漏洞使用了file_get_contents()。该函数可以对本地和远程的文件进行读取。
-
点击链接,进行访问,发现网址中出现了一个file参数。
-
修改file参数为目标地址,借助这个存在ssrf漏洞的服务器将目标地址的内容打印出来。该内容可以是后端代码等等(只有使用file_get_content函数才可以打印后端代码)。
打印目标地址内容:
打印后端代码:php://filter/read=convert.base64-encode/resource=ssrf.php
最后将得到的内容进行base64解码即可得到ssrf.php的源码内容。
总结
防范措施:
如果一定要通过后台服务器远程去对用户指定(“或者预埋在前端的请求”)的地址进行资源请求,则请做好目标地址的过滤。