通关要求弹出警告框alert(1337)
没有用户交互
不能使用外链接
在chrome中测试
Ma Spaghet!
通过分析代码我们可以看到它直接用innerHTML将接收的内容赋值
但是我们不能使用<script>标签因为:HTML 5 中指定不执行由 innerHTML
插入的 <script> 标签。
所以我们可以使用:<img src=x οnerrοr=alert(1337)>或者<svg οnlοad=alert(1337)>
Jefff
我们可以看到它通过eval()函数将我们输入的内容与原定的字符进行了拼接
并设置了在一秒后使用innerText添加进页面
innertext会使我们的标签以普通字符串进行展示
但是eval()函数会将传入的字符串当做 JavaScript 代码进行执行。并且可以传入多个参数
这样我们就可以先闭合之后写入分隔符再写入我们的恶意代码之后将后面的引号注释掉
我们最终得到的代码:";alert(1337)//
Ugandan Knuckles
它将<>进行了过滤
将我们输入的内容写入了input标签的placeholder属性中
我们可以利用onfocus(聚焦)事件
我们可以看到当我们点击到输入框时输入框会高亮此时就是聚焦了
结合上边我们的分析我们得到的payload:" οnfοcus=alert(1337) aoutfocus//
首先闭合 然后添加onfocus触发的事件 aoutfocus自动进行聚焦
Ricardo Milos
submit()
是一个用于表单元素的 JavaScript 方法,用于提交表单。当调用这个方法时,它会触发表单的提交操作,就好像用户点击了表单中的提交按钮一样。
它定义了一个action然后将我们输入进行了一个提交
所以我们的payload:?ricardo=javascript:alert(1337)
它之所以写submit()是因为只有进行了提交才能触发这个action
Ah That's Hawt
我们可以看到它将我们的()`等符号进行了过滤导致我们无法使用alert()
这里我们第一时间会想到的是html实体编码
但是我们发现它貌似并没有上传成功
在 URL 中,&
字符通常用作查询参数的分隔符,用于分隔不同的参数。如果我们想要在 URL 中包含 &
字符本身,而不是作为分隔符,通常需要对其进行编码。在我们提供的代码中,&
字符没有被编码,因此如果我们尝试将这段代码作为一个整体放在 URL 中进行上传,那么 URL 解析器可能会将其视为两个参数之间的分隔符,导致上传行为失败或者解析错误。
所以我们需要对&进行url编码
之后我们的payload:?markassbrownlee=<img%20src=x%20οnerrοr=alert%26%2340%3B1337%26%2341%3B>
Ligma
我们可以看到这个过滤比较狠将我们的大小写和数字都进行了过滤
这个过滤看起来让我们无计可施
jsfuck--一个很有意思的javascript特性
JSFuck 的设计者将它称为“把代码缩小到最小的表达”,因为它使用了 JavaScript 中最少的一组字符来表示完整的代码逻辑。
我们通过百度将我们的代码进行编译
我们会得出一个非常长的payload但是我们上传后依然不行
因为我们的 + 在url中被识别成了空格
所以我们需要对这段代码进行urlcode转码
我们得到了一段巨长无比的代码
Mafia
这里显然我们的jsfuck用不了了它将特殊字符进行了过滤并且限制了payload的长度
方法1
这里我们需要用到location.hash.slice(1)
location.hash是 JavaScript 中用于获取或设置当前页面 URL 中的片段标识符部分的属性。
片段标识符是 URL 中的一个特殊部分,它以#符号开头,常被用来表示文档中的某个特定位置或片段。
获取到后我们使用slice()函数进行截取#号之后的部分
所以我们的payload:?mafia=eval(location.hash.slice(1))#alert(1337)
方法2
我们可以使用转进制的方法将我们的字符转为数字
我们payload可以写成:?mafia=eval(8680439..toString(30))(1337)
其中的数字是什么呢?
我们可以看到使用toString()后数字转为了alert
这里使用的是parseInt()
第一个参数是我们要转换的字符串,第二个参数表示的是30进制
为什么要使用30进制,我们可以想想我们的16进制是什么,是0-9 A-F
所以我们的16进制在这里只能取到F如果我们的字符中包含t这样的字符,我们就需要使用到包含t的进制数,如果我们的字符中包含z我们就需要使用36进制
方法3
它虽然过滤了小写的alert但是大写它没有过滤
但是使用大写的话我们的js是严格区分大小写的没办法执行
但是如果我们将它以大写的形式传入之后转为小写是不是就可以执行了
所以我们的payload:?mafia=eval(/ALERT(1337)/.source.toLowerCase())
也可以写一个匿名的函数:?mafia=Function(/ALERT(1337)/.source.toLowerCase())()
Ok, Boomer
这里我们可以看到它将我们的传参通过DOMPurify过滤框架给过滤了
尝试写一个恶意代码
可以看到它的过滤框架吧我们的危险字符直接删除了
但是我们看到它下面写了一个setTimeout(ok, 2000)
这有什么用呢?
我们可以利用DOMCLOBBERING(dom破坏)
我们的payload可以写成:<a id=ok href=tel:alert(1337)>
tel是在这个过滤框架的白名单中