buuctf [第二章 web进阶]XSS闯关
本题每一关都需要我们使用alert弹窗
level1
URL为
http://7db5b895-7c64-4b97-a85e-bc011762312f.node4.buuoj.cn:81/level1?username=xss
查看源码可知get传的username直接被输出
所以直接注入js代码即可
?username=<script>alert(1)</script>
level2
level2对输入的username使用escape进行了编码,如果直接注入js代码就没法执行了
观察前面的var username='xss';
,如果我们注入
?username=xss';alert(1);'xss
那么前面的代码中两个单引号就会被闭合,并执行以下代码,pass
var username='xss'; alert(1); 'xss';
level3
仍然使用level2注入的username=xss';alert(1);'xss
,但是没有pass。查看源代码,发现第一个单引号被转义了
那么给它再加一个单引号就行了
?username=xss'';alert(1);'xss
解释为
var username = 'xss\'';alert(1);'xss';
level4
查看源码,本题将获取到的jumpUrl的值作为目标地址,倒计时结束后使用location.href进行重定向。
使用伪协议,javascript:alert(1)将javascript后面的部分当成js代码,倒计时为0时,网页便会重定向到javascript:alert(1)执行alert(1)
?jumpUrl=javascript:alert(1)
level5
看源码,填写的表单名为autoForm。如果autosubmit的值非空,并且action的值非空,那么autoForm.action(表单提交的目标地址)就是action的值,否则目标地址是当前页。
所以只要让autosubmit的值非空,action的值为伪协议,即可将表单提交到javascript:alert(1),实现弹窗
?autosubmit=1&action=javascript:alert(1)
level6
尝试?username=<script>alert(1)</script>
不成功,查看源码,<
是将左尖括号进行了unicode编码
看到源码引入了一个js
该js为AngularJS框架,其思想是基于html编写模板
而该模板存在xss模板注入漏洞,当输入?username={{4*3}}
时会被计算
由此构造一个定式payload
?username={{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1)//');}}
chatGPT给出的解释为
具体来说,该代码将字符串 'a'.constructor.prototype.charAt=[].join; 赋值给了 $rootScope 对象的原型上的 charAt 方法。这样,在后续的代码执行中,如果有类似 'a'[index] 这样的表达式出现,就会被转化为 ['a'].join('')[index],从而执行任意代码。 接着,代码通过调用 $eval 方法来执行包含恶意代码的字符串 'x=1} } };alert(1)//'。其中,由于该字符串包含了一个未闭合的 JavaScript 函数,因此 $eval 方法在解析时会自动将字符串补足缺失的括号。最终,该字符串将被解析为如下的 JavaScript 代码: x = 1; // 执行恶意代码 } // 下述代码已经失效 // } // ; alert(1); // 输出弹窗
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!