一种面向XSS漏洞检测的Web应用逆向分析方法与流程

文档序号:11729692阅读:260来源:国知局
一种面向XSS漏洞检测的Web应用逆向分析方法与流程

本发明属于涉及一种面向xss漏洞检测的web应用模型自动化逆向分析方法,属于计算机信息安全领域。



背景技术:

随着网民规模和网站数量的持续增长,web应用程序已经广泛应用到各个领域,如电子商务、社交网络、网上支付等。2015年,我国的域名总数已达3102万。于此同时,web应用系统安全问题也越来越突出。根据中国漏洞库统计,2015年,中国漏洞库收录的安全漏洞中,web应用漏洞的数量排名第二。其中,xss漏洞是影响最大的web应用漏洞之一,在owasp最新发布的web应用漏洞排名中位列前三。

xss漏洞,即跨站脚本漏洞,是web应用中十分常见的一种安全漏洞类型。它可以让攻击者在客户端的浏览器页面中注入攻击脚本,一旦用户浏览了该页面并且浏览器在解析服务器端返回的html文档的过程中执行了正常功能脚本以外的攻击脚本时,就会造成xss攻击。

xss漏洞产生的原因主要有两个:一是html协议无法区分代码和数据,无法判断用户输入的数据是否合法,因此用户可以在html代码中注入恶意代码;二是web应用程序没有对返回给客户端浏览器的数据做恰当的转义处理,使得web页面中的数据包含恶意脚本,当客户端的浏览器解析执行恶意脚本时,xss漏洞就会触发。

利用xss漏洞攻击成功后,攻击者能够向用户当前浏览的页面植入恶意脚本,通过恶意脚本,控制用户的浏览器。这些用以完成各种具体功能的恶意脚本,被称为“xsspayload”。常见的xsspayload的攻击手段和目的有:

(1)盗取用户cookie:cookie中记录了用户的身份和会话状态,如果获得了用户cookie,就可以冒充用户登录web应用,达到劫持会话的目的。

(2)xss钓鱼:xss钓鱼比传统的钓鱼攻击更加隐蔽,可以采用<iframe>标签来载入伪造的登录网页,在url地址栏中仍然显示一个正常web网站的url,即使警惕性很高的用户也难以发现。

(3)xss蠕虫:xss蠕虫可以自动繁殖和传播,在蠕虫程序中还可以加入其他的攻击功能。一个典型案例是有名的xss蠕虫samy,它避开了社交网站myspace的数据过滤机制,在互联网上迅速扩散,迫使myspace关闭了其应用程序。

(4)xss挂马:xss挂马指用户在访问正常网页时,网页中包含第三方或者隐藏的调用,攻击者利用浏览器本身的漏洞或者第三方插件漏洞等,在用户无法察觉的情况下安装运行木马或后门程序,从而达到窃取用户敏感数据、控制用户计算机的目的。目前xss挂马是一种比较流行的xss攻击方式,具有更大的危害性。

因此,通过对web应用的xss漏洞进行检测来对web应用进行漏洞修补和安全加固是十分必要的。

xss漏洞检测可以采用基于源代码复查的静态检测方法和基于渗透测试的动态检测方法。由于渗透测试方式是对实际的web应用进行测试和检测的,比较接近于实际情况,因此在xss漏洞检测中得到了广泛应用。xss漏洞的动态检测方法主要围绕web应用逆向以及生成模糊测试集两个方向展开。现有的面向xss漏洞检测的web应用模型推导方法大都基于传统的有限状态机模型,模型中没有包含导航信息,在web应用功能的表达能力上有所不足,并且存在较多的冗余信息。



技术实现要素:

本发明的目的在于针对上述背景技术的不足,提出一种面向xss漏洞检测的web应用模型推导方法,提高xss漏洞检测的效率和效果;它将微观态加入到web应用模型中,表达web应用内部的导航关系;在web应用模型推导过程中,采用状态变化检测算法和导航函数完成初始web应用模型构建,采用页面聚类算法和状态简化算法对web应用模型进行简化,最后通过实验证明该模型有助于提高xss漏洞检测的效果和效率。另外,本发明提出的web应用模型推导方法还可以用于其他类型漏洞(包括逻辑类漏洞)的检测。

本发明解决其技术问题是通过以下技术方案实现的:

一种面向xss漏洞检测的web应用逆向分析方法,包括如下步骤:

步骤1,建立web页面模型:发送请求并获得返回的响应页面,建立一个对应响应页面的页面模型,所述页面模型表示微观态,且所述微观态指web应用当前运行的页面环境。

