超详细的SSRF漏洞原理攻击与防御总
发布时间: 2023-07-11

网安教育

培养网络安全人才

技术交流、学习咨询

提示:以下是本篇文章正文内容,下面案例可供参考

一、SSRF是什么?

SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。

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

二、SSRF漏洞原理

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

展开全文

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

三、SSRF漏洞挖掘

1、分享:通过URL地址分享网页内容

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

3、在线翻译:通过URL地址翻译对应文本的内容。提供此功能的国内公司有百度、有道等。

4、图片、文章收藏功能:此处的图片、文章收藏中的文章收藏就类似于分享功能中获取URL地址中title以及文本的内容作为显示,目的还是为了更好的用户体验,而图片收藏就类似于功能四、图片加载。

例如title参数是文章的标题地址,代表了一个文章的地址链接,请求后返回文章是否保存,收藏的返回信息。如果保存,收藏功能采用了此种形式保存文章,则在没有限制参数的形式下可能存在SSRF。

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

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

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

7、从URL关键字中寻找

利用google 语法加上这些关键字去寻找SSRF漏洞

1share

2wap

3url

4link

5src

6source

7target

8u

9display

10sourceURl

11imageURL

12domain

简单来说:所有目标服务器会从自身发起请求的功能点,且我们可以控制地址的参数,都可能造成SSRF漏洞

四、产生SSRF漏洞的函数

SSRF攻击可能存在任何语言编写的应用,接下来将举例php中可能存在SSRF漏洞的函数。

1、file_get_contents:

下面的代码使用file_get_contents函数从用户指定的url获取图片。然后把它用一个随即文件名保存在硬盘上,并展示给用户。

1<?php

2if( isset($_POST[ 'url']))

3{

4$content = file_get_contents($_POST[ 'url']);

5$filename = './images/'.rand. ';img1.jpg';

6file_put_contents($filename, $content);

7echo$_POST[ 'url'];

8$img = "<img src=\"".$filename. "\"/>";

9}

10echo$img;

11?>

2、sockopen:

以下代码使用fsockopen函数实现获取用户制定url的数据(文件或者html)。这个函数会使用socket跟服务器建立tcp连接,传输原始数据。

1<?php

2functionGetFile( $host, $port, $link)

3{

4$fp= fsockopen( $host, intval( $port), $errno, $errstr, 30);

5if(! $fp) {

6echo" $errstr(error number $errno) \n" ;

7} else{

8$out= "GET $link" ;

9$out.= "Host: $host\r\n" ;

10$out.= "Connection: Close\r\n\r\n";

11$out.= "\r\n";

12fwrite( $fp, $out);

13$contents= '';

14while(!feof( $fp)) {

15$contents.= fgets( $fp, 1024);

16}

17fclose( $fp);

18return$contents;

19}

20}

21?>

3、curl_exec:

cURL这是另一个非常常见的实现,它通过 PHP获取数据。文件/数据被下载并存储在“curled”文件夹下的磁盘中,并附加了一个随机数和“.txt”文件扩展名。

1<?php

2if( isset($_POST[ 'url']))

3{

4$link = $_POST[ 'url'];

5$curlobj = curl_init;

6curl_setopt($curlobj, CURLOPT_POST, 0);

7curl_setopt($curlobj,CURLOPT_URL,$link);

8curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1);

9$result=curl_exec($curlobj);

10curl_close($curlobj);

11

12$filename = './curled/'.rand. '.txt';

13file_put_contents($filename, $result);

14echo$result;

15}

16?>

注意事项

1一般情况下PHP不会开启fopen的gopher wrapper

2file_get_contents的gopher协议不能URL编码

3file_get_contents关于Gopher的 302跳转会出现bug,导致利用失败

4curl/libcurl 7.43上gopher协议存在bug(% 00截断) 经测试 7.49可用

5curl_exec 默认不跟踪跳转,

6file_get_contents file_get_contents支持php: //input协议

五、SSRF中URL的伪协议

当我们发现SSRF漏洞后,首先要做的事情就是测试所有可用的URL伪协议

1file: /// 从文件系统中获取文件内容,如,file:///etc/passwd

2dict: // 字典服务器协议,访问字典资源,如,dict:///ip:6739/info:

3sftp: // SSH文件传输协议或安全文件传输协议

4ldap: // 轻量级目录访问协议

5tftp: // 简单文件传输协议

6gopher: // 分布式文档传递服务,可使用gopherus生成payload

1、file

这种URL Schema可以尝试从文件系统中获取文件:

1

如果该服务器阻

微信