XSS漏洞解析与挖掘

漏洞简介

跨站脚本攻击又名XSS,全称为Cross Site Scripting,为了区别层叠样式表(CSS)所以简称XSS。XSS漏洞是指恶意攻击者向Web界面插入恶意的Script代码,当被攻击者访问该界面时触发恶意的Script代码,从而完成恶意攻击者的攻击。

XSS漏洞是Web应用系统中出现频率最多的漏洞之一,图1为OWASP项目提出的”十大Web应用安全风险”,简称为OWASP Top 10。OWASP Top 10对安全问题从威胁和脆弱性进行可能性分析,并结合技术和商业影响的分析,输出目前一致公认、最严重的十类web应用安全风险排名。可以看到图片中分别为2013年版以及2017年版,XSS漏洞分别出现在A3以及A7,虽然较2013版排名有所滑落,但是仍挤在十大Web应用安全风险之列。

(图 1)

漏洞风险

XSS漏洞可导致用户的认证信息被盗,被钓鱼,挂马,还可以组合CSRF漏洞造成更严重的漏洞,如控制业务数据增删改查等等,当然也可以配合其他漏洞进行更深层次的渗透攻击,内网渗透等等。

漏洞分类

首先我们介绍下常见的XSS漏洞的分类,通常分为三大类型,反射型XSS,存储型XSS,以及DOM型XSS。

反射型XSS:非持久化攻击,恶意攻击者在url链接构造好攻击链接,但是需要引导被攻击者去访问触发攻击脚本,当被触发后不可二次触发。

存储型XSS:持久化攻击,恶意攻击者通过Web界面的可编辑存储功能向服务器插入恶意代码。如留言板,个人信息编辑功能等等。每当被攻击者访问该功能界面都会触发恶意代码。

DOM型XSS:DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞。允许程序或者脚本动态的访问或者更新文档内容,经过DOM解析触发XSS攻击,DOM型XSS不同与反射型XSS和存储型XSS,DOM型XSS不需要服务端参与解析响应,只是通过浏览器端的DOM进行解析。

漏洞原理

从白盒的角度上分别解析下三类漏洞。

反射型XSS示例代码如下(图 2)

(图 2)

前端提供了表单的输入,通过GET请求提交传入的xss参数,后端对截取的xss参数进行输出,由于没有对用户输入的xss参数未进行过滤,可直接构造XSS攻击脚本触发。

存储型XSS示例代码如下:(图 3)

(图 3)

前端表单可传入xss参数,将传入的xss参数保存在数据库中,在触发端界面调用数据库的内容,我们看到输入输出端都没有进行有效的过滤,则构造XSS攻击脚本存储在服务器,在前端界面调用该内容,造成XSS漏洞。

DOM型XSS示例代码如下:(图 4)

(图 4)

后端将传入的name值重新定义,在前端输出部分重新定义一个属性,该属性可能是一个带有JS代码的事件处理程序。将获取text的值输出在print内,而text的值有来源于name,DOM-XSS 的数据流向是:URL-->浏览器,前后端均没有对传入的参数进行过滤控制,则构造XSS攻击脚本可直接触发XSS攻击。

漏洞输出形式

根据上面XSS定义的阐述,我们可以得知XSS漏洞的产生是由于没有控制用户的输入,不管是存储型XSS还是反射型XSS。反射型XSS通常参数可被用户定义,且该参数的值能够回显到HTML中。通常出现在网站查询功能等。存储型XSS一般可提交内容保存到服务器,如个人信息修改,论坛发帖,留言等等。

至于XSS的输出,主要分以下两种情况,「结果输出在标签之间」,「结果输出在标签之内」,如图5,输出的内容显示在<pre>标签之间。

(图 5)

另外一种情况为「输出的内容在标签之内」,如图6,输出的结果在<input>标签内部。

(图 6)

两种结果输出方式决定了如何去构造XSS攻击脚本。「结果输出在标签之间」可直接构造攻击脚本;「结果输出在标签之内」,如果要触发XSS攻击,需要闭合语句再构造语句,如图6所示,需要闭合语句,闭合方式和SQL注入较为类似。

如何让区分「结果输出语句在标签内」和「结果输出语句在标签外」,查看该浏览器输出段的源代码,以查询功能为例,随意输入内容,查看该内容在前端源代码的显示位,(图7)我们可以看到结果输出位在标签之间。

(图 7)

漏洞挖掘

判断XSS的输出方式,根据输出方式选择XSS的构造方法。一些网站在开发时会对一些传参进行简单的控制,如使用黑名单的方法控制过滤用户传入的参数。如图8为例,对传入的数据进行正则匹配过滤,函数用于正则表达式的搜索和替换,这使得双写绕过、大小写混淆绕过不再有效或过滤敏感的关键词。

(图 8)

(图 9)

『黑名单』本身就是存在缺陷的,从上面的代码可以发现,如果构造的脚本不触发黑名单的规则,则攻击仍会执行。以图8为例,虽然对script对大小写混写,双写绕过进行了绕过,但是并未对其他的标签进行过滤,如<a><img><svg>等标签进行安全防护,图9等同,虽然过滤了大部分的常见关键词,但是仍然存在很多的遗漏。如触发事件on系列就存在以下很多种的触发方式(图10),如遇到以上过滤,可尝试不同的触发事件进行绕过。