步骤2,判断并处理宏观态变化,同时确定导致该请宏观态发生变化的请求:所述宏观态是若干微观态的集合,所述步骤2中宏观态变化的判断依据是发送同一个请求时,返回的页面模型是否相同,若返回的页面模型不同,表明宏观态发生变化,则根据该请求重新划分宏观态;

步骤3:对下一个要发送的请求进行决策:决策下一个要发送的请求是选取导航函数取值最大时的请求;采用导航函数取值最大时的请求作为下一个要发送的请求,之后进入步骤1建立下一个要发送的请求对应的web页面模型,

所述导航函数为:

其中,navigationscore(nstate_history,ntransition)表示导航函数,nstate_history表示当前宏观态中该请求的历史访问次数,ntransition表示当前宏观态中该请求引起的宏观态变迁的次数;

通过步骤1、步骤2和步骤3推导出web应用模型后,进入步骤4;该web应用模型是一个层次化的米利型有限状态机模型,有限状态机模型中的状态等价于web应用模型的宏观态;

步骤4:简化web应用模型:简化web应用模型的方法包括页面聚类和状态简化,将步骤3得到的web应用模型依次采用页面聚类和状态简化进行简化,页面聚类是根据不同请求的响应页面的相似性减少web应用模型的微观态,状态简化则是根据由微观态构成的宏观态之间的包含关系对状态进行合并,减少冗余;

步骤5:对步骤4简化后的web应用模型实施xss漏洞检测。

进一步的,所述web页面模型是包括页面中所有链接向量的树模型,web页面中的所有链接向量存储在一个前缀树中,所述链接向量为一个五元组,表示为:

link_vector=<dompath,method,urlpath,params,values>

link_vector=<dompath,method,urlpath,params,values>

其中,link_vector表示链接向量,dompath表示链接信息在html文档树中的路径,method表示http请求方法,http请求方法包括get和post,urlpath是除请求参数以外的url地址信息,params是链接中请求参数名集合,values是链接中请求参数值的集合。

进一步的,所述步骤1中建立web页面模型的具体流程为:

(1)根据初始url或者导航函数决策的链接进行构造请求,其中post请求需要根据实际需要构造合适的参数数据,将构造好的请求数据发送给被测试的web应用;

(2)对于请求对应的html页面进行获取,对web页面进行解析,提取其中的所有链接向量,利用提取的所有链接向量构造当前web页面的前缀树模型,将后续的链接向量依次合并到第一个链接向量中,当所有的链接向量合并完成后,便生成web页面模型;

(3)将当前请求加入到全局访问历史中,并将当前页面模型加入到当前宏观态中。

进一步的,所述有限状态机模型中的宏观态之间的输入和输出等价于web应用模型的变迁请求,所述变迁请求是指能够引起宏观态发生变化的请求;

所述步骤2中对变迁请求的确定是通过状态变迁函数的评分决定的,所述状态变迁函数为:

其中,transitionscore(ntransition,nhistory,method,distance)表示状态变迁函数,nhistory表示当前请求出现在历史记录中的总次数,method表示http请求方法,get请求为1,post请求为2,distance表示当前请求与最近一次请求之间的距离;

所述步骤2中采用状态变化检测算法的具体流程为:

(1)判断当前请求是否出现在当前的宏观态请求集合中,若该请求在当前的宏观态中未出现过,则默认当前请求不能引起宏观态变化,将当前请求加入到当前的宏观态的请求集合中,并返回状态变迁请求为空值,否则进入下一流程;

(2)判断根据当前请求返回的由web页面建立的页面模型是否存在于当前的宏观态中,若存在,说明前后两次相同的请求返回的响应页面一致,没有引起宏观态变迁,若不存在,说明此时的宏观态已经发生了变化,进入下一流程;

(3)确定引起宏观态变迁的请求,遍历当前请求与当前的宏观态中最近一次相同请求之间的所有请求,通过调用状态变迁函数为每个请求计算一个分数,最终返回分数最高的请求作为变迁请求。

进一步的,所述步骤3中采用导航函数进行决策的具体流程为:

(1)提取当前请求的响应页面中的链接信息,包括url地址信息和post表单;

(2)遍历提取的链接信息,利用导航函数计算所有链接的导航分数,找到导航分数最高的请求作为下一次要发送的请求。

进一步的,所述步骤4中采用页面聚类算法的具体流程为:

