一种基于模拟浏览器行为的xss漏洞检测方法

xiaoxiao2020-10-23  15

一种基于模拟浏览器行为的xss漏洞检测方法
【技术领域】
[0001]本发明设及一种基于模拟浏览器行为的XSS漏洞检测方法,属于计算机软件跨站 脚本漏洞领域。
【背景技术】
[0002] 近年来,随着Web应用的广泛使用,Web安全问题也日益突出。0WASP公布的2013 年十大Web应用安全风险中,跨站脚本漏洞XSSKrossSiteScripting)名列第S,该表明 XSS漏洞已成为当前各类网站需共同面对的常见的安全风险之一。
[0003]XSS漏洞的产生是由于来自用户的不可信数据被应用程序在没有进行验证,W及 反射回浏览器而没有进行编码或转义的情况下进行了处理,导致浏览器引擎执行了代码 时。很多网站在开发过程中忽略了必要的输入验证,缺乏足够的安全性,该样的网站就很容 易被跨站脚本攻击。通常攻击者会将恶意脚本提交到存在XSS漏洞的Web页面,当客户端 用户浏览该页面时,脚本会被浏览器自动解析执行,达到挂马、钓鱼、盗取用户Cookie、劫持 用户Web行为等目的,因此,对XSS漏洞的检测是非常必要的。
[0004] -般地,Web页面中可能存在XSS漏洞的地方称为注入点。如何在大量页面中找到 潜在的注入点并进行检测是防范XSS漏洞的关键之一,同时也是一项繁杂的工作。在网站 内容日益丰富的今天,人工检测注入点显然是不现实的,而需要尽可能采用自动化方法。网 络爬虫对于基于网络的自动化测试工具是重要的基础功能,它可W从一个起始U化开始, 通过分析网页的内容,运用相关算法找到新的U化并不断地循环抓取网页,直到满足一定 的结束条件,从而获取大量的页面W寻找注入点。找到注入点后,测试工具再构造攻击测试 请求发送给目标站点,并根据目标站点的回应信息来判断是否存在漏洞。
[0005] 目前针对自动化XSS漏洞检测工具的研究还不是很充足,传统的方法均是W静态 爬虫爬取页面,通过获取目标站点的目录结构、对各个页面的源码进行解析,将其中的表单 信息提取出来,W达到寻找注入点的目的。然而,注入点很可能隐藏在网页的动态内容中, 需要通过用户操作,如点击某个按钮,使浏览器解析化vaScript或加载Ajax才能生成。传 统爬虫由于无法模拟浏览器行为,很难解析化vaScript或加载Ajax,从而忽略了隐藏式注 入点。同时在页面解析时,它们还需要提取整个表单内容,获取表单的属性W分析向服务器 提交数据的方式才能提交攻击向量,比较复杂,并且在漏洞检测方面不能动态地分析目标 站点的回应信息,因此未必能判断出XSS漏洞是否存在。

【发明内容】

