什么是服务端伪造(SSRF)

原文:GitHub Pages and Single-Page Apps

译者:neal1991

welcome to star my articles-translator, providing you advanced articles translation. Any suggestion, please issue or contact me

LICENSE: MIT

服务端伪造(SSRF)指的是攻击者从一个具有漏洞的web应用中发送的一个伪造的请求的攻击。SSRF通常适用于针对在防火墙后一般对于外部网络的攻击者是无法访问的内部系统。另外,攻击者也可能利用SSRF来访问监听回送地址接口(127.0.0.1)的服务。

典型的SSRF发生在web应用发送请求的时候,攻击者对这个发送的请求具有全部或者部分的控制。一个通用的例子就是攻击者能够控制全部或者部分web应用向第三方服务发送请求的URL。

下面的是PHP中容易收到SSRF的一个例子。

<?php

/**
* Check if the 'url' GET variable is set
* Example - http://localhost/?url=http://testphp.vulnweb.com/images/logo.gif
*/
if (isset($_GET['url'])){
$url = $_GET['url']; /**
* Send a request vulnerable to SSRF since
* no validation is being done on $url
* before sending the request
*/
$image = fopen($url, 'rb'); /**
* Send the correct response headers
*/
header("Content-Type: image/png"); /**
* Dump the contents of the image
*/
fpassthru($image);
}

在上面的例子中,因为攻击者对于url参数具有完整的控制,因此能够对于网上的任何网站都能够发送任意的GET请求。攻击者也能够向服务器中的资源发送请求。

比如,攻击者可能能够访问本地的服务。在下面的例子中,攻击者通过开启mod_status(默认开启)能够在Apache HTTP服务器上发送下面的请求。

GET /?url=http://localhost/server-status HTTP/1.1
Host: example.com

类似的,SSRF能够被用来请求这个web服务器可以访问的其它内部资源,但是这些资源不是对公共开放的。这个样的例子比如是在Amazon EC2 以及 OpenStack 上访问实例元数据。这个服务仅仅向服务器开放而不是外部世界。攻击者甚至会有更多发现通过使用这个方法在内部网络中运行端口扫描

GET /?url=http://169.254.169.254/latest/meta-data/ HTTP/1.1
Host: example.com

除了通过http://以及·https://URL协议,攻击者可能也利用少数人或者遗留的URL协议来访问内部网络的本地系统中的文件。

下面的例子就是利用file:///URL协议来发送这样的请求。

GET /?url=file:///etc/passwd HTTP/1.1
Host: example.com

根据应用如何产生请求,攻击者能够利用URL协议而不是文件以及HTTP。比如,如果cURL被用来产生请求(上面的例子这就是利用fopen()来发送请求),可能能够利用dist URL协议向任何主机的任何端口发送请求并且发送自定义的数据。

GET /?url=dict://localhost:11211/stat HTTP/1.1
Host: example.com

上述的请求会造成应用链接到主机的11211端口并且发送字符串”stat”。端口11211是Memcached(通常不会暴露)使用的端口。对于一个可以利用的综合攻击列表以及URL协议,ONSec实验室维护了一个具有关于SSRF攻击有用的详细文档

检测SSRF

为了自动检测SSRF,我们需要依靠中介服务,因为检测到这样一个漏洞需要一个带外和延时的向量。Acunetix通过在自动扫描是讲AcuMonitor 作为它的中介服务来解决这个问题。

在这个扫描期间,Acunetix将会产生一个包含一个特殊AcuMonitor URL的请求。如果AcuMonitor接受到一个包含以上一个特殊URL的请求,它会发送一个通知到Acunetix告诉它应该对于SSRF发出警告。

下面的是Acunetix利用AcuMonitor扫描来检测SSRF的结果。这个警告包含了正在执行的HTTP请求的信息,包括发送这个请求的IP地址以及这个请求使用的User-agent字符串。这个信息可以帮助开发者识别问题的来源并且进行修复。

避免SSRF

白名单和DNS解析

直接在用户的输入上实时简单的黑名单或者正则表达式来过滤IP地址或者域发送的这个请求,这对于避免SSRF是一个方法。

通常,黑名单都是一个糟糕的安全控制因为总是会有开发者忽视的漏网之鱼有。在这样的情况下,攻击者就能够利用这样的旁路来产生HTTP重定向,一个通配符DNS服务比如xip.io或者甚至是可用的IP编码.

相反,最通用的解决SSRF的方式是使用你的应用需要访问DNS名称或者IP地址的白名单。如果白名单方案不适合你的用户案例,那么你必须依赖黑名单,适当地验证你的用户输入是非常重要的。一个例子就是不允许向私有IP地址(非路由)发送请求(详细参考RFC 1918),然而,在使用黑名单的情况下,正确的采取什么样的避免措施往往取决于具体的应用。换句话说,对于SSRF没有一个通用的修复方法,因为它非常依赖于应用的功能以及商业需求。

响应处理

确保响应是远程服务器接收的响应是它应该接收的是非常重要的,这对于阻止响应数据意想不到的泄露给攻击者是非常重要的。以上其他的,无论在任何情况下,服务器发送的原生响应体都不应该直接发送给客户端。

关闭无用的URL协议

