【发布时间】:2017-07-30 16:51:40
【问题描述】:
我正在用 Python 构建一个应用程序,用于检查某个 Web 应用程序是否容易受到 AngularJS Sandbox Escape/Bypass 的攻击。
这是它的工作原理。
我的应用使用以下内容启动本地 Web 服务器 (http://localhost)。
<!DOCTYPE html>
<html>
<head>
<script src="https://code.angularjs.org/1.2.19/angular.min.js"></script>
</head>
<body ng-app="">
{{c=toString.constructor;p=c.prototype;p.toString=p.call;["a","open(1)"].sort(c)}}
</body>
</html>
我使用的 Sandbox Escape 载荷是 {{c=toString.constructor;p=c.prototype;p.toString=p.call;["a","open(1)"].sort(c)}},由于调用了 open(1),它应该会打开一个新窗口。
在启动 Web 服务器后,它使用 Selenium(使用 PhantomJS 作为驱动程序)检查是否由于 AngularJS 沙箱逃逸而打开了一个新窗口。
capabilities = dict(DesiredCapabilities.PHANTOMJS)
capabilities["phantomjs.page.settings.XSSAuditingEnabled"] = False
browser = webdriver.PhantomJS(
executable_path="../phantomjs/win-2.1.1",
desired_capabilities=capabilities,
)
browser.get("http://localhost/")
return len(browser.window_handles) >= 2
我面临的问题
PhantomJS 不会打开新窗口。当我使用 Google Chrome 导航到 http://localhost 时,它确实会打开一个新窗口。
这是 PhantomJS 控制台日志(包含两个错误):
[
{
"level":"WARNING",
"message":"Error: [$interpolate:interr] http://errors.angularjs.org/1.2.19/$interpolate/interr?p0=%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%7Bc%3DtoString.constructor%3Bp%3Dc.prototype%3Bp.toString%3Dp.call%3B%5B'a'%2C'open(1)'%5D.sort(c)%7D%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20&p1=SyntaxError%3A%20Expected%20token%20')'\n (anonymous function) (https://code.angularjs.org/1.2.19/angular.min.js:92)",
"timestamp":1501431637142
},
{
"level":"WARNING",
"message":"Error: [$interpolate:interr] http://errors.angularjs.org/1.2.19/$interpolate/interr?p0=%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%7Bc%3DtoString.constructor%3Bp%3Dc.prototype%3Bp.toString%3Dp.call%3B%5B'a'%2C'open(1)'%5D.sort(c)%7D%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20&p1=Error%3A%20%5B%24parse%3Aisecfn%5D%20http%3A%2F%2Ferrors.angularjs.org%2F1.2.19%2F%24parse%2Fisecfn%3Fp0%3Dc%253DtoString.constructor%253Bp%253Dc.prototype%253Bp.toString%253Dp.call%253B%255B'a'%252C'open(1)'%255D.sort(c)\n (anonymous function) (https://code.angularjs.org/1.2.19/angular.min.js:92)",
"timestamp":1501431637142
}
]
这是 Google Chrome 控制台日志(抛出错误但会打开一个新窗口):
Error: [$interpolate:interr] http://errors.angularjs.org/1.2.19/$interpolate/interr?p0=%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%7Bc%3DtoString.constructor%3Bp%3Dc.prototype%3Bp.toString%3Dp.call%3B%5B'a'%2C'open(1)'%5D.sort(c)%7D%7D%20%20%20%20%20%20%20%20%20%20%20%20%0A%0A&p1=Error%3A%20%5B%24parse%3Aisecfn%5D%20http%3A%2F%2Ferrors.angularjs.org%2F1.2.19%2F%24parse%2Fisecfn%3Fp0%3Dc%253DtoString.constructor%253Bp%253Dc.prototype%253Bp.toString%253Dp.call%253B%255B'a'%252C'open(1)'%255D.sort(c)
at angular.js:36
at Object.r (angular.js:8756)
at k.$digest (angular.js:12426)
at k.$apply (angular.js:12699)
at angular.js:1418
at Object.d [as invoke] (angular.js:3917)
at c (angular.js:1416)
at cc (angular.js:1430)
at Xc (angular.js:1343)
at angular.js:21773
其他一些 AngularJS Sandbox Escape 有效载荷可以正常工作。例如下面的有效负载(对于 AngularJS 版本 1.0.0 到 1.1.5)在 Chrome 以及 PhantomJS 中打开一个新窗口。
{{constructor.constructor('open(1)')()}}
我希望有人能够帮助我解决这个问题,以便我可以检测负载是否成功执行。
请注意,我使用的是open(1) 而不是alert(1),因为在 PhantomJS 中无法检测到警报。
提前致谢。
更新 1:
这是一个适用于 Google Chrome 的 JSFiddle,但不适用于 PhantomJS。我正在寻找一种解决方案(可能是负载或 PhantomJS 设置的更改或其他内容),以便负载也可以在 PhantomJS 中触发。
https://jsfiddle.net/x90ey5fa/
更新 2:
我发现它与 AngularJS 无关。下面的 JSFiddle 包含 4 行 JavaScript,它们可以在 Google Chrome 中工作,但不能在 PhantomJS 中工作。我还附上了 PhantomJS 的控制台日志。
https://jsfiddle.net/x90ey5fa/2/
{'level': 'WARNING', 'message': "SyntaxError: Expected token ')'\n Function (undefined:1)\n sort (:0)", 'timestamp': 1501795341539}`
版本详情:
Operating System: Windows 10 x64
Python version: 3.6.1
Google Chrome version: 60.0.3112.78
PhantomJS version: 2.1.1
Selenium version: 3.4.3 (installed via PIP)
【问题讨论】:
-
jsFiddle 请。我会尽力帮助你的。
-
我认为这至少是一个 QtWebKit 错误。 PhantomJS 在后端使用 Qt。我使用 PySide(一个 Qt 端口)制作了一个简单的测试网络浏览器,它也无法解析那个 JavaScript。
-
该页面已 6 年未更新。 Chrome fork WebKit,现在使用 Blink。不过,QtWebKit 应该与 Safari 相同。在 Safari 上尝试这个可能会很有趣。
-
@AndrewMyers 谢谢。刚刚在 Safari 中测试过。它抛出一个
Syntax Error: Unexpected token '('. Expected a ')' or a ',' after a parameter declaration.。所以现在我想知道有效载荷是否应该根据 JavaScript 标准执行。 -
@AndrewMyers 也许我可以使有效负载与 QtWebKit 和正确的 AngularJS 版本兼容。那太棒了:)
标签: javascript google-chrome phantomjs webkit blink