ssrf
SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。
翻译翻译就是通过服务端打内网就是
ssrf
伪协议思路
在不同的服务中支持的伪协议类型是不一样的
在PHP中支持的伪协议
1 >file dict sftp ldap tftp gopher在JAVA中支持的伪协议
1 >file ftp mailto http https jar netdoc
file
如果是linux
服务器,并且可能存在ssrf
漏洞,就可以尝试开始内网横向
1 | file:///etc/passwd 尝试读取文件passwd |
可以使用burp去使用http协议去访问内网的其他主机,基于部分的arp表,建立80通信以前一定会先尝试使用arp去获取内网地址,从而达成记录arp信息的操作
需要注意的是,可能内网设置了防火墙限制,可能限制了
arp
协议,会导致记录的所有mac地址都是网关的mac地址
dict
dict
协议是用来提供字典查询服务的,默认端口 2628
dict
协议比较灵活允许自定义IP和端口和CRLF注入(换行符之类)
dict
协议比较小众,容易在设置黑名单的过滤中绕过
- 服务器配置:
- 应用层过滤:若服务端未对目标IP进行内网限制,或过滤逻辑不严谨(如仅检查
http
协议),dict
协议可能绕过限制。- 网络层限制:即使应用允许请求,服务器的防火墙或出站规则可能阻止对外部特定端口(如非标准端口)的连接。
- 协议兼容性:
dict
协议基于TCP,若目标服务(如HTTP、Redis)运行在TCP端口且未验证协议格式,可能返回banner信息或执行命令(需构造有效载荷)。- 例如,连接到Redis的6379端口并发送命令可能触发漏洞,但需通过CRLF注入等方式适配目标协议。
- 响应处理:
- 即使连接成功,服务端对
dict
响应的处理方式可能影响信息泄露效果(如解析HTTP响应为字典数据)。
sftp
SFTP
要求客户端用户必须由服务器进行身份验证,
并且数据传输必须通过安全通道(SSH
)进行,即不传输明文密码或文件数据。
是SSH
协议的一部分,是一种远程登录信息
gopher
协议 很重要的伪协议
重要与可以提交
POST
请求,可以用来替代http
伪协议无法处理的事情
gopher
默认端口为70, 进行ssrf
渗透测试的时候注意修改端口为80或者对应端口
gopher
转发默认不发送一个字符(会被吃掉)
GET
注意端口号和填充值
直接发送数据
1
curl gopher://127.0.0.1/nihoaxiaozhu
监听端会在70端口收到
ihaoxiaozhu
,第一个会被吞掉,需要对方收到完整的东西需要发送1
curl gopher://127.0.0.1/_nihoaxiaozhu
使用
ssrf
具有
ssrf
漏洞的页面发送复制这个头, 保留
GET
和Host
的信息,注意一定要留着一个换行,然后对以下进行url编码, 注意必须连同换行一块编码1
2
3GET / HTTP/1.1
Host: tryoneclick.art:355651
GET%20/%20HTTP/1.1%0D%0AHost:%20tryoneclick.art:35565%0D%0A
但是拼接上去的时候需要在前面加个
_
,用来被吞掉gopher://targetip:80/_GET%20/%20HTTP/1.1%0D%0AHost:%20tryoneclick.art:35565%0D%0A
如果是存在ssrf
漏洞的页面是通过POST
来进行渗透的,也可以在burp
中编辑gopher
信息
需要注意的是,这个是在浏览器中填写的,如果是在burpsuite
中抓包得到的, 需要对这个url
信息进行再次的url
编码(总共对这个头信息编码两次)
也就是发送的对上述的gopher://targetip:80/_
后面的内容进行再一次url
编码
1 | gopher%3A%2F%2Ftargetip%3A80%2F%5FGET%2520%2F%2520HTTP%2F1%2E1%250D%250AHost%3A%2520tryoneclick%2Eart%3A35565%250D%250A |
两次url编码这是由于发送到ssrf
服务器的时候会做一次解码,ssrf
发送到目标内网服务器的时候会在做一次解码