[0006]本发明采用动态分析,通过检查Web应用程序运行时的行为来检测XSS漏洞,设计 并实现了W化ost.py库为基础的爬虫框架。该系统框架使用黑盒测试判断XSS漏洞是否 存在的准确率更高。
[0007] 为达到W上发明目的,本发明采用的技术方案为一种基于模拟浏览器行为的XSS 漏洞检测方法,本方法完全由python语言在Windows64位系统上编写,在Windows64位 系统上正常运行。同时,本方法具有较强的通用型且支持其它操作系统。
[0008] 其中,一种基于模拟浏览器行为的XSS漏洞检测方法实现的系统包括爬虫模块、 漏洞检测模块两大模块;该两大模块又包含了若干子模块W实现核屯、功能,其中:
[0009] (1)爬虫模块包含页面探索模块和网页解析模块两个子模块,两个子模块共同使 用化ost.py作为浏览器引擎,共享U化列表并对其进行操作。页面探索模块实现探索页面 对功能,而网页解析模块则实现网页解析功能。页面探索模块使用递归的深度优先爬虫,不 断地循环抓取网页存入U化队列,直到将同域名下的页面全部访问完成,从而获取大量的 页面W寻找注入点;网页解析模块从URL队列中提取出页面的URL链接,将页面动态加载 完,并触发页面中的事件W获取化vaSricpt或Ajax生成的新的U化和注入点。其中,新的 U化也会存入U化队列,等待页面探索模块的访问。
[0010] 网页解析模块实现功能的步骤包括,
[0011] 1)事件的捜集,寻找网页中可能解析化vaScript和加载Ajax的点击事件并触 发;
[0012] 2)U化捜集,将新的U化放入待访问的U化列表用于探索页面;
[001引如注入点捜集,用于之后的漏洞检测。
[0014] (2)漏洞检测模块:该模块包含自动检测模块和漏洞判断模块两个子模块,两个 子模块共同使用化ost.py作为浏览器引擎,自动检测模块对注入点自动填充攻击向量,采 用的攻击向量为RSnake提供的化eat化eet,它包括多种绕过XSS检验的攻击向量。该些 经过设计的攻击向量提交后,执行结果交由漏洞判断模块来判断,如果存在漏洞的话,页面 会执行一个弹出提醒框的脚本,其内容为XSS,此时基于化ost.py引擎提供的wait_for_ aledO函数检测是否有提醒框出现,即可检测网页是否执行了脚本,直接判断出当前注入 点是否有漏洞。
[0015] 在探索页面前,还需要进行网页解析,将页面动态加载完,并触发页面中的事件W 获取化vaSricpt或Ajax生成的新的U化和注入点。其中的加载页面由化ost.py提供的 API完成,
[0016] 本系统使用Python的BeautifulSoup库来完成网页解析。BeautifulSoup是一 个用Python写的HTML/XML的解析器,用W处理不规范标记并生成剖析树,并且提供简单又 常用的导航,捜索W及修改剖析树的操作。
[0017] 综上所述,为了更好地进行自动化检测,本系统实现了W下两个方面的功能;①能 够解析化vaScript和加载AjaxW得到页面中隐藏式注入点的支持网络爬虫运行的框架。 ②通过提交攻击向量W判断XSS漏洞是否存在的高效方法。
[0018] 该核屯、库包括re,pywebfuzz,曲ost,bs4,pySide,pyQt,该些库在所有主流的操 作系统上运行,因此很好的实现跨平台移植。
[0019] 该系统完全采用python语言开发,具有易于维护和进行二次开发的特点,对XSS 漏洞的检测与研究有非常重要的应用价值。
【附图说明】
[0020] 图1系统总体架构(按模块)。
[0021] 图2U化处理模型设计。
[0022] 图3漏洞检测流程设计。
【具体实施方式】
[0023] 本方法的原理是基于化ost.py的对服务器的黑盒测试,它由爬虫模块和漏洞检 测模块两个部分组成。系统架构如图1所示。
[0024] 1. 1爬虫模块
[0025] 爬虫模块实现探索页面功能和网页解析功能。探索页面的爬虫使用本文提出的递 归的深度优先算法,仅挖掘同域名下的页面。该算法描述如算法1所示。
[0026] 算法1.页面探索的深度优先递归算法
[0027] 输入;起始网站U化
[002引输出;W输入U化为起点爬取到的所有同域名页面U化
[0029] 1.设置最大深度MAX_DEPTH;
[0030] 2.设置当前深度depth=0;
[003。 3.如果当前深度大于最大深度,结束;否则,执行步骤4 ;
[00础 4.访问当前U化;
[0033] 5.获取页面所有U化存入URL_List;
[0034] 6.如果URL_List为空,结束;否则执行步骤7;
[003引将URL_List中下一个U化作为当前URL当前深度加1,执行步骤3 ;
[0036] 在探索页面前,还需要进行网页解析,将页面动态加载完,并触发页面中的事件W 获取化vaSricpt或Ajax生成的新的U化和注入点。其中的加载页面由化ost.py提供的 API完成,
[0037] 网页解析主要完成S个功能,一是事件捜集,寻找网页中可能解析JavaScript和 加载Ajax的点击事件并触发;二是U化捜集,将新的U化放入待访问的U化列表用于探索 页面;=是注入点捜集,用于之后的漏洞检测。
[0038] 本系统使用Python的BeautifulSoup库来完成网页解析。BeautifulSoup是一 个用Python写的HTML/XML的解析器,它可W很好的处理不规范标记并生成剖析树,并且提 供简单又常用的导航,捜索W及修改剖析树的操作。
[00測 (1)触发事件
[0040] 触发事件时,使用Beauti化1Soup库捜索带有事件属性的标签,之后用化ost.py模拟用户点击触发事件。对事件进行点击后可能使浏览器解析化vaScript和加载Ajax,产 生D0M元素的改变或者U化的跳转,对此采取不同的方式应对。如果跳转到新的U化,存储 当前册L并返回之前页面即可,而产生D0M元素则需再次寻找是否出现了新的事件,直至不 再产生D0M元素为止,步骤如算法2描述:
[00川算法2.页面D0M元素展开算法 [0042] 输入;第一次请求得到的页面HTML代码
[004引输出;展开后的页面HTML代码
[0044]1.获取所有含有事件的标签存入tag_liSt,去除重复的标签;
[0045] 2.模拟点击tag_list中下一个未访问过的标签;
[0046] 3.将该标签存入visit□,标记为访问过;
[0047] 4.若页面跳转,执行步骤5 ;否则,执行步骤6 ;
[0048] 5.将跳转后的页面U化存入URL_List,执行步骤2 ;
[0049] 如果D0M元素改变,执行步骤1 ;
[0050] 通过该种方式,可朗尋网页不断展开,W达到寻找隐藏式注入点的目的。
[005。 似添加U化
[005引 U化超链接一般存在于<a>标签的虹ef属性中,对于HTML中的<a>标签,其虹ef 属性的值可W是任何有效文档的相对或绝对U化,包括片段标识符和化vaScript代码段。 一般用户点击<a>标签中的内容时,浏览器除了会跳转到虹ef属性指定的U化,也可能会执 行化vaScript表达式、方法和函数的列表。
[0053] 传统的网络爬虫仅采用正则表达式匹配一般U化的形式,该样很可能会漏掉页面 和注入点,所W本系统借助带有浏览器引擎的化ost.py库,对虹ef的值进行多种处理,如 图2所示。标准化函数针对不同情况进行字符串处理,将其转换成一般U化的形式。若转 换后的U化不在列表中,将存储至U化列表W用于之后的页面挖掘。
[0054] 1. 2漏洞检测模块
[0055] (1)漏洞检测
[0056] 本系统采用黑盒测试方法来检测目标表单是否存在XSS漏洞。漏洞检测 的基本方 法是使用RSnake提供的化eatSheet作为攻击向量来填写表单并提交。该化eat化eet 包括多种可W绕过XSS检验的攻击向量,如图2所示。
[0057] 该些经过设计的攻击向量提交后,如果存在漏洞,则页面会执行一个弹出提醒框 的脚本,其内容为XSS,此时通过化ost.py提供的wait_for_aledG检测是否有提醒框出 现,即检测网页是否执行了脚本,直接判断出当前注入点是否有漏洞。使用此方法时,如果 弹出了对话框,且对话框中含有污点数据,则当前表单一定存在XSS漏洞。漏洞检测的执行 过程如图3所示。
[0058] (2)查找表单及其注入点
[0059] 如果要提交某一个表单,需要标记该表单在D0M树中的位置,之后使用CSS属性选 择器找到它,首先寻找HTML文档中的所有表单并存于数组,标记为化rm[0]、化rm[ 1 ],之后 找到化1'111[0]中;[吨111:[0],化1'111[1]中的;[吨111:[1]、;[吨111:[2],将其]131116属性存于二维数 组中,由于name属性是提交请求时唯一需要的属性,所W其它属性不用保存。
[0060] (3)自动填写并提交表单
[0061] 本文使用化ost.py提供的填写表单的函数在表单栏填写XSS攻击向量:
[0062] ghost.set_field_value("input[name= %S]"%name,XSS)
[0063] 此外,化ost.py还可W模拟JavaScript语句来提交表单;
[0064] 曲ost.evaluate广document.querySelectorAll('form')[ %d] ['submit'] 0 ; "%form_i),expect-loading=True)
[0065] 表单有可能存在限制输入长度,不允许一些非法字符等前端验证,导致攻击向量 不能提交。该些验证事件存在于表单的属性中,需要模拟化vaScript语句将该些属性移 除。
[0066] document.querySelectorAll('input[type=submit]')[0]. removeAttribute('onclick');
[0067]document.querySelectorAll('input[type=submit]')[0]. removeAttribute('onfocus');
[0068] 之后对表单操作的具体步骤如算法3描述:
[0069] 算法3.自动填充攻击向量提交
[0070] 输入;存储表单及其注入点的二维数组
[ocm] 输出;漏洞检测结果
[007引1.遍历保存全部XSS攻击向量的xss_rsnake数组;
[0073] 2.对于表单中的每一个用户输入出,用当前攻击向量填充;
[0074] 3.提交表单;
[0075] 4.根据漏洞检测方法判断是否存在XSS漏洞,如果存在则执行步骤5,;否则执行 步骤1 ;
[007引5.存储漏洞在D0M中的位置、当前页面U化及其它信息;
[0077] 6.结束;
[0078] 表1一些经过设计的攻击向量
[0079]
【主权项】
1. 一种基于模拟浏览器行为的XSS漏洞检测方法,其特征在于:本方法基于Ghost, py 的对服务器的黑盒测试,它由爬虫模块和漏洞检测模块两个部分组成; I. 1爬虫模块 爬虫模块实现探索页面功能和网页解析功能;探索页面的爬虫使用本文提出的递归的 深度优先算法,仅挖掘同域名下的页面;该算法描述如算法1所示; 算法1.页面探索的深度优先递归算法 输入:起始网站URL 输出:以输入URL为起点爬取到的所有同域名页面URL1. 设置最大深度MAX_DEPTH;2. 设置当前深度depth = 0 ;3. 如果当前深度大于最大深度,结束;否则,执行步骤4 ;4. 访问当前URL;5. 获取页面所有URL存入URL_List;6. 如果URL_List为空,结束;否则执行步骤7 ; 将URL_List中下一个URL作为当前URL,当前深度加1,执行步骤3 ; 在探索页面前,还需要进行网页解析,将页面动态加载完,并触发页面中的事件以获取 JavaSricpt或Ajax生成的新的URL和注入点;其中的加载页面由Ghost, py提供的API完 成, 网页解析主要完成三个功能,一是事件搜集,寻找网页中可能解析JavaScript和加载 Ajax的点击事件并触发;二是URL搜集,将新的URL放入待访问的URL列表用于探索页面; 三是注入点搜集,用于之后的漏洞检测; 本方法使用Python的Beautiful Soup库来完成网页解析;Beautiful Soup是一个用 Python写的HTML/XML的解析器,它可以很好的处理不规范标记并生成剖析树,并且提供简 单又常用的导航,搜索以及修改剖析树的操作; (1)触发事件 触发事件时,使用Beautiful Soup库搜索带有事件属性的标签,之后用Ghost, py模 拟用户点击触发事件;对事件进行点击后可能使浏览器解析JavaScript和加载Ajax,产生 DOM元素的改变或者URL的跳转,对此采取不同的方式应对;如果跳转到新的URL,存储当前 URL并返回之前页面即可,而产生DOM元素则需再次寻找是否出现了新的事件,直至不再产 生DOM元素为止,步骤如算法2描述: 算法2.页面DOM元素展开算法 输入:第一次请求得到的页面HTML代码 输出:展开后的页面HTML代码1. 获取所有含有事件的标签存入tag_list,去除重复的标签;2. 模拟点击tag_list中下一个未访问过的标签;3. 将该标签存入visit□,标记为访问过;4. 若页面跳转,执行步骤5;否则,执行步骤6;5. 将跳转后的页面URL存入URL_List,执行步骤2 ; 如果DOM元素改变,执行步骤1 ; 通过这种方式,可以将网页不断展开,以达到寻找隐藏式注入点的目的; ⑵添加URL URL超链接一般存在于<a>标签的href属性中,对于HTML中的<a>标签,其href属 性的值可以是任何有效文档的相对或绝对URL,包括片段标识符和JavaScript代码段;一 般用户点击<a>标签中的内容时,浏览器除了会跳转到href属性指定的URL,也可能会执行 JavaScript表达式、方法和函数的列表; 传统的网络爬虫仅采用正则表达式匹配一般URL的形式,这样很可能会漏掉页面和注 入点,所以本系统借助带有浏览器引擎的Ghost, py库,对href的值进行多种处理;标准化 函数针对不同情况进行字符串处理,将其转换成一般URL的形式;若转换后的URL不在列表 中,将存储至URL列表以用于之后的页面挖掘; 1. 2漏洞检测模块 (1) 漏洞检测 本方法采用黑盒测试方法来检测目标表单是否存在XSS漏洞;漏洞检测的基本方法是 使用RSnake提供的Cheat Sheet作为攻击向量来填写表单并提交;该Cheat Sheet包括多 种可以绕过XSS检验的攻击向量; 这些经过设计的攻击向量提交后,如果存在漏洞,则页面会执行一个弹出提醒框的脚 本,其内容为XSS,此时通过Ghost, py提供的wait_for_alert()检测是否有提醒框出现,即 检测网页是否执行了脚本,直接判断出当前注入点是否有漏洞;使用此方法时,如果弹出了 对话框,且对话框中含有污点数据,则当前表单一定存在XSS漏洞; (2) 查找表单及其注入点 如果要提交某一个表单,需要标记该表单在DOM树中的位置,之后使用CSS属性选择器 找到它,首先寻找HTML文档中的所有表单并存于数组,标记为form[0]、form[l],之后找到 form[0]中 input[0],form[l]中的 input[l]、input[2],将其 name 属性存于二维数组中, 由于name属性是提交请求时唯一需要的属性,所以其它属性不用保存; (3) 自动填写并提交表单 本文使用Ghost, py提供的填写表单的函数在表单栏填写XSS攻击向量: ghost. set_field_value (^input [name =% s]^% name, xss) 此外,Ghost, py还可以模拟JavaScript语句来提交表单: ghost, evaluate ( ''document. querySelectorAlI ('form')[%d] [' submit' ] () ;〃%form_i), expect_ loading = True) 表单有可能存在限制输入长度,不允许一些非法字符等前端验证,导致攻击向量不能 提交;这些验证事件存在于表单的属性中,需要模拟JavaScript语句将这些属性移除; document. querySelectorAll (' input [type = submit]')[01. removeAttribute (' onclick'); document. querySelectorAll (' input [type = submit]')[01. removeAttribute (' onfocus'); 之后对表单操作的具体步骤如算法3描述: 算法3.自动填充攻击向量提交 输入:存储表单及其注入点的二维数组 输出:漏洞检测结果1. 遍历保存全部XSS攻击向量的xss_rsnake数组;2. 对于表单中的每一个用户输入出,用当前攻击向量填充;3. 提交表单;4. 根据漏洞检测方法判断是否存在XSS漏洞,如果存在则执行步骤5,;否则执行步骤 1 ;5. 存储漏洞在DOM中的位置、当前页面URL及其它信息;6. 结束。
【专利摘要】一种基于模拟浏览器行为的XSS漏洞动态检测方法,爬虫模块含有浏览器的内核,可以模拟浏览器行为来解析JavaScript和加载Ajax以得到页面中隐藏式注入点,相比传统而言,该系统大大增加了对注入点的覆盖。漏洞检测模块使用黑盒测试的方法,在提交攻击向量后,通过模拟浏览器行为检测页面是否有异常情况出现,即能够检测浏览器是否执行了网页脚本,直接判断出当前注入点是否有漏洞,相比传统方法更加准确。此外,该方法完全采用python语言开发,具有易于维护和进行二次开发的特点,对XSS漏洞的检测与研究有非常重要的应用价值。
【IPC分类】G06F21/56, G06F21/57
【公开号】CN104881608
【申请号】CN201510262308
【发明人】王丹, 刘源, 赵文兵, 杜金莲, 苏航
【申请人】北京工业大学
【公开日】2015年9月2日
【申请日】2015年5月21日
转载请注明原文地址:https://www.famiwei.com/read-8138468.html

最新回复(0)