什么是服务端伪造(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. 使用mongodb

    1.安装 yarn add moogose 2.启动 在命令行 mongod --dbpath D:\data//这是最后出现 waiting for connections on port 2701 ...

  2. Spring Cloud教程(十)自定义引导配置属性源

    可以通过在org.springframework.cloud.bootstrap.BootstrapConfiguration键下添加条目/META-INF/spring.factories来训练引导 ...

  3. JMH简介

    JMH是新的microbenchmark(微基准测试)框架(2013年首次发布).与其他众多框架相比它的特色优势在于,它是由Oracle实现JIT的相同人员开发的.特别是我想提一下Aleksey Sh ...

  4. No plugin found for prefix 'war' in the current project and in the plugin groups

    解决办法: 在pom里面添加 : <dependency> <groupId>org.apache.maven.plugins</groupId> <arti ...

  5. 「BalticOI 2011」Switch the Lamp On

    Casper is designing an electronic circuit on a \(N \times M\) rectangular grid plate. There are \(N ...

  6. CSS多种方式实现底部对齐

    CSS实现底部对齐效果 因公司业务要求需要实现如下图中红色区域的效果: 效果说明: 1.红色区域数据需要倒排(即从底部开始数,数字为1.2.3.4.5),并且显示在最底部 2.当数据过多时需要显示滚动 ...

  7. 1>/dev/null 2>&1的含义

      shell中可能经常能看到:>/dev/null 2>&1    分解这个组合:“>/dev/null 2>&1” 为五部分. 1:> 代表重定向到哪 ...

  8. SQLserver基础--连接查询、联合查询、索引

    一.子查询补充: Exists的用法:select*from haha where exists(select*from bumen where bumen.code=haha.bumen,and b ...

  9. MySQL多表查询合并结果union all,内连接查询

    MySQL多表查询合并结果和内连接查询 1.使用union和union all合并两个查询结果:select 字段名 from tablename1 union select 字段名 from tab ...

  10. Django学习之模板

    一.常用语法 1.变量 2.Filters 3.自定义filter 4.Tags 5.csrf_token 6.注释 7.注意事项 二.母板 2.继承母板 3.块(block) 4.组件 5.静态文件 ...