自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

利用AngularJS繞過(guò)XSS表達(dá)式沙箱

安全 應(yīng)用安全
AngularJS是一個(gè)很流行的JavaScript框架,通過(guò)這個(gè)框架可以把表達(dá)式放在花括號(hào)中嵌入到頁(yè)面中。例如,表達(dá)式1+2={{1+2}}將會(huì)得到1+2=3。其中括號(hào)中的表達(dá)式被執(zhí)行了,這就意味著,如果服務(wù)端允許用戶(hù)輸入的參數(shù)中帶有花括號(hào),我們就可以用Angular表達(dá)式來(lái)進(jìn)行xss攻擊。

簡(jiǎn)介

AngularJS是一個(gè)很流行的JavaScript框架,通過(guò)這個(gè)框架可以把表達(dá)式放在花括號(hào)中嵌入到頁(yè)面中。例如,表達(dá)式1+2={{1+2}}將會(huì)得到1+2=3。其中括號(hào)中的表達(dá)式被執(zhí)行了,這就意味著,如果服務(wù)端允許用戶(hù)輸入的參數(shù)中帶有花括號(hào),我們就可以用Angular表達(dá)式來(lái)進(jìn)行xss攻擊。

一個(gè)客戶(hù)端的用戶(hù)輸入

我們來(lái)探究下HTML頁(yè)面是如何安全的防護(hù)用戶(hù)輸入。在下面這個(gè)例子中,我們會(huì)使用HTML中的Thymeleaf來(lái)編碼,然后在頁(yè)面中的div標(biāo)簽的text屬性中輸出username的值。

  1. <html xmlns:th="http://www.thymeleaf.org"> 
  2. <head> 
  3. <title>AngularJS - Escaping the Expression Sandbox</title> 
  4. </head> 
  5. <body> 
  6. <div th:text="${username}"></div> 
  7. </body> 
  8. </html> 

如果username的值是alert('Rob'),輸出的頁(yè)面就是以下的樣子:

  1. <html xmlns:th="http://www.thymeleaf.org"> 
  2. <head> 
  3. <title>AngularJS - Escaping the Expression Sandbox  
  4. </title> 
  5. </head> 
  6. <body> 
  7. <div>&lt;script&gt;alert(&#39;Rob&#39;)&lt;/script&gt; 
  8. </div> 
  9. </body> 
  10. </html> 

可以看到,輸出的內(nèi)容都被HTML編碼了,這就是說(shuō),目前為止這個(gè)應(yīng)用對(duì)xss攻擊是可以防御的。

添加AngularJS

當(dāng)前,我們的應(yīng)用可以防護(hù)xss攻擊。接下來(lái),我們加入AngularJS來(lái)改下:

  1. <html xmlns:th="http://www.thymeleaf.org"> 
  2. <head> 
  3. <title>Angular Expression - safe</title> 
  4. <script src="angular-1.4.8.min.js"></script> 
  5. </head> 
  6. <body ng-app> 
  7. <div th:text="${username}"></div> 
  8. </body> 
  9. </html> 

你可以發(fā)現(xiàn),有兩處修改了:

1. 引入了angular-1.4.8.min.js

2. 給body元素添加了ng-app

現(xiàn)在,我們的應(yīng)用就很容易受到xss攻擊了,但是,我們?cè)撊绾喂裟?

就像我們?cè)诤?jiǎn)介中介紹的那樣,如果把username改成1+2={{1+2}}會(huì)怎么樣呢?

結(jié)果如下:

  1. <html> 
  2. <head> 
  3. <title>Angular Expression - safe</title> 
  4. <script src="angular-1.4.8.min.js"></script> 
  5. </head> 
  6. <body ng-app=""> 
  7. <div>1+2={{1+2}}</div> 
  8. </body> 
  9. </html> 

Angular將會(huì)把DOM解析成如下:

  1. <html> 
  2. <head> 
  3. <title>Angular Expression - safe</title> 
  4. <script src="angular-1.4.8.min.js"></script> 
  5. </head> 
  6. <body ng-app=""> 
  7. <div>1+2=3</div> 
  8. </body> 
  9. </html> 

