最近在对客户的一个网站进行渗透时,发现了一个有趣的xss。如下图所示:
当使用<script>
标签时发现被移除,如下图所示:
尝试使用<scriPt>
标签字母大小写绕过,发现还是被移除。如下图所示:
进一步使用233">alert(233)payload
测试发现alert
字符可以正常显示,但是()
圆括号被html实体化编码了。如下图所示:
于是尝试使用img
标签但是在测试时发现img
标签的src
属性也被过滤,如下图所示:
最后尝试使用<svg>
标签,利用<svg>
标签的onload
属性进行加载,如下图所示:
但是当添加=
时,发现/onload=
被替换为空,如下图所示:
于是想到对=
进行两次url编码但是发现同样还是被过滤,进一步测试发现当对=
进行三次url编码时,即可看到页面正常输出,如下图所示:
于是构造如下的payload:233"><svg/onload%25%32%35%25%33%33%25%36%34alert(233)>
,查看页面响应,发现()
已经被服务器进行html实体编码,但由于该实体编码位于<svg>
标签中,故可直接进行测试(因为<svg>
标签中可直接执行实体字符),当然此处也可使用:
233"><svg/onload%25%32%35%25%33%33%25%36%34alert`233`>
,这个payload进行测试。如下图所示:
可看到成功得到一枚xss,如下图所示: