Xss漏洞常见绕过过滤攻击场景
- 字母大小写的运用
在某些情况下,后台作的过滤非常简单,只对一些特殊的字符串作黑名单过滤,导致可直接通过字母大小写绕过后台的过滤。如下例子
(1) 在某租房网站上,发布租房信息的地方,插入XSS测试语句。如下图:
(3) 脚本执行成功,获取cookie
2.+ ascii16进制形式的运用
当定位到输出会出现在HTML标签的属性之中。例如: … ,可尝试通过+ ascii16进制的方式绕过后台的过滤,如下举例:
(1) 如双引号未被过滤,可考虑使用引号结束字符串、引入该标签所支持的事件处理器,如: " οnclick="alert(1).
Code区域如下:
此时点击编辑框,alert(1)将会被执行。
(2) 如<>也未过滤,使用引号结束字符串、再结束前面的标签,引入弹框脚本: ">。
(3) 如”< >等都已经被过滤,则以上方法则行不通,如果输出在CSS中,可考虑+ ascii16进制形式的形式,因为CSS里,允许使用转义字符,如下例子:
由于这里如过滤了expression,可通过用expr\65ssion绕过。如添加以下脚本:expr\65ssion(eval(‘if(!window.x){alert(document.cookie);window.x=1}’))
效果如下:
注:基于 css expression 的XSS 已经进入暮年了,只有在IE6,7 下方能触发,受众面小,此处只是作为一个案例来讲。
3.html实体编码的运用
在XSS中html实体编码的应用也是绕过过滤的常用方法,如以下例子,输出点在:
(1) 在某网站可对视频下方的标签进行编辑。
(2) 测试时发现没有进行转义直接按照html输出到了页面导致标签被浏览器解释
(3) 添加标签发现前端有20个字符长度限制,后端是60个字节限制。并将所有小写字母替换为大写字母,也做了一些过滤(比如"<script"之类的)但并不全面。
(4) 通过测试发现:<img src="“onerror =SOME_JS_CODE>是有效的,并且onerror =后面的字符一定要是大写。
(5) 由于javascript是大小写敏感的,如果要使用<img src=”“onerror =alert(0)>来验证xss,会被过滤,此时尝试通过html实体编码的方式绕过,利用脚本修改为:<img src=”"onerror =alert(0)>,结果成功弹框。
4.html实体编码与URL编码结合运用
(1)对于onxxxx=“[输出]” 和 href=“javascript:[输出]” 来说与 没有太大区别。因为[输出]所在的地方,都是javascript脚本,如比较常见的<HTML标签 onXXXX=“…[输出在这里]…”>与xxxx 。以下例子中,以上2个情况一起出现了。 将以其中一种进行讲解。
看输出,如下,aaaaaaaa 出现在了2个点。
(2)以上例子在οnkeydοwn=" [输出]"中,单引号已被过滤,可考虑进行转义为实体字符绕过。
提示:在HTML属性中,会自动对实体字符进行转义。一个简单的比方:
和
是等效的,换言之,只要上面的情况,没有过滤 &,# 等符号,就可以写入任意字符。
看缺陷点的代码,如下:
JS部分做以下构造,由于’被过滤,可将’写为 ‘。如下:
location.href=’…&searchvalue_yjbg=aaaaaa’+alert(1)+‘’
因为此处会过滤&#,接着把代码转换为 url 的编码。 &-> %26, # -> %23,最后利用脚本如下:
此时点击页面[GO]按钮触发
5.宽字节运用
输出在之间很多情况下,都是会过滤特殊字符,根据漏洞的实际情况,可考虑各种绕过,第一种方法,宽字节绕过。详看如下举例:
(1) 通过查看输入位置,考虑闭环前面语句,增加alert(1)弹框,输入脚本:”;alert(1);//。如下图,双引号转义了。
(2) 遇到这种情况,一般人估计会放弃了,因为此处已考虑了特殊字符过滤了,但观察编码方式,是gbxxxx系列的编码。
(3) 对于此种编码,靠考虑通过双字节方式绕过过滤,尝试在双引号前面增加一个字符,如:%c0%22;alert(1);
(4) 具体效果,弹框了
6.反斜线的运用
在
(2) 分别通过这两个参数增加双引号与反斜杠,发现双引号已被转义,但是反斜杠可正常使用,如下图:
(3) 此处可以控制的是 aaaa ,又不能用",那么可考虑使用 \,那么就可以抹掉 aaaa 后面的 双引号,如下:
(4) 但此处由于原来from参数原来的双引号被前面的闭环,导致语法错误,为了保证语句语法的正确性,可把bbb改变为数字,并且后面增加”//”注销后面的语句,如下:
(5) 但此时会提示错误,因为&符号的优先级高于=,无法进行这种赋值操作,并且由于from未定义,直接和1进行相等判断的话,会报错,错误是:“from”未定义。此方法无法实现。
(6) 可考虑把from定义成函数,在后面增加from函数的定义,这样就可以避免前面的报错,如下:
(7) 此时发现空格符也被转义了,那么可考虑//的方式绕过过滤,最终ss参数输入:aaa\,from参数输入:=1;alert(1);function//from(){}//,最终代码结构如下:
(8) 代码正常执行
7.换行符的运用
在
(2) 在url中的FilterValueAND参数输入检测字串,检查发现在
(3) 在此处发现<、>、”都已经被过滤,无法利用。再看其它地方,发现在注释的地方也存在输出点:
(4) 此时是否可以通过换行符,规避//的注销,执行注入语句,此时输入:%0aalert(1);//。代码变化为如下语句
(5) 脚本被执行,弹框。
8.宽字节、反斜线与换行符结合运用
(1)测试到某连接可存在的注入点,如下:
(2)根据前面的经验,可通过换行符,对第二处进行xss利用,如下:
(3)在js中字符串允许下面多行的写法,通过反斜线关联,故以上错误,在aaaa后面加反斜线即可解决。
(4)通过以上观察反斜线被过滤成了2个\,由于该用例使用的是gb2312编码,在前面提到双字的用法,可在此再次尝试,把其中一个反斜线去掉,构造利用脚本:aaaa%c0%5c%0aalert(1);//
(5)此时利用成功,弹框。
9.unicode、16进制、8进制编码运用
JS的字符串中的字符可以写为 unicode编码,比如譬如: < 可以表示为 \u003c 或\x3c, > 可以表示为 \u003e或\x3e,如不知道如何转义的,可使用工具进行转换,如gainover工具。那么在某些情况下,可通过unicode编码来绕过xss过滤。如下例子:
(1) 在url中的value参数输入aaaaa,通过检查代码发现其输出的地方,如下:
(2) 看上面代码中的5处,已通过验证分析只有一处可利用:
(3) 但此处<, >, " 都被过滤了, 用前面提到的某些技巧,似乎也无法直接XSS。此时在参数里输入反斜线不会被过滤,那么考虑通过unicode编码绕过,构造xss脚本如下:\u003cimg src=1\u0020οnerrοr=alert(1)\u003e
(4) 从上图可知,还是被转义了,无法利用成功,此时考虑<写为 \x3c, > 同样写为 \x3e,尝试是否可绕过。
(5) 通过源码分析没有过滤,弹框成功。
10.URL编码的运用
在某些情况下可通过对某些特殊字符进行URL编码来绕过过滤,如<可写为%3C,>可写为%3E,如下例子:
(1) 在此例子中分别在客户端与服务都对特殊字符如<、>、”进行了过滤,那么首先前端页面输入不包含特殊字符的字串,如下图:
(2) 再通过burpsuite工具拦截请求报文,将项目名称修改为:
sdfsd %3Cimg%20src=5%20οnerrοr=alert(1)%3E f.如下图:
(3) 重新发送报文后, 跨站脚本被执行,如下图:
11.base64编码的运用
(1) 使用到base64编码来进行绕过xss的过滤,一般会存在以下的两种情况:
(3) 这样当链接点击时页面以html/text的方式解析,然后单点击a链接时 base64的编码就被还原回: ,然后弹框:
(4) 在iframe里也同样可以使用!仅供参考。