1.什么是SSRF漏洞?这个网站漏洞的原理是啥?
SSRF(Server-Side Request Forgery:服务器端请求伪造)
其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制
导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据
数据流:攻击者----->服务器---->目标地址
服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。
大部分的web服务器架构中,web服务器自身都可以访问互联网和服务器所在的内网
2.为什么会产生这个漏洞被黑客攻击?最直接的原因是啥?
PHP参数使用不当
PHP中下面函数的使用不当会导致SSRF:
file_get_contents()
fsockopen()
curl_exec()
3.怎么发现这个漏洞?怎么去验证漏洞是否存在?怎么利用这个漏洞?
一. WEB功能上查找
二. 从URL关键字中寻找
Share、wap、url、link、src、source、target、u、3g、display、sourceURL、imageURL、domain
目标:
http://lzctf.thecat.top/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1/vul/vul/ssrf/ssrf_info/info1.php
- 首先判断请求是否由服务端发起,右键资源地址在新窗口打开如果url为
http://127.0.0.1/vul/vul/ssrf/ssrf_info/info1.php
那么说明不存在SSRF。 通过BURP抓包,数据包中包含
GET /vul/ssrf/ssrf_curl.php?url=http://127.0.0.1/vul/vul/ssrf/ssrf_info/info1.php HTTP/1.1
由于是服务端发起的请求,那么在加载这张图片的时候本地浏览器中不应该存在该资源的请求。
- 在验证完是由服务端发起的请求之后,此处就有可能存在SSRF,接下来需要验证此URL是否可以请求我们构造的Payload。
- 端口探测:thecat.top/xxx.php?url:22 探测22端口是否开放。
4.漏洞利用的首要条件是啥?漏洞危害的范围?漏洞导致的危害有多大?
SSRF可以做什么
- 可以对外网服务器所在的内网、本地进行端口扫描,获取一些服务的banner信息 。
- 攻击运行在内网或者本地的应用程序。
- 对内网web应用进行指纹识别,通过访问默认文件实现 。
- 攻击内外网的web应用。sql注入、struct2、redis等。
- 利用file协议读取本地文件等。
5.如果在甲方公司出现漏洞问题,公司站点受到此攻击,我应该如何快速定位到问题进行修复防止被入侵?
- 统一错误信息,避免用户可以根据错误信息来判断远程服务器端口状态
- 限制请求的端口为HTTP常用的端口,比如 80,443,8080,8088等
- 黑名单内网IP。
- 禁用不需要的协议,仅仅允许HTTP和HTTPS.
6.如何提前防范这个漏洞?如何做好加固?
如果一定要通过后台服务器远程去对用户指定("或者预埋在前端的请求")的地址进行资源请求,则请做好目标地址的过滤。
7.代码分析
//payload:
//file:///etc/passwd 读取文件
//http://192.168.1.15:22 根据banner返回,错误提示,时间延迟扫描端口
if(isset($_GET['url']) && $_GET['url'] != null){
//接收前端URL没问题,但是要做好过滤,如果不做过滤,就会导致SSRF
$URL = $_GET['url'];
$CH = curl_init($URL);
curl_setopt($CH, CURLOPT_HEADER, FALSE);
curl_setopt($CH, CURLOPT_SSL_VERIFYPEER, FALSE);
$RES = curl_exec($CH);
curl_close($CH) ;
//ssrf的问是:前端传进来的url被后台使用curl_exec()进行了请求,然后将请求的结果又返回给了前端。
//除了http/https外,curl还支持一些其他的协议curl --version 可以查看其支持的协议,telnet
//curl支持很多协议,有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDAP
echo $RES;
}