(1)建立web应用树模型,依次遍历web应用树模型根节点的所有dompath节点、method节点、urlpath节点、params节点;

(2)判断当前params节点包含的values节点的数量是否超过指定阈值100,如果超过,保留params节点的前面若干个子节点,如果没有超过指定阈值100,继续下一个节点,直到web应用树模型中的所有params节点遍历完毕;

所述步骤4中采用状态简化算法的具体流程为:

(1)遍历当前web应用模型中所有的宏观态;

(2)比较不相邻两个宏观态的微观态集合,判断二者是否存在包含关系,如果存在包含关系,则将包含微观态数量更少的宏观态的变迁关系合并到另一个宏观态,并将包含微观态数量更少的宏观态从web应用模型中剔除,直到所有的不相邻宏观态遍历完毕。

进一步的,所述步骤5采用xss漏洞检测框架,所述xss漏洞检测框架包括:逆向引擎、调度导航器、状态检测器、模型优化器、xss检测引擎、模糊测试器和xss检测器。

本发明的有益效果为:

1、本发明改进了已有的web应用模型,增加了微观态的概念,提出了层次化的web应用模型表示方法,使其不仅可以描述web应用状态之间的变迁关系,还能表现web应用内部的导航关系。

2、web应用模型推导过程中引入了状态变迁函数和导航函数进行决策,使得最终逆向的web应用模型更加接近web应用真实的逻辑。

3、设计并实现了一个xss漏洞检测工具,通过对该工具的xss漏洞检测效果的测试,证明了本方法的有效性和高效性。

附图说明

图1是web页面模型实例示意图;

图2是web应用模型实例示意图;

图3是web应用树模型示意图;

图4是xss漏洞检测框架示意图;

图5是不同xss漏洞检测工具对不同web应用的检测结果;

图6是不同工具xss漏洞检测效率对比图。

具体实施方式

下面通过具体实施例对本发明作进一步详述,以下实施例只是描述性的,不是限定性的,不能以此限定本发明的保护范围。

本领域的技术人员可以理解,除非另外定义,这里使用的所有术语具有与本发明所属领域中的普通技术人员的一般理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术语应该被理解为具有与现有技术的上下文中的意义一致的意义,并且除非像这里一样定义,不会用理想化或过于正式的含义来解释。

web应用模型的推导过程是一个不断增加和修正宏观态的过程。模型推导过程会维护一个全局访问列表和全局页面模型,便于对宏观态进行划分以及页面聚类,使得最终生成的web应用模型在确保覆盖所有感知到的宏观态的前提下减少微观态的数量,从而提高xss漏洞检测的效率。

一种面向xss漏洞检测的web应用逆向分析方法,包括如下步骤:

步骤1,建立web页面模型;发送请求并获得返回的响应页面后建立一个对应响应页面的页面模型,该页面模型表示微观态,且微观态指web应用当前运行的页面环境。建立web页面模型的过程是提取网页中的所有导航信息并建立前缀树的过程。

web页面模型是包含页面中所有链接向量的树模型,web页面中的所有链接向量存储在一个前缀树中,如图1所示为一个包含4个链接的简单web页面模型,链接向量为一个五元组,表示为:

link_vector=<dompath,method,urlpath,params,values>

其中,link_vector表示链接向量,dompath表示链接信息在html文档树中的路径,method表示http请求方法,http请求方法包括get和post,urlpath是除请求参数以外的url地址信息,params是链接中请求参数名集合,values是链接中请求参数值的集合。

例如,html页面中a标签的href属性值为/usr/profile.php?id=0&page=3,它对应的链接向量如下:

</html/body/div/span/a,get,/user/profile.php,(id,page),(0,3)>

链接向量中的第1个元素表明了该链接的位置信息,后4个元素表明了链接本身的组成结构信息,采用get方法访问,url路径为/user/profile.php,附带请求参数为id和page,参数值分别为0和3。

步骤1中建立web页面模型的具体流程为:

(1)根据初始url或者导航函数决策的链接进行构造请求,其中post请求需要根据实际需要构造合适的参数数据,将构造好的请求数据发送给被测试的web应用。

(2)对于发送请求对应的html页面进行获取,对web页面进行解析,提取其中的所有链接向量,利用链接向量构造当前web页面的前缀树模型,将后续的链接向量依次合并到第一个链接向量中,当所有的链接向量合并完成后,便生成web页面模型。

(3)将当前请求加入到全局访问历史中,并将当前页面模型加入到当前宏观态中。

