ssrf
1、介绍
ssrf,server-server request forgery服务端对服务端的请求伪造,有时也理解为server side request forgery服务端侧的请求伪造。
指服务端借助用户请求中的参数,向服务器内部或者其他服务器发起请求,而这个过程对发起方是信任的,导致出现危害。
攻击者发送链接,由服务端去请求。这种方式常常可以用来绕过网络的限制,攻击我们无法直接访问的网络。
2、原理
服务端提供了从其他服务器获取数据的功能,但没有对内网目标地址做过滤和限制。
一般,服务器与内网资源通过参数进行操作,该参数可以被前端用户修改影响。
参数一般是url形式。
主要方式:
- 对外网、服务器所在内网、本地进行端口扫描,获取Banner信息
- 测试运行在内网或本地的应用程序
- 利用file协议读取本地文件等
学习参考:新浪微博某处SSRF漏洞 | wooyun-2016-0214334| WooYun.org (2xss.cc)
3、场景
- 1)分享:通过URL地址分享网页内容
- 2)在线翻译
- 3)图片的加载与下载:通过URL地址加载或下载图片,要注意区分是客户端发送的请求还是服务端发送的请求
- 4)图片,文章收藏功能
- 5)未公开的api实现以及其他调用URL的功能
4、漏洞代码分析
php可能借用curl库
ssrf读取文件
http://192.168.1.10/ssrf_test.php?url=file:///c:/widnows/win.ini
5、测试
在前端选择路径参数或者看起来是url一部分的参数,比如&=结构。然后分析其作用方向,分析影响结果。
6、防范
严格限制路径和参数范围
7、产生ssrf漏洞的php函数
很多web应用都提供了从其他的服务器上获取数据的功能。使用用户指定的url,web应用可以获取图片,下载文件,读取文件内容等。这个功能如果被恶意使用,可以利用存在缺陷的web应用作为代理攻击远程和本地的服务器。这种形式的攻击称为ssrf。
ssrf可能存在任何语言编写的应用。
- file_get_content():从用户指定的url获取图片,然后把它用一个随机文件名保存在硬盘上,并展示给用户
- fsockopen():该函数实现获取用户指定的url(文件或html)。该函数使用socket跟服务器建立tcp连接,传输原始数据。
- curl_exec():用于发送请求获取数据
8、漏洞利用
参考ssrf代码
<?php
if(isset($_GET['url'])){
$link = $_GET['url'];
$curlobj = curl_init($link);
curl_setopt($curlobj, CURLOPT_HEADER, 0);
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($curlobj);
echo $result;
curl_close($curlobj);
}
?>
一般情况下将web应用程序暴露在互联网可以通过web浏览器进行访问。但是会将内网资源封闭起来,避免与外部交互。如果存在ssrf漏洞,可以进行内网资源访问。
提交对应参数url包含ip地址:端口号 测试端口状态。
http://127.0.0.1/ssrf/ssrf.php?url=http://127.0.0.1:3306