如果你的应用仅仅使用HTTP或者HTTPS来发送请求,那么应该就仅仅允许这些URL协议。关闭不使用的的URL协议能够阻止web应用使用潜在危险的URL协议,比如file:///dict://ftp://以及gopher

认证内部服务

服务比如Memcached,Redis,Elasticsearch以及MongoDB默认不需要认证的。SSRF漏洞可以提供给攻击者一个没有任何认证阻拦的机会来访问这些服务。因此,最好实在人地方都使用认证,这也是一个防护机制。

可以扫描二维码或者搜索 mad_coder 关注微信公众号,点击阅读原文可以获取链接版原文。

什么是服务端伪造(SSRF)的更多相关文章

  1. Weblogic服务端请求伪造漏洞(SSRF)和反射型跨站请求伪造漏洞(CSS)修复教程

    一.服务端请求伪造漏洞 服务端请求伪造(Server-Side Request Forgery),是指Web服务提供从用户指定的URL读取数据并展示功能又未对用户输入的URL进行过滤,导致攻击者可借助 ...

  2. 渗透之路基础 -- 服务端请求伪造SSRF

    简介:SSRF 服务器端请求伪造,有的大型网站在web应用上提供了从其他服务器获取数据的功能.使用户指定的URL web应用获取图片,下载文件,读取文件内容.通常用于控制web进而探测内网服务以及攻击 ...

  3. SSRF(服务端请求伪造)漏洞

    目录 SSRF SSRF漏洞的挖掘 SSRF漏洞利用 SSRF漏洞防御 SSRF SSRF(Server-Side Request Forgery,服务器端请求伪造)漏洞,是一种由攻击者构造请求,由服 ...

  4. pikachu-服务器端请求伪造SSRF(Server-Side Request Forgery)

    一.SSRF概述(部分内容来自pikachu平台) SSRF(Server-Side Request Forgery:服务器端请求伪造),其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功 ...

  5. 【CTF WEB】服务端请求伪造

    服务端请求伪造 如你所愿,这次可以读取所有的图片,但是域名必须是www开头 测试方法 POST /index.php HTTP/1.1 Host: 218.2.197.236:27375 Conten ...

  6. 移动APP服务端设计开发注意要点

    2014年,移动APP的热度丝毫没有减退,怎么为您的移动端app设计良好的服务器端接口(API)呢? 下面谈谈我个人的一些想法. 2014年,移动APP的热度丝毫没有减退,并没有像桌面软件被WEB网站 ...

  7. 移动APP服务端API设计应该考虑到的问题

    2014年,移动APP的热度丝毫没有减退,并没有像桌面软件被WEB网站那样所取代, 不但如此,越来越多的传统应用.网站也都开始制作自己的移动APP,也就是我们常说的IOS客户端.android客户端. ...

  8. Spring Cloud官方文档中文版-服务发现:Eureka服务端

    官方文档地址为:http://cloud.spring.io/spring-cloud-static/Dalston.SR3/#spring-cloud-eureka-server 文中例子我做了一些 ...

  9. iOS内购 服务端票据验证及漏单引发的思考.

    因业务需要实现了APP内购处理,但在过程中出现了部分不可控的因素,导致部分用户反映有充值不成并漏单的情况. 仔细考虑了几个付费安全上的问题,凡是涉及到付费的问题都很敏感,任何一方出现损失都是不能接受的 ...

随机推荐

  1. mpvue 未找到app.json入口文件

    [情况1] 通过 vue init mpvue/mpvue-quickstart myproject 创建一个mpvue项目,发现项目中没有app.json文件. 解决:npm run dev 编译一 ...

  2. 高级软件测试技术(测试管理工具实践day1)

    今天进行了班级内部各小组选择测试工具,选择各自需要进行测试管理工具.我们小组暂定选择 禅道 但是班级内其他小组选择的工具还没确定,还没进行

  3. np.asarray(a, dtype=None, order=None)

    np.asarray(a, dtype=None, order=None) 参数a:可以是,列表, 列表的元组, 元组, 元组的元组, 元组的列表,多维数组 参数dtype=None, order=N ...

  4. react-native modal

    1.属性 animationType(动画类型) PropTypes.oneOf([‘none’, ‘slide’, ‘fade’]) none:没有动画 slide:从底部滑入 fade:淡入视野 ...

  5. 10.6 Comment Syntax

    w https://dev.mysql.com/doc/refman/5.7/en/comments.html MySQL 5.7 Reference Manual  /  Language Stru ...

  6. VB 获取所有窗体菜单信息

    VERSION 5.00 Object = "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0"; "COMDLG32.OCX&q ...

  7. Guarded Suspension Pattern【其他模式】

    Guarded Suspension Pattern public class GuardedSuspension { /** * Guarded Suspension Pattern[保护悬挂模式] ...

  8. hive三种方式区别和搭建

    Hive 中 metastore(元数据存储)的三种方式:         a)内嵌 Derby 方式         b)Local 方式          c)Remote 方式    第一种方式 ...

  9. SpringBoot 切换国际化

    git:https://github.com/xiaozhuanfeng/demoProj 代码结构: application.properties: spring.messages.basename ...

  10. requests模块(请求接口)

    下面分别是get,post,入参json,添加cookie,添加header,上传/下载文件 的接口请求举例: import requests   #导入模块 #1.发get请求 url = 'htt ...