Web安全之初識XSS

同源策略

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

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

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

什麼是XSS

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

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。bash

XSS分類

  1. 反射型XSS 反射型XSS只是簡單地把用戶輸入的數據」反射「給瀏覽器。也就是說黑客每每須要誘使用戶」點擊「一個惡意連接,才能攻擊成功。反射型XSS也叫」非持久型XSS」。
  2. 存儲型XSS 存儲型XSS會把用戶輸入的數據「存儲」在服務器端。這種XSS具備很強的穩定性。 比較常見的,黑客寫下一篇包含惡意JavaScript代碼的博客文章,文章發表後,全部訪問該博客文章的用戶,都會在他們的瀏覽器中執行這段惡意的JavaScript代碼。黑客把惡意腳本保存在了服務端,這種XSS攻擊就叫作「存儲型XSS」。存儲型XSS也叫作「持久型XSS」。
  3. 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事件,最後再用註釋符「//」註釋掉第二個引號。 輸入後,頁面代碼變成了:xss

<a href="" onclick="alert(/xss/)" '>testLink</a>
複製代碼

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

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

'><img src=# onerror=alert(/xss2/) /><'
複製代碼

頁面代碼變成

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

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

相關文章
相關標籤/搜索