目录
什么是SSRF?
攻击内网应用
端口扫描
攻击非web应用
pikachu中的SSRF
curl(端口扫描)
file_get_content(读取文件)
防御SSRF
什么是SSRF?
服务端请求伪造(Server Side Request Forgery):是最近几年出现的一种web漏洞,2021年,SSRF被OWASP列为Top 10web安全风险之一
其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据
比如从指定URL地址获取网页文本内容,加载指定地址的图片,文档,等等。
根据后台使用的函数的不同,对应的影响和利用方法又有不一样
PHP中下面函数的使用不当会导致SSRF:
file_get_contents()
fsockopen()
curl_exec()
如果一定要通过后台服务器远程去对用户指定("或者预埋在前端的请求")的地址进行资源请求,则请做好目标地址的过滤。
我们要对目标网站的布局有一定的了解,比如 : A网站,是一个所有人都可以访问的外网网站,B网站是一个公司内部的网站,我们普通用户只可以访问A网站,不能访问B网站。但是我们可以通过A网站做中间人,访问B网站,从而达到攻击B网站需求。
SSRF常见的利用场景:
通过URL地址分享网页内容
转码服务
在线翻译
图片加载与下载:通过URL地址加载或下载图片 图片、文章收藏功能 未公开的api实现以及其他调用URL的功能 从URL关键字中寻找 share、wap、url、src........
总:所有通过调取外部资源的参数都有可能存在SSRF
攻击内网应用
在大部分场景下,存在SSRF漏洞的应用只可以使用HTTP/HTTPS协议发起请求,而且通常限制了请求的方法,但是攻击很多带有漏洞的内网应用,而且很多中间件的管理控制台在内网中是开放的,甚至可以无密码登录
端口扫描
通常SSRF漏洞,攻击者可以他测内网域名或者ip地址是否存在,端口是否开放。
如果服务端会返回错误信息,攻击就可以方便的探测这些信息,通过页面的响应页面,或响应时间的差异来判断传入的值是否正确,这种攻击属于侧信道攻击,另外不同的协议的客户端和服务器的数据交互机制不同,换一种协议可能会拉开响应时间的差异
攻击非web应用
如果整个URL都是由外部输入参数控制的,那么攻击者可以尝试使用其他协议来访问其他非web应用,最基本的就是使用file://协议来访问服务器本地文件系统,比如:
Loading...
此外,很多HTTP库都支持HTTP以外的其他协议,如:LDAP、FTP、Gopher、DICT、IMAP、POP3、SMTP、Telnet等协议
其中对攻击者最有利的是DICT和Gopher协议,基于它们可以实现一种称为“协议走私”的效果,也叫做“协议夹带”。
协议走私:在一个应用协议的数据中注入另外一种应用协议的数据,当攻击者使用一种应用协议发送请求时,如果精心构造请求的内容,就能使其同时满足另外一种协议的数据格式要求
pikachu中的SSRF
这里我使用pikachu靶场来简单演示一下SSRF攻击:
curl(端口扫描)
点击来到了SSRF(curl)这里,然后发现这里在url中使用GET传入了一个网址
那么我们可以尝试一下传入一个别的网址:
可以看到我传入的www.baidu.com页面显示到了该网站中,这是由于网站没有对其URL进行限制,所以我们可以直接修改该网站的url,实现URL跳转
那么现在就可以尝试在这里进行手动的端口扫描:可以利用dict协议访问ip的某端口来确定该端口是否开启
比如说可以探测3306,返回了数据,说明3306端口是开启的:
再尝试探测3389端口,没有返回数据,说明3389端口是关闭的:
当然也可以使用Burpsuite抓包然后使用里面的扫描模块进行扫描:
设置扫描范围:
开始扫描:
然后根据场地的笔筒就可以扫描出了很多开启的端口:
file_get_content(读取文件)
现在来到file_get_content这里,可以看到这里从一个url中读取了一个php文件
这里我们可以利用file伪协议的方法制造恶意的payload去获取后台代码:
这里就读取到了本地文件中的phpoinfo.php文件,这里是base64编码的,然后进行base64解码就就可以得到文件内容:
防御SSRF
1、检验协议类型,应该使用白名单机制做校验,仅允许使用指定的协议来访问
2、如果调用的接口优先,应当使用白名单URL的方式,限制仅能访问指定的URL
3、如果输入的URL中主机名是ip地址,需要校验ip地址是否为公网地址
4、在解析用户输入的url过程中,需要提取协议、主机、端口、路径等信息,应当尽量使用成熟的URL解析库
5、对用户输入的参数作安全校验
6、打部门应用使用HTTP/HTTPS就够了,应当禁用其他多于的协议类型
7、在访问发生错误后,也不要将错误信息的原始内容直接返回给访问者