代码审计——SSRF详解

举报
Vista_AX 发表于 2023/06/25 16:34:12 2023/06/25
【摘要】 代码审计——SSRF详解

01 漏洞描述


服务端请求伪造攻击(SSRF)也成为跨站点端口攻击,是由于一些应用在向第三方主机请求资源时提供了URL并通过传递的URL来获取资源引起的,当这种功能没有对协议、网络可信便捷做好限制时,攻击者可利用这种缺陷来获取内网敏感数据、DOS内网服务器、读文件甚至于可获取内网服务器控制权限等。

image.png


## 02 审计要点
服务端请求伪造攻击(SSRF)发生的根本原因是"服务器未限制"的情况下"用户可控的"失控请求资源行为。

1、参数是否用户可控?比如用户是否可以自定义输入URL来获取资源。

2、是否限制了请求范围?对URL获取资源的链接是否有白名单限制。

3、是否限制了请求协议?仅可以发起http请求还是file:///,gopher://,ftp:// 等均可使用?

03 漏洞特征


服务器端请求伪造是由服务器端发起的资源请求,根据URL从其他服务主机获取相关资源。若发起请求的URL可由攻击者来控制,那么就会导致服务端请求伪造攻击。

Java

String url = request.getParameter("url");

PHP

如下是PHP程序中常见的一个接收客户端URL,并将服务器资源的URL资源返回到浏览器端的功能:

<?php
if (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; 
?>

这段代码使用file_get_contents函数从用户指定的url获取图片。当攻击者构造http://www.example.com/index.php?url=http://10.10.10.10:80时,即可用来判断内网服务器10.10.10.10是否开放了80端口。

04 漏洞案例

String url = request.getParameter("url")

若存在此类代码,且服务端未限制了请求范围、请求协议,将导致SSRF漏洞。漏洞存在示例如下

image.png

image.png

除此之外,这边列举常见的一些容易出现SSRF漏洞的功能点如下:

1、 从远程服务器请求资源(upload from url 如discuz!;import & expost rss feed 如web blog;使用了xml引擎对象的地方 如wordpress xmlrpc.php)。

2、未公开的api实现以及其他扩展调用URL的功能:可以利用google语法加上这些关键字去寻找SSRF漏洞,一些的url中的关键字:share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain……

3、社交分享功能:获取超链接的标题等内容进行显示。

4、转码服务:通过url地址把原地址的网页内容调优使其适合收集屏幕浏览。

5、在线翻译:给网址翻译对应网页内容。

6、图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过url地址加载或下载图片。

7、图片/文章收藏功能:主要网站会取url地址中title以及文本的内容作为显示以求一个好的用户体验。

8、云服务商:它会远程执行一些命令来判断网络是否存活等,所以如果可以捕获相应信息,就可以进行SSRF测试。

9、网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作。

10、数据库内置功能:数据库的比如mongodb的copyDatabase函数.

11、邮件系统:比如接收邮件服务器地址。

12、编码处理,属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理器等。

代码审计时搜索“URLConnection”、“URL”等关键字,然后根据数据流的过程,逐步向上回溯,定位到用户可控参数。

05 修复方案

1、过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。

2、 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。

3、限制请求的端口为http常用的端口,比如,80,443,8080,8090。

4、黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。

5、禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等引起的问题。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。