SSRF攻击的新角度–利用编程语言中的URL parser

作者:{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解析器。

发表评论

邮箱地址不会被公开。 必填项已用*标注