最近在对客户的一个网站进行渗透时,发现了一个有趣的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,如下图所示:

源链接

Hacking more

...