以下是PHP中*受到Server Side Request Forgery(SSRF)的一个示例。
<?PHP
/ **
*检查'url'GET变量是否设置
*示例 - http:// localhost /?url = http:///images/logo.gif
* /
if(isset($ _ GET ['url'])){
$ url = $ _GET ['url'];
/ **
*发送请求*受到SSRF的影响
*没有对$ url进行验证
*发送请求之前
* /
$ image = fopen($ url,'rb');
/ **
*发送正确的响应标题
* /
标题(“Content-Type:image / png”);
/ **
*转储图像的内容
* /
fpassthru($图像);
}
在上面的例子中,由于攻击者可以完全控制url参数,除了可以对Internet上的任何一个网站进行任意的GET请求。攻击者还可以对服务器上的资源进行请求。
例如,攻击者可以访问localhost上的服务。在以下示例中,攻击者可以在启用了mod_status(默认启用)的Apache HTTP服务器上进行以下请求。
GET /?url = http:// localhost / server-status HTTP / 1.1
主机:
类似地,Server Side Request Forgery(SSRF)可用于向Web服务器访问但不公开的其他内部资源提出请求。这样一个例子就是访问Amazon EC2和OpenStack实例中的实例元数据。此服务仅适用于服务器而不是外部世界。攻击者甚至可以通过SSRF获得创意,并通过此方法在内部网络上运行端口扫描。
GET /?url=http://169.254.169.254/latest/meta-data/ HTTP / 1.1
主机:
除了http://和https:// URL模式之外,攻击者可能会利用不太**或遗留的URL模式来访问本地系统或内部网络上的文件。
以下是使用file:/// URL模式的一个例子。
GET /?url = file:/// etc / passwd HTTP / 1.1
主机:
根据应用程序的请求方式,除文件和HTTP之外的URL模式可能可供攻击者使用。例如,如果使用cURL进行请求(上面的示例使用fopen()进行请求),则可以使用dict URL模式向任何端口上的任何主机发出请求并发送自定义数据。
GET /?url = dict:// localhost:11211 / stat HTTP / 1.1
主机:
上述请求将导致应用程序连接到端口11211上的本地主机并发送字符串“stat”。端口11211是Memcached使用的默认端口,通常不会暴露。有关可以使用的攻击和URL模式的全的面列表,ONSec Labs会维护一个详细的文档,其中包含有关服务器端请求伪的造(SSRF)攻击的大量有用信息。
检测Server Side Request Forgery(SSRF)
为了自动检测Server Side Request Forgery(SSRF),我们需要依赖中介服务,因为检测到这样的漏洞需要带外和延的时的向量。Acunetix在自动扫描期间通过使用AcuMonitor作为其中介服务来解决这个问题。
在扫描期间,Acunetix将发出包含唯的一AcuMonitor URL的请求。如果AcuMonitor收到URL中之一的请求,它将向Acunetix发送一条通知,指示它应该提醒Server Side Request Forgery(SSRF)。
以下是使用AcuMonitor检测Server Side Request Forgery(SSRF)的Acunetix扫描的结果。警报包含有关执行的HTTP请求的信息,包括发出此请求的服务器的IP地址和请求中使用的User-agent字符串(如果有)。这些信息可以帮助开发人员识别问题的根源并解决问题。
减轻Server Side Request Forgery(SSRF)
白名单和DNS解析
直接在用户输入端实现简单的黑名单或正规表达式,以过滤哪些IP地址或域可以发出请求,这是减轻SSRF时采取的不利方法。
一般来说,黑名单是一个很差的安全控制因素,因为开发人员总是会忽视这个设想。在这种情况下,攻击者旁路与使用HTTP重定向,通配符DNS服务(如xip.io)或备用IP编码一样简单。
相反,处理Server Side Request Forgery(SSRF)的较强大的方法是将您的应用程序需要访问的DNS名称或IP地址列入白名单。如果白名单方法不适合您的用例,并且您必须依赖黑名单,网站漏洞扫描工具,则必须正确验证用户输入。一个例子是不允许请求私有(“不可路由”)IP地址(RFC 1918中详细描述),但是在黑名单的情况下,采用的正确缓解将因应用而异。换句话说,SSRF没有通用的“修复”,因为它很大程度上取决于应用程序的功能和业务需求。
响应处理
确保远程服务器收到的响应确实是服务器期望的,以防止任何不可预见的响应数据泄露给攻击者。较重要的是,在任何情况下,服务器发送的请求中的原始响应体都不会传递给客户端。
禁用未使用的URL模式
如果您的应用程序仅使用HTTP或HTTPS提出请求,则只允许这些URL模式。禁用未使用的URL模式将阻止Web应用程序使用潜在的危险URL模式(如file:///,漏洞扫描,dict://,ftp://和gopher://)发出请求。
内部服务认证
默认情况下,Memcached,Redis,Elasticsearch和MongoDB等服务不需要身份验证。服务器端请求伪的造漏洞可能会为攻击者提供访问这些服务的机会,而*任何身份验证。因此,漏洞扫描系统,较的好在可能的情况下使身份验证成为另一个防御机制。
网络服务编辑器
屏幕截图 67 – 网络服务编辑器
网络服务编辑器中可以导入在线或者本地WSDL进行自定义编辑,以及执行各种网络服务操作,进行深入分析WSDL要求和回应。编辑器也具有所有语言句法**高亮的功能,让编辑SOAP标题和自定义手动袭的击更加简单。编辑和发送网络服务SOAP信息非常类似于编辑常规要求通过HTTP编辑器发送。
导入 WDSL并发送请求
在工具开发器点击‘Web Services Editor(网络服务编辑器)’节点,输入WSDL的网址,或者定位到本地WSDL文件存储的本地目录。点击导入import all WSDL information(导入所有的WSDL信息)。
1.
从工具栏下拉菜单的选择必须测试的服务,端口和操作。
2.
指的定一个值进行操作,漏洞扫描器,点击Send(发送)SOAP需求到网络服务器。之后,网络服务器回应就可以在一个有结构的或者XML审阅类型中查看,甚至在更低的window面板中查看。
3.
响应面板
显示从网络服务中发送回来的响应,格式为原始XML格式。
结构化数据选项卡
使用一个分级节点显示每个元素的值,显示从网路服务回应中接收的XML数据。
WSDL 结构选项卡
展示由WSDL结构提供的网络服务数据的详细审阅。WSDL信息以节点和分节点的格式分结构,树状结构的主节点是XML Schema和服务。
XML Schema节点列出所有的复杂类型和网络服务的元素。服务节点列出所有的网路服务端口,它们相对的操作以及SOAP数据资源的详细信息。可以选上屏幕底部的Show detailed WSDL structure(显示详细的WSDL结构)显示更详细的WSDL结构。这为服务节点结构下的每个子节点提供进一步的信息,比如输入信息和参数。
WSDL 选项卡
这个选项卡显示了XML选项卡中实际的WDSL数据。使用屏幕底部提供的工具栏,你可以在源节点中搜索特定的关键词或者元素,如果需要还可以改变句法**显示。
HTTP 编辑器导出
在网络服务编辑器你可以导出一个SOAP请求到HTTP编辑器,通过点击网络服务编辑器工具栏的HTTP Editor。HTTP编辑器工具将自动导入输入,这样就可以自定义请求,并作为HTTP 请求发送。