可以看到括號(hào)里面的表達(dá)式被運(yùn)行了,我們現(xiàn)在把username換成{{alert('Rob')}}試試,但是這樣做被表達(dá)式沙盒攔截了。此時(shí),我們可以認(rèn)為我們寫(xiě)的頁(yè)面是安全的,因?yàn)橥{語(yǔ)句被攔截了。

表達(dá)式沙盒化

在AngularJS中,沙盒化的目的并不是為了安全,更主要的是為了分離應(yīng)用,例如,用戶(hù)在獲取window的時(shí)候是不被允許的,因?yàn)檫@樣可以避免在你的程序中引入全局變量。

但是,如果在表達(dá)式被處理之前,有攻擊者修改了頁(yè)面模板,這樣的情況沙盒是不會(huì)攔截的。也就是說(shuō),這種情況下,任何在花括號(hào)內(nèi)的語(yǔ)句都能被執(zhí)行,

所以Angular官方建議開(kāi)發(fā)這類(lèi)應(yīng)用時(shí),最好不要讓用戶(hù)可以修改客戶(hù)端模板。具體建議如下:

不要把客戶(hù)端和服務(wù)端模板混在一起

不要通過(guò)用戶(hù)輸入來(lái)動(dòng)態(tài)的生成模板

不要用$scope.$eval運(yùn)行用戶(hù)輸入內(nèi)容

可以考慮使用CSP(也不要只依賴(lài)于CSP)

這些意味著如果應(yīng)用頁(yè)面允許用戶(hù)的輸入修改到客戶(hù)端的模板中,那么這個(gè)頁(yè)面將很容易被xss攻擊,接下來(lái)我們來(lái)看看這個(gè)具體的例子:

繞過(guò)表達(dá)式沙盒

如果我們的payload被沙盒化了,我們?cè)撛趺礃永@過(guò)呢?

如果我們的username是以下的值,將會(huì)發(fā)生什么呢?

{{'a'.constructor.prototype.charAt=[].join;eval('x=1} } };alert(1)//');

}}

上面的例子中,通過(guò)覆蓋原始函數(shù)charAt,我們就可以繞過(guò)Angular的表達(dá)式沙盒,并且執(zhí)行我們的語(yǔ)句alert(1)。具體的攻擊原理可以參考http://blog.portswigger.net/2016/01/xss-without-html-client-side-template.html。

注意,這些測(cè)試只是在Chrome和AngularJS1.4.8中成功。在其他的瀏覽器中不知道能不能成功。

結(jié)論

如果服務(wù)端允許用戶(hù)輸入到Angular模板,這將會(huì)讓你的應(yīng)用陷入xss的攻擊中。不過(guò)話說(shuō)回來(lái),最好不要把服務(wù)端的用戶(hù)輸入和客戶(hù)端模板混合起來(lái)。關(guān)于這點(diǎn)你可以從這篇文章里面了解詳細(xì)的內(nèi)容https://github.com/rwinch/angularjs-escaping-expression-sandbox

責(zé)任編輯:藍(lán)雨淚 來(lái)源: FreeBuf
相關(guān)推薦

2014-01-05 17:41:09

PostgreSQL表達(dá)式

2009-10-12 10:11:08

Lambda表達(dá)式編寫(xiě)

2024-03-25 13:46:12

C#Lambda編程

2018-09-27 15:25:08

正則表達(dá)式前端

2020-09-04 09:16:04

Python正則表達(dá)式虛擬機(jī)

2009-09-09 17:45:07

Linq表達(dá)式

2009-09-11 09:48:27

Linq Lambda

2009-09-17 14:21:19

LINQ表達(dá)式

2009-09-11 12:32:33

LINQ表達(dá)式

2009-07-03 18:31:04

JSP表達(dá)式

2009-09-09 13:01:33

LINQ Lambda

2009-09-10 15:35:07

LINQ查詢(xún)表達(dá)式

2009-09-15 15:18:00

Linq Lambda

2011-10-28 16:34:13

LINQ

2022-12-05 09:31:51

接口lambda表達(dá)式

2013-10-23 13:25:28

AngularJS應(yīng)用

2024-09-14 09:18:14

Python正則表達(dá)式

2024-09-23 20:00:00

正則表達(dá)式Python

2020-10-14 10:18:05

Python三元表達(dá)式代碼

2010-03-25 18:25:36

Python正則表達(dá)式
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)