本次练习网站:http://prompt.ml/
练习网站
要求:弹窗成功出现you win

输出在value内,首先闭合再进行prompt(1)的弹窗。
1"><script> prompt(1)script>


它过滤了一个完整的标签,当<…/> 存在便过滤为空。为此利用html的自动补全,单标签的>符号功能。



因为这里=与( 都被过滤了。因此我们可以使用Unicode编码,不使用html实体编码是因为它不能在JavaScript中使用回无效的。
关于call函数: call把eval绑定在绑定,直接用eval执行字符串,即等价于eval(`prompt(1)`)的执行
eval() 函数会将传入的字符串当做 JavaScript 代码进行执行
call传两个值:eval的指向,与eval执行的值
第一个传值为空时指向Windows的全局变量,后返回字符串prompt(1)。
因为指向全局变量,在全局中有prompt(1)函数,如此就执行这个函数
字符串是eval来执行的,最后返回的是给eval这个返回值
call收到一个值为空于是指向Windows的全局
aaaaa在Windows全局没有这个函数
这里直接将eval执行相当于别名调用,这里就想到与call方法强行指向prompt(1),但是js官网为了安全指向了全局,但是目前第二个参数没有传值,所有undefind。
call的传给指向与执行值
eval的别名:call在这传的值不是空,而是具体的值时就是他的别名。 JavaScript中默认别名指向全局
<script>eval.call`${`prompt\u00281)`}`script>


题目中我们将在注释中输入内容,为此考虑闭合注释。但是它过滤了–>的注释方法。为此我们可以使用–!>来闭合第一个注释。后面的注释可以不闭合不影响。
html注释:
1、
2、
JavaScript的注释
1、//
2、 开头使用 -->
解题:
--!><script>prompt(1)script>


题目要求有http://prompt.ml/,为此使用@来使用test.js文件来应用。

http://prompt.ml/@127.0.0.1/test.js


题目过滤了on.*=即一定程度上禁用了事假。但是对于html里的事件=换行使用仍然是有效的。
1" type="image" src=1 onerror
="prompt(1)


var segments = input.split(‘#’);
#其分割作用,即把http://httpbin.org/post分为组1,把{“name”:“Matt”}分为组2
var formURL = segments[0]; url取第一个组,就如http://httpbin.org/post
var formData = JSON.parse(segments[1]);:data取第二个组,即如{“name”:“Matt”}
form.action = formURL; form.method = ‘post’;
即:把URL给了action;模式设置为POST模式
随后进入循环var i in formData,把 formData的值赋值给i。
而后input.name=i,这个i就是fromdata对象里的key值,也就是name,
然后给value赋值为fromData的值,也就是Matt。
以上这些步骤就相当于创建了一个from表单。
>i:ignor 忽略大小写
创建form后进入下一个if的判断,条件上说明如果没有script或data数据的就无法进入下一步,而是直接判断结果。还有一点就是它要求了为action。
因为这个action会干扰我们直接使用JavaScript:prompt(1)后面{“name”:“Matt”}的输出。
不然因为这个action我们#后的{“name”:“Matt”}是无法显示的。但是我们可以重新定义这个action,将其覆盖之前它的action。也就是如果action的值相同的时候,后一个会把前一个给覆盖掉。
综上:
要有使用prompt与#的分割。
依照if的条件!/script:|data:/i.test(document.forms[0].action,使用#。
因此填写JavaScript:prompt(1)#{“action”:“Matt”}
JavaScript:prompt(1)#{"action":"Matt"}


题目获取到信息
1、title最多12个字符
2、连接符号是换行符,#分割开
3、join字符转字符串并且用换行符连接其中#分割开,但是为了绕过0-12的slice限制。利用注释把这个分为一段又一段,每段都在范围内。
"><script>/*#*/prompt(/*#*/1)/*#*/script>

/*">p>注意标签得完整不能分开
标签不完整会失去意义
1、不完整
2、不完整

Windows的\r\n联用,是换号并开头.
js接受unciode编码的2028行分隔符,2029段分隔符
avascript字符串允许直接输入字符,以及字符的转义形式。但是javascript中有5个字符规定了不能在字符串中直接使用,只能使用他们的转义形式
1、u005c:反斜杠
2、u000D:回车
3、u0028:行分隔符
4、u0029:段分隔符
5、u000A:换行符
题目将<,/ 和‘"’ 给过滤掉了,为此我们利用Unicode换行。
我们想输入的效果
prompt(1)
-->
为此通过Unicode换行在控制器转换再复制:
\u2028:行换行符
即: \u2028prompt(1)\u2028
输入转换的复制一下:
'prompt(1)-->



题目把字母全替换为大写了。为此可以使用svg,或者引用文件
<ſvg/οnlοad=prompt(1)>
<ſcript src="http://127.0.0.1/test.js">ſcript>




题目将prompt替换为了alert;'换为了空。利用这个’卡bug,就是出入到prompt中就变成pro’mpt。因为替换为了空,就变成了prompt。
pro'mpt(1)


这里就是一个技巧"(prompt(1))in"会弹窗
"(prompt(1))in"


'替换为空,导致你如果用之前的方法prom‘’pt依然输入prompt,然后转为alertl了。
利用parseInt,是Javascript内置函数,原型为parseInt ( String s , [ int radix ]),用于解析一个字符串,并返回一个整数。
tostring()方法可把一个Number对象转换为一个字符串,并返回结果。
官方文档:
parseInt(string, radix) 解析一个字符串并返回指定基数的十进制整数,radix 是 2-36 之间的整数,表示被解析字符串的基数。
这个范围2-36是数字加上字母的,
相关文档:parseInt
eval(630038579..toString(30))(1)


这个题与之前的0x07相似不同是限制反而与过滤了*符号为空。为此不能使用
/* . . */的多行注释,可以使用实现多行注释。
字符数从#后面开始算
不可行:
1"><script> prompt(1)script>

这个如同显示已经注释了,但是没有成功。为此更改了模块字符串形式。
"><script>`${prompt(1)}`script>

解释第一次尝试出错原因:
1"><script> prompt(1)script>
关于上面的注释,我们最终想输入的效果是下图
<script>prompt(1)script>

但是当我们使用注释符号的时候

可见script标签内的 的注释没有生效。其实原因很简单。其中一个是因为script只能容纳文本,另一个原因是script标签内是js格式,而这个是html的注释是无法识别的。
在js中的注释
// 注释单行
/**/ 注释块和注释多行
此外我还在网上发现利用命名空间的转换,可以使用script内的html标签生效。
1"><svg><script> prompt(1)script>

HTML 解析器可以创建一个包含三个命名空间元素的 DOM 树:
- HTML 命名空间 (
http://www.w3.org/1999/xhtml)- SVG 命名空间 (
http://www.w3.org/2000/svg)- MathML 命名空间 (
http://www.w3.org/1998/Math/MathML)
默认情况下,所有元素都在 HTML 命名空间中;但是,如果解析器遇到or元素,则它分别“切换”到 SVG 和 MathML 命名空间。并且这两个命名空间都会产生外部内容。
其中svg如同xml格式,因此接受xml语法。xml的注释符与html一样的,xml接受编码。
xml文件 注释
第一种(单行):
第二种(多行):
第三种(多行):
由上发现xml的注释含有html的所有注释,为此xml文件是支持html注释的。为此转换为svg可以使生效