ssrf知识点总结

搜索公众号:白帽子左一,领配套练手靶场,全套安全课程及工具 

一.ssrf基础知识

ssrf的定义
SSRF(Server-Side Request Forgery,服务器请求伪造)是一种由攻击者构造请求,由服务端发起请求的安全漏洞,

一般情况下,SSRF攻击的目标是外网无法访问的内网系统(正因为请求时由服务端发起的,所以服务端能请求到与自身相连而与外网隔绝的内部系统)。

ssrf的成因
SSRF漏洞形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。

例如,黑客操作服务端从指定URL地址获取网页文本内容,加载指定地址的图片等,利用的是服务端的请求伪造,SSRF利用存在缺陷的WEB应用作为代理攻击远程和本地的服务器。

除了http/https等方式可以造成ssrf,类似tcp connect 方式也可以探测内网一些ip 的端口是否开发服务,只不过危害比较小而已。

二.ssrf种类

i.显示对攻击者的响应(Basic)
它显示对攻击者的响应
,因此在服务器获取攻击者要求的URL后,它将把响应发送回攻击者。返回结果到客户端,如传送一个网址,会返回这个网址的界面或对应的 html 代码。

ii.不显示响应(Blind):
和上面正好相反,不会返回结果到客户端。

当您从未从初势请求中获取有关目标服务的任何信息时,就会发生这种ssrf。通常,攻击者将提供url,但是该url中的数据将永远不会返回给攻击者。要在这种情况下确认漏洞,攻击者必须使用Burp,DNSbin等类似工具。这些工具可以通过强制服务器向攻击者控制的服务器发出DNS或HTTP请求来确认服务器是易受攻击的。这种ssrf通常易于验证,但难以利用。

iii. Semi-ssrf:
与Blind相似,这种ssrf不会返回相关结果请求的所有详细信息,但是会暴露一些数据。

这可能是部分数据或错误信息,他们为攻击者提供了更多信息。

有时,关于请求的元数据(例如响应时间)也可以视为Semi-ssrf,因为它们允许攻击者验证请求是否成功。这种ssrf通常足以验证漏洞,但并不总是能够提取敏感数据。

三.ssrf漏洞寻找

从web功能上寻找
我们从上面的概述可以看出,SSRF是由于服务端获取其他服务器的相关信息的功能中形成的,因此我们可以列举几种在web 应用中常见的从服务端获取其他服务器信息的的功能。

分享:通过URL地址分享网页内容
早期分享应用中,为了更好的提供用户体验,WEB应用在分享功能中,通常会获取目标URL地址网页内容中的标签或者标签中content的文本内容作为显示以提供更好的用户体验。

通过目标URL地址获取了title标签和相关文本内容。而如果在此功能中没有对目标地址的范围做过滤与限制则就存在着SSRF漏洞。

从国内某漏洞提交平台上提交的SSRF漏洞,可以发现包括淘宝、百度、新浪等国内知名公司都曾被发现过分享功能上存在SSRF的漏洞问题。

转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
由于手机屏幕大小的关系,直接浏览网页内容的时候会造成许多不便,因此有些公司提供了转码功能,把网页内容通过相关手段转为适合手机屏幕浏览的样式。例如百度、腾讯、搜狗等公司都有提供在线转码服务。

**在线翻译:通过URL地址翻译对应文本的内容。**比如百度翻译,有道等。

图片加载与下载:通过指定URL地址加载或下载图片
图片加载远程图片地址此功能用到的地方很多,但大多都是比较隐秘,比如在有些公司中的加载自家图片服务器上的图片用于展示。

(此处可能会有人有疑问,为什么加载图片服务器上的图片也会有问题,直接使用img标签不就好了?没错是这样,但是开发者为了有更好的用户体验通常对图片做些微小调整例如加水印、压缩等,所以就可能造成SSRF问题)。

图片、文章收藏功能:从分享的URL中读取其原文的标题等

未公开的api实现以及其他调用URL的功能
此处类似的功能有360提供的网站评分,以及有些网站通过api获取远程地址xml文件来加载内容。

从URL关键字中寻找

在对功能上存在SSRF漏洞中URL地址特征的观察,大致有以下关键字:

序号	关键字1	share2	wap3	url4	link5	src6	source7	target8	u9	3g10	display11	sourceURl12	imageURL13	domain14	…

如果利用google 语法加上这些关键字去寻找SSRF漏洞,耐心的验证,现在还是可以找到存在的SSRF漏洞。

四.产生漏洞的函数

很多web应用都提供了从其他服务器获取数据的功能。

使用用户指定的URL,web应用可以获取图片,下载文件,读取文件内容等。

这个功能如果被恶意使用,可以利用存在缺陷的web应用作为代理攻击远程和本地的服务器。

这种形式的攻击称为服务器端请求伪造攻击(ssrf)。

ssrf攻击可能存在任何语言编写的应用,接下来的文章将会介绍php中可能会存在ssrf漏洞的三种函数:file_get_contents,fsockopen(),curl_exec()。

file_get_contents()

这个函数的作用是将整个文件读入一个字符串中,并且此函数是用于把文件的内容读入到一个字符串中的首选方法。

比如:下面的代码执行结果则是输出test.txt文件里面的字符串。<?phpecho file_get_contents("test.txt");?>
下面的代码使用file_get_contents函数从用户指定的url获取图片。然后把它用一个随即文件名保存在硬盘上,并展示给用户。<?phpif(isset($_POST['url'])){
   $content=file_get_contents($_POST['url']);$filename='./images/'.rand().';img1.jpg';file_put_contents($filename,$content);echo $_POST['url'];$img="<img src=\"".$filename."\"/>";}echo $img;?>

代码分析:isset函数是判断有没有提交url
第一行$content变量将远程URL中的内容保存到content变量中
第二行随机生成一个文件路径
第三行获取了远程的内容后将其写到新的文件中
第四行输出url
第五行将保存的文件名保存到标签中

函数优缺点
**优点:**在抓取单个文件上,效率很高,返回没有头信息的文件。

缺点:在抓取远程文件时,和fopen一样容易出错。

在抓取多个跨域文件时,未对DNS进行缓存,所以效率上不不高。

fsockopen()

使用fsockopen函数实现获取用户制定url的数据(文件或者html)。这个函数会使用socket跟服务器建立tcp连接,传输原始数据。fsockopen本身就是打开一个网络连接或者Unix套接字连接。
<?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 .= 
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值