Web安全之初識XSS

同源策略

在介紹XSS以前首先來了解一下同源策略,由於它是瀏覽器最核心也最基本的安全功能。php

同源(協議、host(域名或IP地址,若是是IP地址則看做一個根域名)、端口號相同)策略限制了來自不一樣源的"document"或腳本,對當前"document"讀取或設置某些屬性。html

script、img、iframe、link等標籤均可以跨域加載資源,它其實是由瀏覽器發起了一次GET請求。不一樣於XMLHttpRequest的是,瀏覽器限制了JavaScript的權限,使其不能讀、寫返回的內容。XMLHttpRequest受到同源策略的約束,不能跨域訪問資源。跨域

什麼是XSS

XSS攻擊,一般指黑客經過"HTML注入"篡改了網頁,插入了惡意的腳本,從而在用戶瀏覽網頁時,控制用戶瀏覽器的一種攻擊。一開始,這種攻擊的演示案例是跨域的,因此叫作"跨站腳本",如今是否跨域已經再也不重要,可是名字一直沿用下來。瀏覽器

XSS示例

假如用戶輸入的參數直接輸出到頁面上:安全

<?php

$input = $_GET["param"];
echo "<div>".$input."</div>";

?>

用戶提交了一段HTML代碼服務器

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

alert(/xss/)就會在頁面中執行。xss

這就是XSS的一種:反射型XSS。spa

XSS分類

  1. 反射型XSS

反射型XSS只是簡單地把用戶輸入的數據」反射「給瀏覽器。也就是說黑客每每須要誘使用戶」點擊「一個惡意連接,才能攻擊成功。反射型XSS也叫」非持久型XSS」。code

  1. 存儲型XSS

存儲型XSS會把用戶輸入的數據「存儲」在服務器端。這種XSS具備很強的穩定性。
比較常見的,黑客寫下一篇包含惡意JavaScript代碼的博客文章,文章發表後,全部訪問該博客文章的用戶,都會在他們的瀏覽器中執行這段惡意的JavaScript代碼。黑客把惡意腳本保存在了服務端,這種XSS攻擊就叫作「存儲型XSS」。存儲型XSS也叫作「持久型XSS」。htm

  1. DOM Based XSS

經過修改頁面的DOM節點造成的XSS,稱之爲DOM Based XSS,從效果上來講也是反射型XSS,單獨劃分出來是由於它的造成緣由比較特殊,發現它的安全專家提出了這種類型的XSS。出於歷史緣由把它單獨做爲一個分類了。

DOM Based XSS示例

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <script>
    function test() {
      var str = document.getElementById('text').value;
      document.getElementById('t').innerHTML = "<a href='" + str + "' >testLink</a>";
    }
  </script>

  <div id="t"></div>
  <input type="text" id="text" value="" />
  <input type="button" id="s" value="write" onclick="test()" />
</body>
</html>

輸入框構造以下數據:

' onclick=alert(/xss/) //

它先用一個單引號閉合掉href的第一個單引號,而後插入一個onclick事件,最後再用註釋符「//」註釋掉第二個引號。
輸入後,頁面代碼變成了:

<a href="" onclick="alert(/xss/)" '>testLink</a>

點擊新生成的這個連接,腳本將被執行。

其實還能夠選擇閉合掉<a>標籤,並插入一個新的HTML標籤:

'><img src=# onerror=alert(/xss2/) /><'

頁面代碼變成

<a href="">
  <img src="#" onerror="alert(/xss2/)"><''>
  testLink
</a>

腳本直接被執行,彈出/xss2/。

相關文章
相關標籤/搜索