作者:{LIG}@ArkTeam
原文作者:Orange Tsai
原文标题:A New Era of SSRF – Exploiting URL Parser in Trending Programming Languages!
原文来源:2017 Blackhat
众所周知,绕过SSRF过滤的方式有很多种,比如:更改IP地址写法,利用URL解析,利用302跳转,各种非HTTP协议以及DNS Rebinding。利用URL解析导致SSRF过滤被绕过大多是因为后端通过不正确的正则表达式对URL进行了解析。
在2017年的Blackhat大会上,作者介绍了SSRF攻击的一个新的角度—利用不同编程语言对URL的处理标准来绕过SSRF过滤,从而实施攻击。该方式主要是利用了URL解析器和URL请求器之间的差异性发起攻击,由于不同的编程语言实现URL解析和请求是不一样的,所以很难验证一个URL是否合法。
在作者的实践中,受到这种攻击的编程语言包含了cURL、PHP和PYTHON。图1展示了PHP语言中存在的攻击,parse_url最终解析得到的部分是google.com,而readfile忠实地执行了RFC3986中的定义,将host指向了evil.com。图2展示了cURL请求函数与其他语言解析函数的差异性。可以得知,NodeJS URL、Perl URI、Go net/url、PHP parser_url以及Ruby addressable解析得到的IP是google.com,而curl请求得到的却是evil.com:80。且当作者将此问题报告给CURL团队后,得到的补丁又可以被添加一个空格的方式绕过。
图1 PHP语言中的差异性
图2 cURL与其他语言的差异性
这个问题依赖于URL解析器和实际的请求器之间所用的IDNA(Internationalizing Domain Names in Applications)标准不同。
根据这种差异性,作者发现了github企业版的远程代码执行漏洞(将四个漏洞结合为一个攻击链,实现了远程代码的攻击)且提出了3种方法绕过wordpress的SSRF保护。
然后作者提出了缓解措施:
1)应用层:使用唯一的IP和主机名,不要对输入的URL进行复用。
2)网络层:使用防火墙或者协议来阻断内网的通行。
最后,作者总结了SSRF中的新攻击面主要是URL解析器的问题和滥用IDNA标准,并提出未来的研究可以针对OAuth、现代浏览器以及代理服务器中的URL解析器。