跨站脚本(Cross-site scripting,简称XSS),是一种迫使Web站点回显可执行代码的攻击技术,而这些可执行代码由攻击者提供、最终为用户浏览器加载。

0×00介绍

不同于大多数攻击(一般只涉及攻击者和受害者),XSS涉及到三方,即攻击者、客户端与网站。XSS的攻击目标是为了盗取客户端的cookie或者其他网站用于识别客户端身份的敏感信息。获取到合法用户的信息后,攻击者甚至可以假冒最终用户与网站进行交互。

XSS漏洞成因是由于动态网页的Web应用对用户提交请求参数未做充分的检查过滤,允许用户在提交的数据中掺入HTML代码(最主要的是“>”、“<”),然后未加编码地输出到第三方用户的浏览器,这些攻击者恶意提交代码会被受害用户的浏览器解释执行。

对于初学者而言,找漏洞最好是基于白盒审计进行,所谓白盒审计可以简单地理解为就是看着代码找漏洞,那么在正式挖洞前,我们先看看开源的DVWA给出的四种级别的XSS的源代码。

00×1基于dvwa的代码审计

DVWA 的代码分为四种安全级别:Low,Medium,High,Impossible。初学者可以通过比较四种级别的代码,接触到入门级别的代码审计的内容。

XSS主要可以分为两种,分别为反射型XSS和存储型XSS,DVWA中也是分开介绍的。两者的区别在哪儿呢?

反射型XSS:

    一般是url参数中的值能够回显到HTML中,且url的参数值没有过滤或过滤不严

存储型XSS:

    可以提交内容

    提交的内容可被管理员或其他用户看到

    提交的内容没有被过滤或过滤不严

我们这里在按照DVWA给出的代码进行介绍,先看看反射型XSS的代码:

Low级别代码

image001.png

分析关键代码:

image002.png

可以看到:

代码不经过滤与检查直接引用name参数,由此形成XSS漏洞

Medium级别代码:

image003.png

分析关键代码:

image004.png

可以看到:

代码使用str_replace()函数将输入中的<script>删除,希望借此来过滤不合法的输入

 

High级别代码:

image005.png

分析关键代码:

image006.png

可以看到:

代码使用preg_replace() 函数(该函数用于正则表达式的搜索和替换),来杜绝我们使用双写绕过、大小写混淆绕过代码设置的过滤规则

Impossible级别代码

image007.png

分析关键代码:

image008.png

代码中引入htmlspecialchars()函数把特殊字符如&、”、 ’、<、>转换为 HTML 实体,防止浏览器将其作为HTML元素,在根源上杜绝了XSS的发生

 

分析完了反射性XSS的源码,我们接下来看看存储型XSS的源码

Low级别代码:

image009.png

分析关键代码:

image010.png

代码中只是使用了trim()、mysql_real_escape_string()、stripslashes()等来对输入内容进行常规的处理,但是并没有对关于XSS的输入做特定的过滤与检查,并且直接存储于数据库,造成存储型XSS漏洞

 

Mdium级别代码

image011.png

分析关键代码:

image012.png

可以看到代码对两个参数不同的处理方式。对于message,使用htmlspecialchars()对其进行编码,无法再由此进行XSS,可是在name参数这边,只是用str_replace()过滤了<script>,XSS漏洞可由此参数引发

 

High级别代码:

image013.png

关键代码分析:

image014.png

引入了preg_replace()通过正则匹配的方式过滤了<script>标签,在<script>出杜绝了XSS,不过其他可以利用的标签如img等并没有过滤,因此可以利用来进行XSS

Impossible代码:

image015.png

分析关键代码:

image016.png

使用多个函数进行过滤处理,并且在最后使用htmlspecialchars()函数将其输入转换为HTML实体,但是要注意的是,如果htmlspecialchars函数使用不当,攻击者就可以通过编码的方式绕过函数进行XSS注入,尤其是DOM型的XSS。

 

0×02挖掘漏洞

注:下文的提到的漏洞均已获授权进行测试,并交由厂商修复。

一般来说,反射型XSS比较好找,不过危害也比较小,经常只是弹个窗之类的小伎俩,而存储型XSS相对而言比较难找,危害比较大,经常会盗取cookie,然后冒充正常用户登录。

接下来分别介绍三枚漏洞,两枚反射型,一枚存储型。

反射型XSS:

存在漏洞的url

image017.png

打开页面后我们在搜索框中构造XSS语句,点击搜索后,页面如图

