1
免责声明
本号提供的工具、教程、学习路线、精品文章均为原创或互联网收集,旨在提高网络安全技术水平为目的,只做技术研究,谨遵守国家相关法律法规,请勿用于违法用途,如有侵权请联系小编处理。
2
内容速览
SSRF(Server-Side Request Forgery,服务端请求伪造),是攻击者让服务端发起构造的指定请求链接造成的漏洞。
由于存在防火墙的防护,导致攻击者无法直接入侵内网;
这时攻击者可以以服务器为跳板发起一些网络请求,从而攻击内网的应用及获取内网数据。
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。
一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
大都是由于服务端提供了从其它服务器获取数据的功能,比如使用户从指定的URL web应用获取图片、下载文件、读取文件内容等。
但又没有对目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发送请求,并返回对该目标地址请求的数据。
最常见的例子:攻击者传入一个未经验证的URL,后端代码直接请求这个URL,就会造成SSRF漏洞。
除了http/https等方式可以造成ssrf,类似tcp connect 方式也可以探测内网一些ip 的端口是否开发服务,只不过危害比较小而已
CSRF是服务器端没有对用户提交的数据进行随机值校验,且对http请求包内的refer字段校验不严,导致攻击者可以利用用户的cookie信息伪造用户请求发送至服务器;
SSRF是服务器对用户提供的可控URL过于信任,没有对攻击者提供的URL进行地址限制和足够的检测,导致攻击者可以以此为跳板攻击内网或者其它服务器
由攻击者构造的攻击链接传给服务端执行造成的漏洞,一般用来在外网探测或攻击内网服务
1.社交分享功能:获取超链接的标题等内容进行显示
2.转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
3.在线翻译:给网址翻译对应网页的内容
4.图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片
5.图片/文章收藏功能:主要其会取URL地址中title以及文本的内容作为显示以求一个好的用具体验
6.云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行ssrf测试
7.网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作
8.数据库内置功能:数据库的比如mongodb的copyDatabase函数
9.邮件系统:比如接收邮件服务器地址
10.编码处理, 属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理器等
11.未公开的api实现以及其他扩展调用URL的功能:可以利用google 语法加上这些关键字去寻找SSRF漏洞
一些的url中的关键字:share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain……
12.从远程服务器请求资源(upload from url 如discuz!;import & expost rss feed 如web blog;使用了xml引擎对象的地方 如wordpress xmlrpc.php)
比如:该资源地址类型为 http://www.xxx.com/a.php?image=(地址)的就可能存在SSRF漏洞
可以在盲打后台用例中将当前准备请求的uri 和参数编码成base64,这样盲打后台解码后就知道是哪台机器哪个cgi触发的请求。
访问正常的文件,提交参数?url=http://www.baidu.com/robots.txt
当访问未开放端口,脚本会显示空白或者报错。提交参数?url=dict://127.0.0.1:1234
当访问开放端口时,脚本会显示banner信息。例如:提交参数?url=dict://127.0.0.1:3306 提交参数?url=dict://127.0.0.1:21
这样我们只需要变换IP就能实现端口扫描
利用file、dict、gopher[11]、ftp等协议可以任意读取系统本地文件,提交参数?url=file://c:\windows\system32\drivers\etc\hosts
识别内网应用使用的框架,平台,模块以及cms可以为后续的渗透测试提供很多帮助。大多数web应用框架都有一些独特的文件和目录。
通过这些文件可以识别出应用的类型,甚至详细的版本。根据这些信息就可以针对性的搜集漏洞进行攻击。比如可以通过访问下列文件来判断phpMyAdmin是否安装以及详细版本。?url=http://localhost/phpmyadmin/README
内网的安全通常都很薄弱,溢出、弱口令等一般都是存在的。通过ssrf攻击,可以实现对内网的访问,从而可以攻击内网应用或者本地机器,获取shell,这里的应用包括服务、web应用等。
仅仅通过get方法可以攻击的web应用有很多,比如struts2命令执行等
对于代码审计其实没什么好说的,只要能读懂代码,基本这种漏洞一眼就可以看出来,对于网络资源请求且没有过滤的就可能存在 SSRF,我这里也找了几个例子,大体来说涉及到获取内容的函数都有可能存在,例如 file_get_contents,fsockopen,curl_exec 等,示例如下。
例一:
$url = $_GET['url'];
echo file_get_contents($url);
例二:
function GetFile($host,$port,$link)
{
$fp = fsockopen($host, intval($port), $errno, $errstr, 30);
if (!$fp)
{
echo "$errstr (error number $errno) \n";
}
else
{
$out = "GET $link HTTP/1.1\r\n";
$out .= "Host: $host\r\n";
$out .= "Connection: Close\r\n\r\n";
$out .= "\r\n";
fwrite($fp, $out);
$contents='';
while (!feof($fp))
{
$contents.= fgets($fp, 1024);
}
fclose($fp);
return $contents;
}
}
例三:
function curl($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
}
$url = $_GET['url'];
curl($url);
对于 SSRF 绕过方法也有很多,其基础是程序有一定的防御策略,比如说验证是否为内网 ip,如果是内网 ip 则阻止其内容的读取,而判断方式如果是纯粹的验证是否为 10 开头的 ip 这种的话,则会存在很多方式的绕过。
首先就是 @符,对于一个 url 的访问实际上是以 @符后为准的,比如说 xxxx.com@10.10.10.10,则实际上访问的是 10.10.10.10 这个地址。
第二个是网址后加 xip.io,其原理是例如 10.10.10.10.xip.io 会被解析成 10.10.10.10,详细介绍可以通过 xip.io 这个网站来查看。
第三个就是进制转换,将 ip 转换为八进制十进制十六进制这种,同样也可以正常访问 例如将 10.10.10.10 转换为十进制是 168430090,在浏览器访问 http ://168430090 就会去访问 10.10.10.10 这个地址
转换问题可以在线查看一般有很多网站提供,或者自己算也可以,这里为了方便,我写了一个 js 脚本,代码如下:
<!DOCTYPE html>
<html>
<head>
<title>IP转换进制</title>
<script>
function ip(){
var ipvalue = document.getElementById("ipvalue").value;
var arr = ipvalue.split(".");
var decm = parseInt(arr[0])*256*256*256+parseInt(arr[1])*256*256+parseInt(arr[2])*256+parseInt(arr[3]);
var hex = parseInt(decm).toString(16).toUpperCase();
var binary = parseInt(decm).toString(2).toUpperCase();
document.getElementById("result").innerHTML = '十六进制 = '+hex+'<br> 十进制 = '+decm+"<br> 二进制 = "+binary;
}
</script>
</head>
<body>
<input type="text" name="ip" id="ipvalue" />
<button type="button" onclick="ip()">转换</button>
<div id="result"></div>
</body>
</html>
代码比较简单,输入 ip 后会对 ip 进行进制转换,然后进行输出,效果如下
还有一个就是短网址绕过,这个在线转换有很多网站提供。
比较形象的SSRF修复方案:
常见的有以下CMS中存在SSRF漏洞利用
这里以vulhub中的weblogic靶场进行演示
访问漏洞存在的地方10.0.105.222:7001/uddiexplorer
点击红框框住的内容,Public Registry选择 IBM
这时,打开bp进行抓包,然后再点击search按钮,查看抓包内容,并发送到repeater模块
点击go,并把response内容发送到comparer模块,下图中的http地址里面的%3A%2F其实就是./,可以选中,然后右键url decode得到
再把上述http地址改成:http://www.baidu.com
,再点击go,再把response发送到comparer
点击words,进行信息比较
这里报错信息不同,我们就怀疑这里存在SSRF漏洞,因为换了不同的IP地址,报错信息不同
通过错误的不同,即可探测内网端口
怎么探测呢?
先把地址改成localhost,然后go,再把response发送到comparer
再加上7001端口。
比较两次的包的内容区别
到此为止,就能确定存在SSRF漏洞, 接下来就是进行访问内网IP,采取盲测的方法 首先192.168.1.1,然后go,查看response信息,提示不能连接
然后继续更换内网IP,直到连接成功。这里我们作弊一下,查看内网的网段
然后输入ip地址,
把端口号改为 6379
本机开启监听
把这下面的url编码添加到端口号6379的后面
如下图:
然后点击go,进行发包。再然后回到下图页面
我们需要等待一会,等待回连
到此就获得了root权限,通过whoami
查看