【SSRF漏洞】原理、危害利用、触发点、利用过程、协议使用……
【SSRF漏洞】原理、危害利用、触发点、利用过程、协议使用……
目录
六、file_get_contents()和curl_exec()区别:
8.2、pikachu(SSRF-file_get_contents)
一、简介:
全称Server-Side Request Forgery:服务器端请求伪造
顾名思义,攻击者伪造成服务器发起的请求,ssrf的目标是从外网,通过服务器漏洞,访问到原本无法访问到的内部网络
二、产生原因:
因为用户功能的需要,需要服务端A提供从其他服务器B获取数据的功能,但是由于没有对目标地址没有很好的过滤和限制,导致攻击者可以伪造成服务端A,然后向用户发出伪造请求,从而达到访问内部网络的目的。
三、危害与利用:
3.1、端口扫描
对外网、服务器所在内网、本地进行端口扫描
eg:http://example.com/ssrf.php?url=http://192.168.139.1:80/
通过应用响应时间、返回的错误信息,未开放端口会显示空白或者报错,开放端口会显示服务的banner信息
3.2、攻击内网、本地漏洞服务
攻击运行在内网或本地的应用程序(溢出、弱口令等)
利用Gopher协议拓展攻击面
3.3、内网Web应用指纹识别、攻击漏洞应用
访问默认文件,对内网web应用进行指纹识别(框架,平台,模块以及CMS等 )
攻击内外网的web应用,主要是使用get参数就可以实现的攻击(如struts2,sqli等);
第一步,应用指纹识别---->第二步,寻找漏洞----->第三步,漏洞利用
3.4、文件读取
读取本地文件,利用file协议读取本地文件,提交参数等
http://example.com/ssrf.php?url=file:///etc/passwd
四、防护与绕过
4.1、防护:
使用正则表达式的方式对SSRF中的请求地址进行过滤
eg:限制请求特定域名、禁止请求内网IP。
4.2、绕过:
方法一:使用特殊格式绕过
htttp://example.com@evil.com
方法二:IP地址转为进制及IP地址省略绕过
原始:地址127.0.0.1
八进制:0177.00.00.01
十进制:2130706433
十六进制:0x7f.0x0.0x0.0x1
IP地址省略写法:127.1
方法三:域名的配置
有可控域名A,将域名A记录指向欲请求的IP进行绕过操作
evil.example.com => 10.10.11.11
五、SSRF漏洞点:
5.1、功能分析:
(需要请求外部服务器的)
通过URL地址分享、通过URL转码服务、通过URL在线翻译、通过URL加载或下载图片、通过URL的收藏、对URL采集的功能、其他调用URL的功能
5.2、关键字分析:
对于上述可能产生SSRF漏洞的URL关键字进行分析总结
share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain……
然后可以使用URL对应的关键字进行搜索
inurl:share
5.3、(可能存在)漏洞函数:
(这些函数的使用不当会导致SSRF漏洞的产生)
5.3.1、file_get_contents()
定义:把整个文件读入一个字符串中
语法:file_get_contents(path,include_path,context,start,max_length)
参数 描述 path 必需。要读取的文件 include_path 可选。要在 include_path 中搜寻文件,将该参数设为 "1" context 可选。规定文件句柄的环境
context 是一套可以修改流的行为的选项。若使用 null,则忽略。
start 可选。文件中开始读取的位置 (适用于PHP 5.1以后) max_length 可选。读取的字节数 (适用于PHP 5.1以后)
5.3.2、curl_exec()
定义:执行一个cURL会话
参数:ch 由 curl_init() 返回的 cURL 句柄。
用法:抓取URL并把它传递给浏览器 curl_exec($ch)
5.3.3、fsockopen()
定义:打开一个网络连接或者一个Unix套接字连接
参数 描述 hostname 安装了OpenSSL,添加访问协议ssl://或者是tls://,从而可以使用基于TCP/IP协议的SSL或者TLS的客户端连接到远程主机 port 端口号。如果对该参数传一个-1,则表示不使用端口,例如unix:// errno
如果errno的返回值为0,而且这个函数的返回值为false,那么这表明该错误发生在套接字连接(connect())调用之前,导致连接失败的原因最大的可能是初始化套接字的时候发生了错误 errstr 错误信息将以字符串的信息返回。
timeout 设置连接的时限,单位为秒。
六、file_get_contents()和curl_exec()区别:
file_get_contents():只能使用GET方式获取数据
curl_exec():支持多种协议
七、漏洞的验证:
根据漏洞产生的原理,对所我们所测试的地方进行一个分析
首先这个地方应该是服务器A请求访问以外的服务端B,而不是客户端向服务器A发起请求
使用排除法:看URL地址中有没有包含其他URL地址,再看数据包的请求
7.1、方法一:对URL地址进行分析
我在网上随便找了一张图片,右键新标签打开后
对URL地址进行了解码,就看见了2个包含的URL地址
7.2、方法二:对数据包进行分析
其实也可以使用burpsuite抓包进行分析
这里直接看见了文件的URL是其他网站来的
八、举例(利用过程):
8.1、pikachu(SSRF-curl)
8.1.1、第一步:分析是否可能存在SSRF
(一般要测试3个函数curl_exec、file_get_content、fsockopen是否能执行成功)
点击它
发现是URL传递的
(如果无法显示,就在127.0.0.1后面加上端口号)
8.1.2、第二步:测试是哪种函数引起的SSRF漏洞
这是个SSRF(curl)靶场,就不做过多测试
函数不同所支持的功能也存在差别
对端口进行一个探测(http协议)
http://localhost:8080/pikachu-master/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1:3306
能够探测到内容,说明存在SSRF漏洞,并且进一步尝试其他操作
内网应用指纹识别(http协议)
(这个我在尝试的时候,如果原文件带了版本号,读取的时候也要带,大小写不一样不影响)
读取文件(file协议)
8.2、pikachu(SSRF-file_get_contents)
8.2.1、第一步:判断是否存在SSRF漏洞
上一题是url,这一题是file函数
但是操作还是基本类似
8.2.2、第二步:利用漏洞
读取php源码
http://localhost:8080/pikachu-master/vul/ssrf/ssrf_fgc.php?file=php://filter/read=convert.base64-encode/resource=ssrf.php
再使用base64解密即可得到源码
读取本地host等文件
http://localhost:8080/pikachu-master/vul/ssrf/ssrf_fgc.php?file=file://c:\windows\system32\drivers\etc\hosts
- 点赞
- 收藏
- 关注作者
评论(0)