文章目录
前言
这次来介绍WEB漏洞的其中一种类型SSRF,文章将通过讲述其原理、如何挖掘以及怎么利用,包括如何防御和绕过,并且提供靶场来举例说明,详情请往下看。
一、SSRF原理
SSRF-服务器请求伪造
SSRF(Server-Side Request Forgery:服务器端请求伪造)是指攻击者能够从易受攻击的Web应用程序发送精心设计的请求的对其他网络进行攻击。
一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。
利用一个可以发起网络请求的服务,当做跳板来攻击其他服务
简单来说就是:
A让B帮忙访问C,如果是在B是不知情的情况下呢?
SSRF成因
SSRF形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。ssrf是利用存在缺陷的web应用作为代理去攻击远程和本地的服务器。
也就是说,对于为服务器提供服务的其他应用没有对访问进行限制,如果构造号适当的访问包,那我就有可能利用目标对他的其他服务器应用进行调用。
举例
假设有一个服务员(服务端),在一家餐厅为顾客(其他应用)提供服务,这名服务员十分友好,无论顾客提出什么请求,他都会想办法为其提供服务(从其他服务器应用中取回 ),但他并没有核实顾客到底需要什么,只要顾客说了,就会为顾客取回。此时,来了一个坏心眼的顾客(hacker),利用这个友好的服务员,帮他取回一些不该取的东西,甚至还攻击其他地方的东西。
比如:A网站,是一个所有人都可以访问的外网网站,B网站时一个他们内部的OA网站。所以,我们普通用户只可以访问A网站,不能访问B网站。但是我们可以通过A网站做中间人,访问B网站,从而达到攻击B网站需求。
用户正常访问网站的流程是什么?
正常用户访问网站的流程是:
输入网址URL–> 发送请求 --> 服务器接受请求(没有过滤),并处理 --> 返回用户
例如:
网站请求是www.baidu.com/xxx.php?image=www.abc.com/1.png
那么产生SSRF漏洞的环节在哪里呢?
我们让网站a去访问网站b
服务器端的验证并没有对其请求获取图片的参数(image=)做出严格的过滤以及限制,导致A网站可以从其他服务器的获取数据
如果我们将www.baidu.com/xxx.php?image=www.abc.com换为与该服务器相连的内容服务器地址会产生什么效果呢?
例如:www.baidu.com/xxx.php?127.0.0.1/1.php
终极解析:
SSRF漏洞就是通过篡改获取资源的请求发送给服务器
但是服务器并没有检查这个请求是否合法的,然后服务器以他的身份来访问其他服务器的资源。
PHP中下面函数的使用不当会导致SSRF
file_get_contents()——从用户指定的url获取内容,然后指定一个文件保存并展示给用户,另外还有一个file_put_contents()函数
fsockopen()——对用户所指定的数据的获取
curl_exec()——执行curl的会话,发送请求并获取响应的数据
这些函数可以通过网络协议访问目标服务器上的资源
curl_exec()
可以使用该漏洞对网站服务器同一网段的其他服务器进行探测
file_get_contents
file_get_contents函数可以读取本地和远程的文件,支持多种协议,如ftp,http,https还可以读取php源码,
如:php://filter/read=convert.base64-encode/resource=ssrf.php,可以将后台当前目录下的ssrf.php文件的bs64编码返回。
SSRF危害
如果一定要通过后台服务器远程去对用户指定或者预埋在前端的请求的地址进行资源请求则请做好目标地址的过滤,没有处理号的将导致:
1.可以对服务器所在内网、本地进行端口扫描,获取一些服务的信息等
2.目标网站本地敏感数据的读取(利用协议)
3.内外网主机应用程序漏洞的利用
4.内外网Web站点漏洞的利用
二、SSRF的挖掘
2.1 从WEB功能上寻找
2.1.1 分享
一些分享应用中,为了更好的提供用户体验,Web应用在分享功能中,通常会获取目标地址网页内容中<title></title>
标签的文本内容 作为显示以提供更好的用户体验。如果在此功能中没有对目标地址的范围做过滤与限制则存在SSRF漏洞。
http://widget.renren.com/*****?resourceUrl=https://www.sobug.com
通过目标URL地址获取了title标签和相关文本内容。二如果在此功能中没有对目标地址的范围做过滤与限制则存在着SSRF漏洞。
从国内某漏洞提交平台上提交的SSRF漏洞,可以发现包括淘宝、百度、新浪等国内知名公司都曾被发现过分
享功能上存在SSRF的漏洞问题。
2.1.2 在线翻译
翻译网站替我们访问需要翻译的站点,然后进行翻译,所以当翻译网站没有对输入的地址做任何过滤时,内网就可能被访问到。
通过URL地址翻译对应文本的内容。
2.1.3 图片加载与下载
加载远程图片地址此功能用到的地方很多,很大可能造成SSRF问题
比如编辑器处,就会有远程文件加载。某些地方会进行远程加载头像,例如:http://www.xxxx.com/image?url=http://www.image.com/1.jpg
2.1.4 转码服务
通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览。
由于手机屏幕大小的关系,直接浏览网页内容的时候会造成许多不便,这时有些网站就通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览的样式。例如百度、腾讯、搜狗等公司都有提供在线转码服务
2.1.5 未公开的API(应用程序编程接口)
实现以及其他调用URL的功能等,此处类似的功能有360提供的网站评分,以及有些网站通过应用程序编程获取远程地址文件来加载内容。
SSRF通过远程加载来实现攻击
一起要你输入网址的地方和可以输入ip的地方,都是ssrf的天下。
2.2 从URL关键字中寻找
在对功能上存在SSRF漏洞中URL地址特征的观察,通过收集,大致有以下关键字:
如果利用google语法加上这些关键字去寻找SSRF漏洞,耐心的验证,限制还是可以找到存在SSRF漏洞
一切要你输入网址的地方可以输入ip的地方,都是ssrf的天下
2.3 总结
社交分享功能:获取超链接的标题等内容进行显示
转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
在线翻译:给网址翻译对应网页的内容
图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片
云服务厂商:它会远程执行一些命令来判断网址是否存活等,所以如果可以捕获相应的信息,就可以进行ssrf测试
编码处理:
可以利用google语法加上这些关键字寻找SSRF漏洞。
从远程服务器请求资源----》找SSRF
三、SSRF具体利用
ssrf常利用的相关协议
http://:探测内网主机存活、端口开放情况
gopher://:发送GET或POST请求;攻击内网应用
dict://:泄露安装软件版本信息,查看端口,操作内网远程访问等
file://:读取本地文件
3.1 内网访问
使用http协议对内网的Web应用进行访问
?url=http://127.0.0.1/flag.php
CTFhub例题:题目要求访问127.0.0.1的flag.php,直接拼接进行访问即可得到flag。
3.2 伪协议读取文件
php伪协议
PHP支持的伪协议
- file:// —— 访问本地文件系统
- http:// —— 访问HTTP(s)网址
- ftp:// —— 访问FTP(s)URLs
- php:// —— 访问各个输入/输出流(I/O streams)
- zlib:// —— 压缩流
- data:// —— 数据(RFC 2397)
- glob:// —— 查找匹配的文件路径模式
- phar:// —— PHP归档
- ssh2:// ——Secure Shell 2
- rar:// —— RAR
- ogg:// —— 音频流
- expect:// —— 处理交换式的流
尝试读取web目录下的flag.php,web目录下的文件,一般网站的目录都放在/var/www/html/目录下
?url=file:///var/www/html/flag.php
页面显示???后,查看网页源代码即可看到flag
3.3 端口扫描
在SSRF中,dict协议与http协议可以用来探测内网主机存活于端口开放情况、和指纹信息。
?url=dict://127.0.0.1:8000
?url=http://127.0.0.1:8080
dict协议时一个在线网络字段协议,这个协议时用来架设一个字段服务的。允许客户端在使用过程中访问更多字典。Dict服务器和客户机使用TCP端口2628。不过用的比较少,所以网上基本没啥资料(包括谷歌上)
题目提示端口扫描,抓包,返回的状态码是200
url=127.0.0.1:8000
题目又提示端口的范围是8000-9000,那我们就使用bp攻击模块
开始攻击,然后访问这个端口,得到flag
请求不存在的服务器或未开放的端口,会返回以下信息,可以哦通过返回的状态信息不同,来判断对应端口开放的状态。
pikachu靶场练习
- 访问外网:
?url=www.baidu.com- 通过file协议读取文件:
?url=file:///C:/WINDOWS/win.ini- 使用dict协议查看端口:
?url=dict://127.0.0.1:80- 使用php伪协议:查看ssrf.php源码
…/ssrf_fgc.php?file=php://filter/read=convert.base64-encode/resource=ssrf_fgc.php
SSRF具体验证
排除法
例如:对疑似有SSRF漏洞的地方(允许输入网址、ip的地方),要验证是否存在SSRF漏洞,可以首先请求外网,比如:http://read.******.com/image?image=http://www.baidu.com/img/bd_logo1.png
你可以直接右键图片,在新窗口打开图片,如果是浏览器上URL地址栏是http://www.baidu.com/img/bd_logo1.png,说明不存在SSRF漏洞。
排除法2
你可以使用bp等抓包攻击来判断是否是SSRF,首先SSRF是由服务端发起的请求,因此在加载图片的时候,由服务端发起的,所以我们本地浏览器的请求中就不应该存在图片的请求,如果刷新当前页面,有如下请求,则可判断不是SSRF。(前提设置bp截断图片的请求,默认是放行的)
四、SSRF防御及绕过
SSRF漏洞形成的原因主要是服务器端口所提供的接口中包含了所要请求的内容的URL参数,并且未对客户端所传输过来的URL参数进行过滤
一般的防御措施是对URL参数进行过滤,或者使得URL参数用户不可控,但当过滤方法不当时,就存在Bypass的不同方式
通常由一个5个思路:
- 过滤返回信息,验证远程服务器对请求的相应,是笔记容易的方法。如果Web应用获取某种类型的文件,那么可以把返回结构展示给用户之前先验证返回信息是否符号标准。
- 统一错误信息,避免用户根据错误信息来判断远程服务器端口状态。
- 限制请求的端口为HTTP常用端口,比如80、443、8080、8090
- 黑名单内容IP,避免应用被用来获取内网数据,攻击内网。
- 禁用不需要的协议。仅仅允许HTTP和HTTP5请求。可以防止类似于file://、ftp://等引起的问题。
SSRF绕过技巧
1、利用@符号 绕过当网站限制只能访问http://www.xxx.com类型的域名
2、添加端口号
3、利用短地址
4、利用特殊域名
5、利用封闭式字母数字
6、利用句号。或利用[::]绕过
7、利用进制转换
8、利用302跳转
利用302跳转、利用短地址、利用其它协议绕过限制请求只为http协议
参考资料:https://www.secpulse.com/archives/65832.html
1)利用@符号
SSRF绕过中我们通常使用@符号进行绕过
例如http://example.com@127.0.0.1
2)添加端口号
SSRF绕过中我们通常使用添加端口号绕过
例如:http://127.0.0.1:8080
3)利用短地址
SSRF绕过中我们通常使用短地址进行绕过
例如:http://dwz.cn/11SMa
4)利用特殊域名
SSRF绕过中我们通常使用特殊域名进行绕过
例如:xip.io
5)利用封闭式字母数字Enclosed Alphanumerics
例:ⓔ ⓧⓐ ⓜⓟ ⓛⓔ .ⓒ ⓞⓜ >>> example.com
①② ③ ④ ⑤ ⑥ ⑦⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳
⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇
⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛
⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴
⒵ Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ ℗ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ
Ⓨ Ⓩ ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ
ⓧ ⓨ ⓩ ⓪⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴ ⓿
6)利用。
SSRF绕过中我们通常使用。进行绕过
例如:http://127。0。0。1
7)利用进制转换绕过
SSRF绕过中我们通常使用进行转换进行绕过
例如:http://2130706433/
8)协议绕过
Dict:// —— dict://
<user-auth>
@<host>
:<post>
/d:<word>
SFTP://——ssrf.php?url=sftp://example.com:11111/
TFTP://——ssrf.php?url=tftp://example.com:123456/TESTUDPPACKET
LDAP://——ssrf.php?url=ldap://localhsot:11211/%0astats%0aquit
五、SSRF靶场+总结
bypass系列-ctfhub
目前的题目一般都是要求读取某个路径下的flag.php 中的内容
URL Bypass
题目提示:url中必须包含指定url
url必须以“xxx”开头。我们可以利用@来绕过,如http://x@127.0.0.1实际上是以用户名whoami 连接到站点127.0.0.1,即http://notfound.ctfhub.com@127.0.0.1与http://127.0.0.1请求时相同的,该请求得到的内容都是127.0.0.1的内容。
=http://notfound.ctfhub.com@127.0.0.1/flag.php
如果要求以http://notfound.ctfhub开头.com结尾的话,可以使用@
此类需要某某开头 某某结束的题目均可使用@进行绕过。
数字IP Bypass
题目ban掉了127和172
服务器有可能禁止了127.0.0.1的地址,来防御内网探测,可以使用一些不同的进制替代ip地址,从而绕过WAF
IP进制转换:将点分十进制的IP格式转为其它【八进制】、【十六进制】等格式
八进制:0177.0.0.1
十六进制:0x7f.0.0.1
十进制:2130706433
。。。
localhost
=http://localhost/flag.php
302跳转 Bypass
302跳转 Bypass(302重定向又称之为暂时性转移(Temporarily Moved),英文名称:302 redirect。也被认为时暂时重定向(temporary redirect),一条对网站浏览器的指令来显示浏览器被要求显示的不同URL,当一个网经历过短期的URL的变化时使用。)
直接访问不行
知识点:特殊域名xip.io/短网址(短网址生成:http://www.985.so/获取https://www.urlc.cn/或https://www.shorturl.at/)
=https://shorturl.at/gszD2
DNS重绑定 Bypass
DNS重新绑定是计算机攻击的一种形式。在这种攻击中,恶意网页会导致访问者运行客户端脚本,攻击网络上其它地方的计算机。它利用了同源策略的漏洞在网页浏览过程中,用户在地址栏中输入包含域名的网址,浏览器通过DNS浏览器将域名解析为IP地址,然后向对应的IP地址请求资源,最后展现给用户。而对于域名所有者,他可以设置域名所对应的IP地址,当用户第一次访问,解析域名获取一个IP地址,然后,域名持有者修改对应的IP的hi在,用户再次请求该域名,就会获取一个新的IP的地址,对于浏览器来说,整个过程访问的都是同一域名,所以认为是安全的。(浏览器同源策略)这就是DNS Rebinding攻击。
https://blog.csdn.net/qq_36348899/article/details/119297854
可以利用这个网站获取一个测试用的域名:
https://lock.cmpxchg8b.com/rebinder.html
使用两个IP地址,分别为
163.177.151.109 # 作用:第一次DNS解析后IP判断在指定范围内(随意一个可访问的公网地址)
127.0.0.1 # 作用:第二次DNS解析,不用判断直接访问内网flag.php
但是这里解题的时候,需要点欧气,有时候要多试几次才能成功
总结
- 在任何可以导入链接的地方都可以试试是否存在ssrf漏洞;
- 如果存在ssrf漏洞,那么看一看可不可以利用file协议,可以利用file协议读取文件;
- 如果只能依次才能返回信息,那么可以利用脚本来扫描内网的存活主机和端口扫描,做一个内网的信息收集。如果扫描到一些利用的端口漏洞,就可以利用服务器来做跳板对其进行利用,比如redis服务。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了SSRF漏洞的原理和形成方式,精简成一句话来说就是——利用一个可以发起网络i请求的服务当作跳板来攻击内部其它服务,上面内容也讲述了pikachu靶场和ctfhub靶场的通过技巧,可以前去实操一下。
祝愿读这篇文章的你,
你一定能够成为你想要去成为的人!!!