ssrf原理与靶场实践
1、概述
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。利用的是服务端的请求伪造。ssrf是利用存在缺陷的web应用作为代理攻击远程和本地的服务器
2、常见地方
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)
3、常见函数
file_get_contents()
<?php if (isset($_GET['url'])) { $content = file_get_contents($_GET['url']); #echo $_GET['url']; $filename = ''.rand().'img-tasfa.jpg'; $fopen = fopen($filename, 'wb '); #echo $filename; file_put_contents($filename, $content); #echo $_GET['url'].""; $img = "<img src=\"".$filename."\"/>"; } echo $img;
fsockopen()函数
<?php $host=$_GET['url']; $fp = fsockopen($host, 80, $errno, $errstr, 30); if (!$fp) { echo "$errstr ($errno)<br />\n"; } else { $out = "GET / HTTP/1.1\r\n"; $out .= "Host: $host\r\n"; $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); while (!feof($fp)) { echo fgets($fp, 128); } fclose($fp); } ?>
curl_exec()
<?php error_reporting(E_ALL ^ E_NOTICE); function curl($url){ $ch = curl_init();//初始化curl会话 curl_setopt($ch,CURLOPT_URL,$url);//指定请求的url curl_setopt($ch,CURLOPT_HEADER,0);// 启用时会将头文件的信息作为数据流输出。参数为1表示输出信息头,为0表示不输出 curl_exec($ch); curl_close($ch); } $url = $_GET['url']; curl($url); ?>
4、靶场实践
5.1、curl函数
这里可以对url地址进行修改,在这里改为mysql默认端口:3306
5.2 、fie_get_contents()
在这里我们修改为自己的本地文件file=file:///C:Users//Lance//Desktop//1111.txt
6、防御措施:
通过上面的知道了SSRF漏洞最大的成因是URL完全可控,服务器会对用户构造的URL进行响应,所以从防御方面来看我们要禁止服务器随意响应用户构造的URL。
1:过滤。过滤返回的信息,如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
2:禁止跳转。防止用户利用服务器做跳板机
3:禁止不常用的协议,仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp://等引起的问题。
4:限制端口。只开放常用端口
5:统一返回的错误信息。这样用户就不可以根据返回信息判断端口情况。
6:使用DNS缓存技术防止DNS解析攻击
7:使用正则防止畸形绕过