(图 10)

针对黑名单过滤,主要以尝试为主,尽可能的找寻黑名单以外的标签或事件。除了全面的尝试,还存在其它可绕过XSS过滤的方法。

首先说一下HTML实体编码绕过,在 HTML 中,某些字符是预留的。是用一个编号写入 HTML代码中来代替一个字符,在使用浏览器访问网页时会将这个编号解析还原为字符以供阅读,如果过滤了<>,我们可以使用HTML实体编码绕过(图11)。

(图 11)

以十进制,或十六进制等进行编码,十六进制需要以&#x开头。假设alert被过滤,Payload即可使用十进制进行编码。

<img/src=1 onerror=alert(1)>

但是如果XSS的参数在GET请求中,需要注意的是,&字符以及#字符在URL的解析中都是存在特殊含义的,所以需要对该字符进行URL编码。

当然还可以使用字符集进行绕过,如UTF-7,US-ascll,UTF-16等浏览器支持的字符集进行payload的编码。如使用UTF-7编码攻击脚本。

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

还可以使用JS转义,假使过滤了alert这个关键词。使用Unicode转义关键字中的字符,如使用l的unicode编码\u006c,构造的攻击脚本。

<script>a\u006cert(1);</script>

另一个可以绕过的就是空字符,空字符 (%00) 使得过滤器不能看到完整的 <SCRIPT> 标签,但是只适用 IE 6.0, IE 7.0 。

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

使用evel函数来动态构造字符串。

<script>evel(‘al’+’ert’(1))<script>

当然还可以适当的使用空格回车以及TAB键进行插入,执行成功主要是依托与JS的特性,JS主要以分号结尾,如果执行时碰到TAB等会继续向下执行,直至分号结尾,构造出Payload。

<img/src=javascript:alert(1)>

大小写混写有的时候也许也是一线生机。

<ImG/SrC=1 OnerrOr=alErt(1)>

有时还会碰到这种情况,当闭合语句时,输入单引号,双引号,但是却回显为\’,\”。这种情况一般都出现在PHP的网站中,主要是因为PHP中开启了magic_quotes_gpc,开启后会把一些特殊字符进行轮换,这个时候我们可以使用javascript中的String.fromCharCode(...)进行绕过。假设alert被过滤,可使用String.fromCharCode(...)进行绕过,tring.fromCharCode()是javascript中的字符串方法,用来把ASCII转换为字符串构造payload。

<script>String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88,83, 83, 34, 41, 59)</script>

使用base64进行编码,构造出的payload如下

<META HTTP-EQUIV="refresh" CONTENT="0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K">

在构造一些XSS攻击脚本时会调用空格,如空格被过滤可使用/**/进行替换

<img/src=1/**/onload=alert(1)>

测试思路

上面介绍了方法,总结一下如何去挖掘XSS。

以搜索框为例,可以先尝试输入一些闭合字符检测程序是否会报错,或者直接插入标签检测是否响应。闭合字符为单引号’,双引号”,尖括号<>等等,直接插入标签,如<br><h1>标签等等。闭合字符主要对应的场景是「结果输出在标签内」,直接插入标签对应的场景是「结果输出在标签外」。

比较常用的一个检测字符串'';!--"<XSS>=&{()}。可以用此字符串检测是否闭合以及页面是否异常。

接下来插入带有攻击载荷的标签,也可以插入<h1>标签进行检测。插入后检测标签是否响应,接下来再输入攻击脚本,检测标签是否被过滤,如若被过滤可更换各类标签、事件等或对Payload进行编码混淆处理。

工具介绍

进行手动XSS的挖掘可以配合使用HackBar去进行XSS检测,Hackbar提供了几种常见XSS的编码混淆方式。图12为Hackbar界面。

(图 12)

当然也可以选择更方便的自动化检测工具,如XSStrike、XSSFork、XSSer等等,可直接进行XSS的扫描探测。图13为XSStrike的操作界面。

(图 13)

XSS防御

至于XSS的防御,刚才也大概的提及到几点,目前XSS的主要防御方法是对输入(和URL参数)进行过滤,对输出进行编码。如没有类型要求的话,尽可能的使用白名单去防御XSS。针对Cookie的安全防护,可以使用HttpOnly属性去进行安全控制。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • 之前积累了XSS 有一段时间,因为目前开始了一件有趣的工程,需要整合非常多的知识,其中Web 安全这一块出现最多的...
    刀背藏身阅读 9,031评论 0 16
  • 浅谈XSS—字符编码和浏览器解析原理 XSS简介 XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascadin...
    Smi1e_阅读 4,628评论 2 3
  • 漏洞挖掘与利用 测试环境的搭建 引言 为什么要搭建本地测试环境?我想下面的东西能够回答你的疑惑。 第二百八十五条 ...
    作业没写完阅读 3,170评论 0 4
  • 跨站脚本(XSS)是web应用中的一种典型的计算机安全漏洞。XSS允许攻击者可以在其他用户浏览的web页面中注入客...
    留七七阅读 7,893评论 1 26
  • 2017年9月14日,也就是司法考试的前两天。因为确定要转行,我决定放弃法律专业,放弃司法考试。这意味着放弃从本科...
    童言AND无忌阅读 645评论 15 6