第一关
somebody赋值运行结果
innerHTML函数的安全问题,<script>标签被过滤
换用<img>标签输入?somebody=<img src=1 οnerrοr="alert(1337)">成功弹窗
浏览器会解析 innerHTML
,从而导致 onerror
事件处理器被注入并执行,弹出 alert(1337)
的对话框
使用innerHTML,得到输出
使用innerText,得到输出
两者对比发现innerText函数比innerHTML函数安全,将标签直接当作文本输出
第二关
写入?jeff=tony";alert(1337);"成功弹窗
eval
中,没有进行任何清理或验证,攻击者可以通过操控 jeff
参数来执行任意 JavaScript 代码
eval
将执行 alert(1337)
,导致弹出对话框
以下是拼接后的代码
另一种方法,但输出有问题
代码debug正常
第三关
使用 replace(/[<>]/g, '')
过滤掉字符串中的 <
和 >
字符。
最终的字符串被设置为 uganda
元素的 innerHTML
,其中包含一个带有 placeholder
属性的 <input>
元素。
测试一下
可以使用onfocus和autofocus
输入?wey=tony" οnfοcus="alert(1337) autofocus="成功弹窗
第四关
ricardo.action
通过从 URL 中提取 ricardo
查询参数的值来动态设置表单的提交目标
setTimeout
函数在两秒后自动提交表单
ricardo.action
直接从 URL 中获取输入并用于设置表单的 action
属性,可以通过操纵 ricardo
参数的值来将表单提交
测试
输入?ricardo=javascript:alert(1337);
表单在两秒后提交时,会执行 javascript:alert(1337)
,弹出一个对话框
第五关
使用 replace(/[\(\
)\]/g, '')过滤掉字符串中的圆括号
()、反引号 ``
`` 和反斜杠 \
。
但用户输入设置为 innerHTML
编码了符号,无法执行,location变成字符串,然后编码实现
导致浏览器执行 onerror
事件处理器中的 alert(1337)
输入?markassbrownlee=<img src=1 οnerrοr=location="javascript:alert%25281337%2529">成功弹窗
第六关
balls = balls.replace(/[A-Za-z0-9]/g, '')
过滤掉 balls
字符串中的所有字母和数字字符。
选择编码绕过
alert(1337)的编码:
url encode编码:
输入
成功弹窗
第七关
函数构造
因为alert被过滤,使用ALERT,使用toLowerCase()函数将大写转小写
输入?mafia=Function(/ALERT(1337)/.source.toLowerCase())();成功弹窗
parselnt和toString函数使用
输入?mafia=eval(8680439..toString(30))(1337);成功弹窗
slice()截取函数
输入?mafia=eval(location.hash.slice(1))#alert(1337);成功弹窗