步骤2,判断并处理宏观态变化,同时确定导致宏观态发生变化的请求:宏观态是若干微观态的集合,宏观态表示web应用模型中一个确定的一致性状态,步骤2中宏观态变化的判断依据是发送同一个请求时,返回的页面模型是否相同。若返回的页面模型不同,表明宏观态发生变化,则根据该请求重新划分宏观态。

本发明中,能够引起宏观态发生变化的请求是变迁请求,对变迁请求的确定是通过状态变迁函数的评分决定的,状态变迁函数为:

其中,transitionscore(ntransition,nhistory,method,distance)表示状态变迁函数,ntransition表示当前请求引起宏观态变迁的次数,nhistory表示当前请求出现在历史记录中的总次数,method表示http请求方法,get请求为1,post请求为2,distance表示当前请求与最近一次请求之间的距离。

状态变迁函数的函数值与当前请求引起宏观态变迁的次数正相关,与当前请求在访问历史中出现的总次数负相关;同时,http请求的方法也会对打分取值造成影响,一般而言,post请求更容易引起web应用状态的变化;另外,打分函数取值还与当前请求与最近一次请求之间的距离有关,距离越近,分值越高。

步骤2中采用状态变化检测算法的具体流程为:

(1)判断当前请求是否出现在当前的宏观态请求集合中,若该请求在当前的宏观态中未出现过,则默认当前请求不能引起宏观态变化,将当前请求加入到当前的宏观态的请求集合中,并返回状态变迁请求为空值,否则进入下一流程;

(2)判断根据当前请求返回的由web页面建立的页面模型是否存在于当前的宏观态中,若存在,说明前后两次相同的请求返回的响应页面一致,没有引起宏观态变迁,若不存在,说明此时的宏观态已经发生了变化,进入下一流程;

(3)确定引起宏观态变迁的请求,遍历当前请求与当前的宏观态中最近一次相同请求之间的所有请求,通过调用状态变迁函数为每个请求计算一个分数,分数越高,表明是宏观态变迁请求的可能性越大,最终返回分数最高的请求作为宏观态变迁请求。

步骤3:对下一个要发送的请求进行决策;决策下一个要发送的请求是选取导航函数取值最大时的请求,采用导航函数取值最大时的请求作为下一个要发送的请求,进入步骤1建立下一个要发送的请求对应的web页面模型;web应用逆向方法中的一条准则是尽可能多地收集当前的宏观态的信息,使宏观态包含更多的微观态,有助于在状态变化检测过程中提高对状态变化的感知能力。导航策略围绕该准则制定,并定义了导航函数来明确请求访问的优先级,定义如下:

其中,navigationscore(nstate_history,ntransition)表示导航函数,nstate_history表示当前宏观态中该请求的历史访问次数,ntransition表示当前宏观态中该请求引起的宏观态变迁的次数,导航函数的取值越大,表示请求的优先级越高。影响导航函数最终取值的有两个因素:一是当前请求在当前宏观态中的请求次数,请求的次数越多,下一次发送该请求的概率越小;第二个因素是当前请求引起的宏观态变迁的次数,引起的宏观态变迁的次数越多,说明发送该请求时造成宏观态改变的概率越大,为了收集当前宏观态更多的微观态信息,相应的优先级越低。

步骤3中采用导航函数进行决策的具体流程为:

(1)提取当前请求的响应页面中的链接信息,包括url地址信息和post表单;

(2)遍历提取的链接信息,利用导航函数计算对应的导航分数,找到分数最高的请求作为下一次要发送的请求。

通过步骤1、步骤2和步骤3推导出web应用模型后,进入步骤4;

本发明中,该web应用模型是一个层次化的米利型有限状态机模型,有限状态机中的状态等价于web应用模型的宏观态,有限状态中的输入和输出等价于web应用模型的变迁请求。

图2所示为web应用模型实例示意图。s0和s1表示web应用模型的两个宏观态,每个宏观态都包含了若干微观态,其中微观态(get,search.php)表示客户端以get方式请求search.php之后响应的页面模型。从微观态(get,index.php)经过post方式请求add.php到达微观态(post,add_item.php),此时两个微观态处于不同的宏观态内,称为变迁,采用实线。