image018.png

成功弹框,确认并利用了XSS

我们可以再看一下URL

image019.png

虽然部分字符被转义,但任然存在XSS漏洞

总结:直接在搜索框中构造XSS语句引发XSS漏洞,代码级别属于DVWA中的low级别。

这种级别的XSS很常见,再来一枚

存在漏洞的url:

image020.png

先闭合之前的语句,在构造我们自己的

image021.png

页面如图

image022.png

总结:第二枚漏洞类似于第一枚漏洞,代码级别相当于DVWA的low级别

这种XSS的危害一般都比较小,接下来展示一枚通过盗取管理员cookie进后台管理的存储型XSS

 

某网站“商户加入”页面未加过滤,可以插入我们搜集cookie用的短网址

管理员触发后拿到cookie

image024.png

直接登陆后台

image025.png

image026.png

总结:该漏洞通过存储型XSS盗取管理员cookie并用于登录后台,代码强度相当于DVWA中的Low级别。

0×03资源推荐

AppScan、AWVS、BurpSuite等大体量的工具都能检测出XSS,不过其实XSS有专门的检测工具,比如XSSER、XSSF等,大家都可以去尝试玩玩。

另外,freebuf上有师傅结合fiddler查找xss漏洞,传送门在这:http://www.freebuf.com/articles/web/30960.html

在《白帽子讲WEB安全》和《XSS跨站脚本攻击剖析与防御》中都有相当的篇幅详细介绍XSS,感兴趣的小伙伴可以去研究研究

另外在合天网安实验室也有丰富的资源可供学习:

《WEB防御中的代码安全》中的XSS防范实验http://www.hetianlab.com/cour.do?w=1&c=C172.19.104.182015120317290200001

《WEB攻防基础》中的XSS进阶实验http://www.hetianlab.com/cour.do?w=1&c=C9d6c0ca797abec2017070617054200001

0×04经验心得

有了工具、有了理论基础,在实战中还需要什么呢,没错,就是经验。经验不是一朝一夕得到的,也不是看书就能学会的,不过在这里表弟还是愿意给大家分享些自己挖洞过程中的心得、经验。

先说漏洞的检测

检测XSS一般分两种方法:一种是手工检测、一种是软件自动检测

手工检测:检测结果准确,但对于大型web来说无计可施

软件自动化检测:方便,但存在误报,且隐蔽的XSS无法检测出

所以我们一般都是手工+自动检测的,检测的关键点在于输出的数据在哪儿输入或者说输入的数据在哪儿输出(是不是有些绕?)

再来介绍下XSS绕WAF的姿势

每次挖漏洞的时候,最不可避免的就是绕过WAF,绕过WAF是小伙伴们挖洞的进阶之路。

有三种方法可以绕过WAF:

1、 暴力法

思路:大多数自动化工具就是这样,使用各种payload进行尝试。

2、 正则的逆向

思路:因为WAF通常使用正则进行过滤,所以通过逆向分析正则,推算出WAF的正则规则,从而绕过。

3、 浏览器漏洞 

思路:尝试老版本浏览器或者0Day来绕过。

具体的绕WAF的姿势就不展开来讲了,不然又是长篇大论,相信聪明的小伙伴们一定一点就会呢。

0×05防护措施

不要在页面中插入任何不可信数据,除非这些数已经据根据下面几个原则进行了编码

在将不可信数据插入到HTML标签之间时,对这些数据进行HTML Entity编码

在将不可信数据插入到HTML属性里时,对这些数据进行HTML属性编码

不可信数据插入到SCRIPT里时,对这些数据进行SCRIPT编码

在将不可信数据插入到Style属性里时,对这些数据进行CSS编码

在将不可信数据插入到HTML URL里时,对这些数据进行URL编码

使用富文本时,使用XSS规则引擎进行编码过滤


上面的话总结一下其实就是三条原则:

设置HTTP-only cookie,该cookie的属性能够阻止客户端脚本访问Cookie

对输入进行校验:对用户输入的一些特殊字符校验,过滤或者是编码

对输出进行校验:除了富文本之外,在变量输出到HTML页面,可以使用编码或者转义的方式来防御XSS

0×06声明

本系列文章旨在普及网络安全知识,提高小伙伴的安全意识的同时介绍常见漏洞的特征、挖掘技巧等。若读者因此做出危害网络安全的行为后果自负,与合天智汇及本人无关,特此声明。(PS:如需转载本文,请联系“合天智汇”)

作者:合天智汇