前言
在前篇我们了解完有关SSRF的基本知识后,现在将提升挑战难度,我们来看看如何绕过针对SSRF攻击进行一定程度防御的过滤器。
防御的基本原理
在前篇中我们提到SSRF产生的原因为未对URL中引用的URL进行限制,使得攻击者能够利用这一漏洞使得引用的URL指向内网中的其它地址以获得本应该被拒绝外网访问的资源。因此常见的SSRF防御手段为对引用的URL进行限制。常见的限制手段有黑名单和白名单两种。
所谓的黑名单就是名单上的URL都不能引用,白名单就是只有名单上的URL才能引用。针对黑名单和白名单的特性,我们就能尝试对SSRF过滤器进行绕过。
基于黑名单的SSRF过滤器绕过
在了解了黑名单的特性后,如果还想访问黑名单上的URL(如127.0.0.1或localhost)就不能直接用,而应该用其它的表达形式。现以127.0.0.1为例。
对IP地址进行进制转化;
如果黑名单上的IP地址为127.0.0.1,那么我们可以尝试将此IP地址转换为八进制、十进制、十六进制等进行URL引用,以实现127.0.0.1黑名单限制。也可将127.0.0.1省略为127.1,依旧可行
以十进制为例证明十进制的IP地址依旧会被正常解析:
注册域名使其解析为目标IP地址
以www.localtest.me为例进行测试:
依旧可以被解析为本机回环地址。但此方法仅适用于对服务器本身发起请求伪造,若要应用于内网其它IP地址则成本过大。
基于白名单的SSRF过滤器绕过
在其它应用方面白名单虽然可以称得上是安全性极高,但在SSRF防御中,如果完全套用白名单的模式则会导致用户体验极差。以图片分享为例,如果某网站允许用户以URL的形式分享图片,则每一张图片最后的URL标识部分必定是不相同的。
如果过滤器完全套用白名单的模式,则这项图片分享功能将会形同虚设。因此在基于白名单的SSRF过滤器中,采用的是只允许以白名单上标有的URL为前值进行的URL引用,这样就可以避免由于图片URL标识后缀不一致导致功能瘫痪。知道白名单过滤器的这一特性后,我们就可以利用URL的规范性进行SSRF白名单过滤器绕过,但不确定性太高。如果URL解析器不支持嵌入式URL凭据,则很难奏效。
- 利用@嵌入URL,如http://xxx/xx@http://yyy/yy(xxx:白名单限制的前值);
- 利用#嵌入UR,如http://yyy/yy#http://xxx/xx(xxx:白名单限制前值);
- 注册域名,如http://xxx.yyy;
- 使用URL编码字符干扰URL解析;
利用重定向漏洞对SSRF过滤器进行绕过
针对黑名单模式的绕过较为简单,但白名单模式的绕过难度较高,但我们可以将SSRF与其它漏洞结合,以实现绕过SSRF过滤器的目的。现以SSRF结合重定向漏洞为例。
在此之前先简单讲解什么是重定向漏洞。所谓的重定向就是重新跳转到一个新的URL地址,而重定向漏洞产生的原因,则是因为重新跳转的URL是用户可控的,因此称位重定向漏洞,一般用于钓鱼。其格式一般如下:
http://xxx/xx/?path=http://yyy/yy
既然path后的URL用户可控,则可以将其指向内网IP。以下是SSRF结合重定向漏洞绕过SSRF过滤器。
靶场首页:
按照上篇的套路,点击商品查询库存后进行抓包:
解码后可以发现stockAPI为/product/stock/check?productId=1&storeId=1,尝试修改使其指向内网IP后果然行行不通:
接着发现一个跳转功能:
当点击下一个商品时发现URL出现重定向(path:/xxx):
尝试由此处为突破口,将其修改为http://baidu.com以确定是否存在重定向漏洞:
状态码为302 Found,表明确实可以重定向到百度,于是将先前查询库存时的stockAPI修改为:
/product/nextProduct?path=http://192.168.0.x:8080/admin
进行批量扫描,最终查得的IP地址为192.168.0.12:
状态码为200 OK,接着发现有删除用户功能,删除用户calos:
总结
常见的SSRF过滤器有两种原理,分别是黑名单和白名单。基于黑名单的SSRF过滤器相对容意绕过,基于白名单的SSRF过滤器则较难绕过,有一定的运气成分。此外,如果能过够同时将其它漏洞(如重定向漏洞)与SSRF相结合,则能达到意想不到的效果,起到事半功倍的作用。但这也要求漏洞挖掘者有较高的能力和意识,能够挖掘到其它类型的漏洞并加以利用。
以上就是本篇的全部内容,我们下篇见。