SSRF漏洞
1、SSRF的概念
SSRF(服务器端请求伪造英文缩写)主要指攻击者利用服务端构造恶意请求,利用服务器作为代理访问内网或其他受限资源。
2、SSRF漏洞的成因
SSRF漏洞形成的原因:主要是因为服务端提供了从其他服务器应用获取数据的功能,然后服务端又未对用户输入的URL进行严格的过滤和验证,导致攻击者可以控制服务器发起任意HTTP请求。(能对外网发起网络请求就有可能存在SSRF漏洞)
典型的场景有:
网页内容抓取(如RSS订阅、URL预览)
文件下载功能(如通过URL下载图片或文档或源代码)
代理服务(如转发表单数据到第三方)
3、SSRF漏洞的危害
内网渗透:可以通过SSRF访问内网敏感服务(如数据库)
云环境风险:攻击者可以访问云服务元数据接口(如AWS/azure)
文件读取:可以利用 file:// 协议协议读取服务器本地文件 (如 /etc/passwd)
4、SSRF漏洞的攻击方式
1、对外网、服务器所在内网、本地 进行端口扫描(获取一些服务的banner信息)
2、攻击运行在内网或本地的应用程序 (如溢出)
3、攻击内外网的web应用,主要使用get参数就可以实现攻击(如sqli、struts2)
4、对内网web应用进行指纹识别,通过访问默认文件实现(就是通过访问一些常见的默认文件或路径来确定内网 Web 应用的类型和版本)
5、利用 file:// 协议读取本地文件
攻击手法
绕过内网IP限制
利用URl解析歧义(如PHP的 parse_url() 函数会解析 host=jd.com ,但实际请求的是127.0.0.1)
特殊IP格式:八进制IP(0177.0.0.1
)或十六进制IP(0x7f000001
)
访问元数据服务
攻击者可以获取云服务器的 IAM 角色、临时密钥等
结合Redis反弹shell
通过 SSRF 访问内网 Redis 服务,写入恶意命令实现反弹 Shell
5、实操
今日靶场:
NSSCTF
[NSSRound#28 Team]ez_ssrf
$host = parse_url($url, PHP_URL_HOST);
使用 parse_url 函数解析 $url 并提取主机部分,赋值给变量 $host ;
gethostbyname()函数将主机名解析为ip地址,赋值给变量 $ip;
禁止访问的ip地址列表包含 127.0.0.1 和 ::1(IPv6的本地回环地址),如果包含就报错;
初始化一个 cURL 会话,并设置目标 URL 为 $url;
设置 CURLOPT_RETURNTRANSFER
为 true
,使 cURL 将返回的数据作为字符串返回,而不是直接输出;
执行 cURL 会话,将结果存储在 $response
中;
if (curl_errno($ch)) {
echo json_encode(["error" => curl_error($ch)]);
} else {
echo $response;
}
剩下就是检查cURL是否发生错误,没有就输出请求响应内容
所以需要用url作为参数,以 http:// 开头构造请求,让服务器访问本地的 /flag 路由就能拿到flag。
那本地的ip无疑就是 127.0.0.1 但其为黑名单,无法直接用
那么可以利用域名解析的一些特性,例如使用 0.0.0.0 来代替 127.0.0.1,在某些网络配置中,0.0.0.0 可能被解析为 127.0.0.1 即可能被解析为服务器的本地网络接口,从而允许访问内网资源
然后接上 /flag 即可得到想要的信息
[NISACTF 2022]easyssrf
我上来就输了个 flag 结果得到了提示
直接 fl4g 是不行的,都害羞上了
回去看到题目知识点提示php伪协议
那就用伪协议读取一下 /fl4g
file:///fl4g
注意这里为什么是3个/
(因为 file:// 是一个协议前缀,用于告诉PHP你想要访问的是本地文件系统。而 file:// 之后,路径的解析规则与URL类似,在URL中,路径通常以 / 开头,表示根目录。)
又得到提示
然后一访问,得到代码
看出来是文件包含了,直接用 file 读取flag即可
[HNCTF 2022 WEEK2]ez_ssrf
进来就是Apache服务器的貌似是配置信息页面还是什么
注意到提示让我们访问 index.php
访问后又得到一串代码