WEB 安全 - xss 初探

零、參考資料

  1. 網絡攻擊-XSS攻擊詳解;
  2. 前端安全之XSS攻擊

 

1、概念

  跨站腳本攻擊Cross-site scripting (XSS)是一種安全漏洞,攻擊者能夠利用這種漏洞在網站上注入惡意的客戶端代碼。當被攻擊者登錄網站時就會自動運行這些惡意代碼,從而,攻擊者能夠突破網站的訪問權限,冒充受害者。(轉自 MDN)。javascript

  在如下2種狀況下,容易發生XSS攻擊:1)數據從一個不可靠的連接進入到一個web應用程序。2)沒有過濾掉惡意代碼的動態內容被髮送給web用戶。html

  惡意內容通常包括 JavaScript,可是,有時候也會包括HTML,FLASH。XSS攻擊的形式千差萬別,可是,它們的共同點爲:將一些隱私數據像cookie、session發送給攻擊者,將受害者重定向到一個由攻擊者控制的網站,在受害者的機器上進行一些惡意操做。前端

 

2、攻擊

  xss 的攻擊分爲 3 種:反射型、持久性、DOM 型。java

 

1.反射型

  反射型的攻擊通常出如今 URL 中。這是一種非持久性的攻擊,一般將 xss 代碼添加至請求 URL 中,做爲參數提交到服務器,服務器解析並響應。響應結果中若是包含 xss 代碼,則在瀏覽器中可能會被解析出來並執行。因此這種類型的 xss 攻擊分爲三個階段: url 中植入 xss 代碼,而後服務器端解析,最後瀏覽器解析並執行 xss 代碼。 node

 

  舉個例子:web

http://localhost:8080/helloController/search?name=<script>alert("hey!")</script>

http://localhost:8080/helloController/search?name=<img src='w.123' onerror='alert("hey!")'>

http://localhost:8080/helloController/search?name=<a onclick='alert("hey!")'>點我</a>

  使用  node.js 搭建的一個簡單服務器:chrome

var http = require('http');
var url = require('url');

var server = http.createServer((req, res) => {
  
  res.writeHead(200, {
    // 注意 Content-type 的值, 
    // text/plain 中代碼會被包含在 <pre></pre>塊中而達不到攻擊效果
    "Content-type":"text/html; charset=utf-8" 
  });

  var params = url.parse(req.url, true).query;

  if (params.name) res.write(`<div>${params.name}</div>`);
  
  res.end();

});

server.listen(9999);

使用 chromium 引擎的瀏覽器(chrome, 360 急速模式)均做過特殊處理,會進行攔截,firefox、ie 則沒有攔截,故建議在 firefox 下測試。數據庫

  

  結果以下:瀏覽器

 

 

2.存儲型

  存儲型XSS,也叫持久型XSS,主要是將XSS代碼發送到服務器(無論是數據庫、內存仍是文件系統等。),而後在下次請求頁面的時候就不用帶上XSS代碼了。最典型的就是留言板XSS。用戶提交了一條包含XSS代碼的留言到數據庫。當目標用戶查詢留言時,那些留言的內容會從服務器解析以後加載出來。瀏覽器發現有XSS代碼,就當作正常的HTML和JS解析執行。XSS攻擊就發生了。安全

  經常使用來獲取用戶信息,如:

   張三發了一篇帖子,李四進行回覆:但內容倒是一段js腳本,這篇帖子被他人瀏覽的時候就會中招,例子中的只是一個alert(),但腳本能夠寫的比較複雜一點盜用用戶cookie等等操做。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <table border="1" width="80%">
    <tr>
      <td>張三</td>
      <td>1樓</td>
    </tr>
    <tr>
      <td colspan="2">xss 攻擊三</td>
    </tr>
    <tr>
      <td>李四</td>
      <td>2樓</td>
    </tr>
    <tr>
      <td colspan="2">try it again<script>alert('持久化 xss')</script></td>
    </tr>

  </table>
</body>
</html>

    

   另外,除了這種hacker還有個很慣用的伎倆,例如存儲型XSS生成一些誘人的圖片,文字(你懂的!),而後用戶去點擊的時候就能夠執行某些壞事,竊取信息或者誘導到釣魚網站,如:

< img onclick="window.location.href='http://www.baidu.com'" width='300' src='img/webwxgetmsgimg.jpg'/>

 

 

    也能夠經過在<head></head>中植入重定向的scriptl來劫持流量實現惡意跳轉,如:

<script>window.location.href="http://www.baidu.com";</script>

 

3、防範

  1. 入參字符過濾:
      在源頭控制,把輸入的一些不合法的東西都過濾掉,從而保證安全性。如移除用戶提交的的DOM屬性如onerror,移除用戶上傳的Style節點,<iframe>, <script>,<a>節點等;
  2. 出參進行編碼:
      後期補救了:像一些常見的符號,如<>在輸出的時候要對其進行轉換編碼,這樣作瀏覽器是不會對該標籤進行解釋執行的,同時也不影響顯示效果。例如:對<>作編碼如:"<"用:"&lt;",">"用:"&gt;"來代替;

  3. 入參長度限制:
      經過以上的案例咱們不難發現xss攻擊要能達成每每須要較長的字符串,所以對於一些能夠預期的輸入能夠經過限制長度強制截斷來進行防護。

  4. 設置cookie httponly爲true

 

4、其餘

  1.不過怎麼講呢,千里之堤,只要有一個蟻穴,整個堤壩就不安全。安全攻防雙方的博弈永遠不會中止,所以誕生了信息安全這一個領域,並不斷髮展。或者說任何事物自誕生之初就有其自己的缺陷,因而就出現了矛盾雙方的不斷轉化。

 

  2. Web For Pentester - 一個 web 腳本漏洞的演練平臺,介紹及安裝見:web for pentester介紹與安裝

相關文章
相關標籤/搜索