如图3所示为web应用树模型的存储结构。在web应用树模型中,每条从根节点到最左侧叶节点的路径表示一个包含4个链接向量的web页面,其中三个链接向量位于html文档树的/html/body/div/span/a位置,一个位于/html/body/div/form的位置;第一个位置的三个链接向量采用get方式请求,访问的路径是/user/list.php,它们之间的区别在于请求的参数以及对应的参数值;第二个位置的链接向量采用post表单方式提交给/user/login.php,提交的数据为name=admin&passwd=123456。

web应用树模型是通过将web页面模型中同一层的兄弟节点合并成一个节点再聚合web应用的所有页面模型得到的,因此该模型的高度与web页面模型是一致的。web应用模型推导只会增加该模型的分支,而不会改变树的高度。

步骤4:简化web应用模型;简化web应用模型的方法包括页面聚类和状态简化,将步骤3得到的web应用模型采用页面聚类和状态简化依次进行简化,页面聚类是根据不同请求的响应页面的相似性减少web应用模型的微观态,状态简化则是根据由微观态构成的宏观态之间的包含关系对状态进行合并,减少冗余。

采用页面聚类算法的具体流程为:

(1)依次遍历web应用树模型根节点的所有dompath节点、method节点、urlpath节点、params节点;

(2)判断当前params节点包含的values节点的数量是否超过指定阈值100,如果超过,保留params节点的前面若干个子节点,如果没有超过指定阈值100,继续下一个节点,直到web应用树模型中的所有params节点遍历完毕;

采用状态简化算法的具体流程为:

(1)遍历当前web应用模型中所有的宏观态;

(2)比较不相邻两个宏观态的微观态集合,判断二者是否存在包含关系,如果存在包含关系,则将包含微观态数量更少的宏观态的变迁关系合并到另一个宏观态,并将包含微观态数量更少的宏观态从web应用模型中剔除,直到所有的不相邻宏观态遍历完毕。

步骤5:实施xss漏洞检测;xss漏洞检测包括web网页获取、检测点处理和模糊测试。步骤5采用xss漏洞检测框架,xss漏洞检测框架包括以下构件:

逆向引擎:用来控制整个web应用逆向过程,负责底层web页面的抓取以及数据流的处理。

调度导航器:决定web应用逆向过程中要发送的下一个请求。

状态检测器:判断宏观态是否发生变化并处理状态变化。

模型优化器:对初步生成的web应用模型进行优化,减少web应用模型中的宏观态和微观态的数量。

xss检测引擎:控制与目标web应用的交互。

模糊测试器:基于正常的请求生成包含漏洞负载的请求。

xss检测器:通过对比正常负载与异常负载请求的响应页面判断是否存在xss漏洞。

逆向引擎、调度导航器、状态检测器和模型优化器构成了web应用逆向模块,该web应用逆向模块可以生成web应用模型,作为xss漏洞检测模块的输入。xss检测引擎、模糊测试器和xss检测器构成了xss漏洞检测模块,该xss漏洞检测模块接受web应用模型作为输入,按照状态之间的迁移关系遍历每一个宏观态中的页面模型,对http请求中的参数进行fuzzing,测试各种可能触发xss漏洞的负载,通过返回的响应页面的特征判断是否存在xss漏洞。

步骤5中的xss漏洞检测是利用前四个步骤生成的web应用模型结合w3af中已有的xss漏洞检测插件实现的。前面的步骤利用web应用模型生成一个顺序的请求列表,然后将该列表依次导入xss模糊测试器中,结合开源的xss模糊测试引擎对web应用进行xss漏洞的模糊测试。

本发明实现了一个原型工具——web应用模型推到系统(wamis),图5所示为不同xss漏洞检测工具对不同web应用的检测结果,该结果是在人工审核排除了误报之后真实有效的xss漏洞数量。其中,本发明实现的wamis系统在测试的web应用中的xss漏洞检出率均高于其他工具。在所有的5个目标web应用中,wamis总共检测到了15个xss漏洞,xsser的检测效果次之,检测到了8个漏洞,skipfish和w3af均发现了5个漏洞,wapiti发现了3个漏洞。另外,在对webgoat应用的检测中,只有wamis检测到了漏洞,可能是因为wamis底层的爬虫模块支持对web页面中的javascript脚本进行解析,虽然影响了数据流的处理速度,但是可以捕获页面中更多的链接信息,从而检测出其他工具无法抓取的web页面中的漏洞。

图6所示为不同工具的xss漏洞检测效率对比,wamis在请求数较少时效率较低,是因为前期处于模型推导阶段,web应用模型建立之后再对web应用进行xss漏洞检测效率是非常高的,明显高于其他几个xss漏洞检测工具。

以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1