【alert(1) to win】 Level 07 - Skandia



题目

function escape(s) {
  return '<script>console.log("' + s.toUpperCase() + '")</script>';
}

解题报告

这题用 toUpperCase 把输入字符全部转换成大写了。

JS 标签对大小写是不敏感的,但是 JS 函数则是大小写敏感,这样会导致 alert() 函数失效。

其实这种题型有通解:利用 <svg> 标签构做实体编码解析进行绕过。

在网页编码中,以 &#ASCII; 称为实体编码,其中 ASCII 可以用十进制或十六进制表示。如 ( 的 ASCII 编码为 40 (或十六进制 0x28) ,那么 &#40;&#x28; 就是 ( 的实体编码。

其工作原理为:

  • toUpperCase 对实体编码本身的字符(如 &#97;)进行大写转换,但是实体编码字符本身并没有对应的大写字符,因此不会起作用
  • <svg> 再把实体编码解析为对应的 ASCII 字符

因此这题可构造这样的 payload :

");</script><svg><img src=0 onerror=&#97;&#108;&#101;&#114;&#116(1); />


答案下载


文章作者: EXP
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 EXP !
  目录