SSRF漏洞原理
SSRF漏洞通常是因为服务端应用程序提供了从其他服务器获取数据的功能,但未对目标地址或协议进行适当的过滤和限制。攻击者可以通过这个漏洞发送构造好的恶意请求,让服务器以自己的身份去访问其他资源,与文件包含漏洞有些许相似
SSRF漏洞利用
SSRF漏洞包括危害:
- 获取内部系统信息
- 攻击内网资源
- 伪造身份进行非法操作
- 利用特定协议(如dict、file、http等)进行更深入的攻击
易受影响的函数
函数名称 | 描述 | 用途 | 易受SSRF影响的原因 | 防御措施 |
---|---|---|---|---|
curl | cURL库的PHP接口 | 发送HTTP请求 | 用户可以输入URL,可能被用来访问内部网络 | 验证输入,使用白名单,限制协议 |
file_get_contents | 获取文件内容 | 从URL或文件路径读取数据 | 允许用户输入文件路径,可能被用来访问本地文件 | 验证输入,限制访问路径,使用白名单 |
外部资源引用流程图【AI】
+----------------+ +----------------+ +----------------+
| | | | | |
| 用户输入 +---->+ 验证输入 +---->+ 发送请求 |
| | | (检查URL/IP) | | (使用curl或 |
+----------------+ +----------------+ | file_get_contents)|
| | |
| (使用白名单) | |
+----------------+ |
|
v
+----------------+ +----------------+
| | | |
| 访问外部资源 +---->+ 返回结果 |
| | | |
+----------------+ +----------------+
SSRF实例【pikachu】
前端直接引用服务器资源
后端代码
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) ;
echo $RES;
}
运行逻辑
1.检查前端传递参数是否存在且不为空。存在且不为空的情况下执行if语句
if(isset($_GET['url']) && $_GET['url'] != null)
2.创建变量URL接收前端url参数的值
$URL = $_GET['url'];
3.初始化curl会话,用于设置其他选项和执行请求
$CH = curl_init($URL);
4.设置curl选项,关闭http头部信息的返回,只返回主体内容
curl_setopt($CH, CURLOPT_HEADER, FALSE);
5.设置curl选项,在请求时不验证目标网站的ssl证书信息
curl_setopt($CH, CURLOPT_SSL_VERIFYPEER, FALSE);
6.执行curl会话,发起请求并将响应内容赋值给变量&RES
$RES = curl_exec($CH);
6.关闭会话
curl_close($CH) ;
7.输出响应内容
echo $RES;
ssrf利用流程
根据源码分析,发现网站后台对请求并没有进行限制,且用户前端可对参数进行控制,产生了ssrf漏洞,
1.访问内网文件
payload:http://127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1/xxe.php
2. 伪协议读取本地文件
payload: http://127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=file:///c://windows//system.ini
3. 端口扫描
payload:?url=127.0.0.1:[端口号]
页面加载时间正常端口开启,异常端口关闭