题目
function escape(s) {
return '<script>console.log("' + s.toUpperCase() + '")</script>';
}
解题报告
这题用 toUpperCase
把输入字符全部转换成大写了。
JS 标签对大小写是不敏感的,但是 JS 函数则是大小写敏感,这样会导致 alert()
函数失效。
其实这种题型有通解:利用 <svg>
标签构做实体编码解析进行绕过。
在网页编码中,以
&#ASCII;
称为实体编码,其中 ASCII 可以用十进制或十六进制表示。如(
的 ASCII 编码为 40 (或十六进制 0x28) ,那么(
或(
就是(
的实体编码。
其工作原理为:
toUpperCase
对实体编码本身的字符(如a
)进行大写转换,但是实体编码字符本身并没有对应的大写字符,因此不会起作用<svg>
再把实体编码解析为对应的 ASCII 字符
因此这题可构造这样的 payload :
");</script><svg><img src=0 onerror=alert(1); />
答案下载
- payload.js : 下载