SSRF (Server-Side Request Forgery,服务器端请求伪造) 是一种由攻击者构造请求,由服务端发起请求的安全漏洞,一般情况下,SSRF攻击的目标是外网无法访问的内网系统,也正因为请求是由服务端发起的,所以服务端能请求到与自身相连而与外网隔绝的内部系统。也就是说可以利用一个网络请求的服务,当作跳板进行攻击。
谈谈我的理解
在进行网站资源请求的时候,我们往往是通过网页端点击操作,是我们客户端主动地向服务器端发送请求。但是在一些网页例如图片搜索引擎,他在请求资源的时候,往往是通过服务器端去请求资源,这么一来因为请求方式的特殊性,我们就可以使用这个点去请求服务器端自身的本地资源。例如网站下面有一个demo.php的资源是开发者做测试用的,不允许外网访问,但如果我们借助网站提供的这个接口去访问比如说http://127.0.0.1/demo.php,就可以访问到外网禁止访问的一些资源信息。
案例解析
远程图片加载器
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<form action="" method="POST">
请输入图片地址:<input type='text' name='url'>
<input type='submit' value="提交">
</form>
<?php
//$_POST['url'];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_POST['url']);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_exec($ch);
curl_close($ch);
?>
将这个代码放到网站目录下进行解析
我们可以通过此接口去请求网上的资源
当然也可以去请求网上的图片资源,前提是网站 要支持解析和url长度等条件要满足环境(有的图片的url太长了)
如果此类接口我们没有做防御措施的话,我们就可尝试利用此接口访问其本地资源
我们可以看见网站目录被探测了出来
我们也可以利用接口去探测内网开放的服务,例如我们可以去探测服务器是否开放了mysql访问及其版本号
我们可以看到返回了本地的mysql相关版本信息
当我们访问本地服务器没有的端口号时,我们就服务器返回结果较慢(因为请求没有响应),且没有结果回显
为此我们可以利用这个方法进行网站本地资源的信息探针
除此之外,我们还可以探测主机所在的内网网段,例如我们可以使用可以探测主机所在的内网有无其他主机,例如我的主机下还有一个内网主机,上面开启了ssh服务,我们也可以使用这个接口探测到
如果在真实环境下,我们不知道有哪些内网IP地址,此时我们可以借助BurpSiute的暴力破解模块进行暴力破解(因为私有地址只有那么几个)
可以将198和135作为两个爆破点进行爆破
当然除了http 协议 ssrf看网站对于协议有没有限制,没有限制的话,我们可以使用file协议去读取网站下的文件信息
如何获取文件路径的话,我们可以借助网站的报错信息或者是系统自带的文件路径去获取一些敏感数据文件
ps:不同的网站环境会执行不同的协议,更多协议可以根据不同的搭建环境上网上查询
漏洞利用思路
因为是浏览器去请求信息,为此我们可以在我们的外网服务器上部署一个后门文件,我们可以使其去请求下载后门文件,然后利用bash执行后门文件进行上线。由于我没有外网服务器,不方便演示。
SSRF攻击的防御措施
1.禁用跳转
2.禁用不需要的协议
3.固定或者限制资源地址
4.错误信息统一信息处理
写在最后
如有错误,请及时指出,感谢