一种基于程序分析和变异输入的跨站脚本攻击检测方法与流程

文档序号:14037399阅读:139来源:国知局
一种基于程序分析和变异输入的跨站脚本攻击检测方法与流程
本发明属于计算机
技术领域
,尤其是软件工程
技术领域
。本发明采用一种基于变异输入的方法对web应用中存在的跨站脚本攻击(crosssitescripting,简称xss)进行检测,通过此方法可以简单有效的检测出web应用中的xss漏洞,保证了web应用的质量。
背景技术
:随着社会的不断发展,web应用已经成为了我们日常生活中不可或缺的一部分。现在的web应用涉及广泛,包括购物、社交、娱乐等各个领域。web应用给用户带来便利的同时,也带来了很多的问题,尤其是安全方面的问题。开放web应用安全工程(openwebapplicationsecurityproject简称owasp)最近两次给出的最关键10项web应用安全风险(简称top10)的统计报告显示:xss分别以2010年排行第二和2013年排行第三的身份进入“备受人们关注的web安全领域”。目前主要有三种类型的xss,分别是反射型xss(reflectedxss)又称为非持久型xss(no-persistentxss);存储型xss(storedxss)又称为持久型xss(persistentxss);及domxss。反射型xss是指用户发出请求时,xss代码出现在url中,作为输入提交到服务器端,服务器端解析后响应,在响应内容中出现这段xss代码,最后浏览器解析执行。存储型xss和反射型xss的差别在于:提交的xss代码会存储在服务器端(不管是数据库、内存还是文件系统),下次请求目标页面时不用再提交xss代码。domxss和前两者的差别在于:domxss的xss代码并不需要服务器解析响应的直接参与,触发xss靠的就是浏览器前端的dom解析,可以认为完全是客户端的事情。本发明主要关注domxss。现有的网站xss检测方法大多建立在污点分析的基础之上,由于基于污点分析的方法需要对source和sink进行记录,需要修改浏览器记录信息或者采用框架进行插桩以获得这些信息,所以基于污点分析的方法在精度或性能上都存在可改进的空间。对web页面进行程序分析主要有动态分析和静态分析。动态分析是指在真实环境或者虚拟模拟器中对程序进行执行,以对程序运行情况进行分析,优点是分析结果精确,缺点是代价较高且会有漏报。静态分析是指在不运行程序,通过分析程序的源代码以得到需要关注的信息,优点是分析结果全面,缺点是会存在误报。考虑到跨站脚本攻击检测需要尽可能全面,本发明采用静态程序分析方法。变异测试是被用来设计新的软件测试和评估存在的软件测试质量的一种方法。每一个变异的版本被称为变异体,当原始版本的行为与变异体的行为不同时则拒绝变异体。这被称为杀掉一个变异体。而这些变异体在建立在好的变异算子的基础上。现有的web应用安全方面的变异算子主要是针对sql注入提出来的,通过使用这些变异算子对输入进行变异,可以检测出程序中存在的sql注入漏洞。本发明设计了一些针对用户输入的变异算子,能有效检测出跨站脚本攻击。selenium是一个作用于web应用的便捷软件测试框架。selenium提供了用一些流行的编程语言来编写特定领域的测试,包括java,c#,groovy,perl,php,python和ruby。这些测试可以运行在大多数的现在浏览器中。本发明采用python语言编写脚本,使得变异输入可以作用到网页的输入点上。技术实现要素:在现有工作的基础上,本发明要解决的问题是:利用程序分析技术,挖掘web应用中存在的各种xss漏洞,并设计针对用户输入的变异算子,检测可能存在的跨站脚本攻击,从而有效保障web应用的安全质量。本发明的技术方案是:对爬取的网页使用htmlparser2进行解析,得到网页的dom结构;通过遍历这个dom结构找到网站中所有的可能输入点,记录这些输入点的id;结合变异算子生成可能的用户输入;使用工具selenium自动运行测试脚本,挖掘网站中可能存在的xss漏洞。本发明具体包括以下步骤:1)对爬取的网页使用htmlparser2进行解析,得到网页dom结构;2)递归的遍历dom结构得到所有用户输入点,并记录相应点的id;3)对某些输入使用变异算子得到变异输入用例;4)利用selenium结合得到的变异输入用例对所有可能存在的用户输入点进行测试,根据测试得到的结果,判断该输入点是否存在xss漏洞。步骤1)进行网页解析。一个网页主要由html,css及javascript构成,其中html构成了网页的主要框架,使得内容有了一个基本的展示,css则是使得网页有一个好的布局,让网页看起来更加美观,js则是用来对用户触发的一些事件进行响应,如对用户输入的一些内容进行判断,对不符合要求的内容给出相应的提示。所以对页面进行解析的第一步就是,将网页转化成dom结构,htmlparser2工具是一个html解析器,可以处理流数据并可以提供一个回调函数接口。本发明使用htmlparser2对网页进行解析,得到网页的dom结构,得到这个dom结构后,以供后续步骤对其进行分析。步骤2)对得到的网页dom结构,编写递归遍历程序对该dom结构进行,处理各种类型的结点,包括:(1)text结点即文本结点,该结点中主要包含如换行符(\n)等文本内容;(2)tag结点即标签结点,该结点主要包含如p,h1,img等标签结点,在该结点中可以得到一些数据信息、属性信息以及事件处理相关的信息等;(3)script结点即js脚本结点,在该结点中,可得到js引用的其它js库或开发者自己编写的js脚本;(4)comment结点即注释结点,在该结点中,可得到开发者书写的一些注释信息;(5)style结点即样式结点,在该结点中,主要包含渲染页面的一些css脚本。通过遍历程序得到tag结点中标签名为input和textarea的标签,并判断这些标签的type属性是否为hidden;如果不是hidden值,则记录这些标签的id以供后续使用。利用这种方法可得到网页中所有的用户输入点。尽管此遍历dom结构的方法,只是用来得到所有用户输入点的id,但是只要稍加扩展,此方法也适合于得到dom元素的其它信息,适用于其它要求的页面静态分析。步骤3)在一些基本输入的基础上,使用本发明所设计的变异算子对基本输入进行变异,从而得到输入的变异用例。本发明设计了如下几种变异算子:(1)addescapeoperator(aeo):增加转义算子,该算子的作用是将某些需要进行转义的字符进行转义,这些字符包括“<”,“>”,“&”,“\”等。当普通的输入中出现这些字符时,就运用该转义算子对这些特殊字符进行转义操作;(2)removeescapeoperator(reo):移除转义算子,该算子的作用是将基本输入中出现的转义字符进行移除;(3)addhighbyteoperator(ahbo):添加高字节算子,该算子的作用是在基本输入中的随机位置添加某个高字节字符,由于宽字节编码的问题,当增加一个某个高字节字符后,这个高字节字符可能与前面的一些字符组成一个新的合法字符;(4)addlowbyteoperator(albo):添加低字节算子,该算子的作用是在基本输入中的随机位置添加某个低字节字符,作用与ahbo类似;(5)addquotationmarkoperator(aqmo):添加引号算子,该算子的作用是使用引号(单引号或者双引号)将基本输入中的内容包裹在引号之内,添加的位置,可以通过一个随机函数给出,然后进行添加;(6)removequotationmarkoperator(rqmo):移除引号算子,该算子的作用是将基本输入中出现的引号(单引号或双引号)进行移除,移除的过程中需要成对的移除,而不能只是单独的左引号或者右引号;(7)addcommentoperator(aco):添加注释算子,该算子的作用是在基本的输入中的任意位置添加注释符号(//),其任意位置根据随机函数得到;(8)removecommentoperator(rco):移除注释算子,该算子的作用与aco的作用正好相反,其作用是将基本输入中的注释符进行移除,从而得到新的输入;(9)encodeoperator(eo):编码算子,该算子的作用是将基础输入出现的“&lt;”,“>”,“&”,“\”字符进行编码,将它们分别转化为“&lt;”,“&gt;”,“&amp;”,“&quot;”;(10)decodeoperator(do):解码算子,该算子的作用与编码算子的作用相反,其作用是将“&lt;”,“&gt;”,“&amp;”,“&quot;”解码为“<”,“>”,“&”,“\”字符。步骤4)使用步骤2)中得到的页面输入点id,并采用步骤3)中得到的变异输入用例,结合使用selenium工具,将变异输入用例一个个输入到网页输入点中,然后根据网页中出现的变化,来判断这些变异输入用例是否成功运行,从而判断出该网站是否存在xss漏洞。当将变异输入作用到网页输入点后,需要观察网页是否发生了变化。例如,在输入某些用例后,网页出现了一个夹带恶意行为的弹窗,表明存在xss漏洞。更进一步,可以通过记录输入点,得到精确的xss漏洞在源代码中的具体输入点位置,为修复漏洞提供更充分的信息。通过采用以上技术方案,本发明具有以下优点:1.提供了一个解析网站的方法,并把网站转化成一个易于机器理解的形式,即dom结构。设计了一种遍历dom结构的算法,且能够方便地进行扩展,为后续对web应用进行其它方面的分析提供了一个方便的接口。2.采用基于输入变异的思想,对web网站中存在的xss漏洞进行检测。本发明设计了10种变异算子,并把这些变异算子应用到输入中,能方便准确地检测出web网站中存在的xss漏洞。3.能准确定位xss漏洞,通过程序分析得到输入点元素的id,一旦检测到xss漏洞,即可定位到具体发生漏洞的位置。附图说明图1为本发明的结构流程图。图2为dom结构图。具体实施方式本发明采用基于变异的输入方法对web应用中存在的xss漏洞进行检测,即:利用htmlparser2对web页面进行解析,得到web页面的dom结构;编写具体算法遍历dom结构,找到web页面中的所有输入点,这些输入点的标签主要是input标签和textarea标签;然后根据设计的10种变异算子对基本的输入进行变异操作;最后利用selenium这个自动的测试框架将得到的变异输入传递到web网页的输入进行测试,根据运行结果判断该web网页是否存在xss漏洞。本发明的流程如图1所示,具体包括如下四个步骤。第一步:首先将web网页转化为dom结构。本发明使用htmlparser2将web网页转化成dom结构。得到的dom结构,是一棵树的形式,我们也称之为dom树。该dom树是由各个结点组成的,例如有text结点、tag结点、script结点等。每个结点的顺序由它们在页面的展示顺序来确定的。除了根结点没有父结点,尾结点没有孩子结点外,其它结点都有相应的父结点和孩子结点。其中,tag结点可进一步细分为很多的tag结点,如ptag结点、h1tag结点、imgtag结点等,tag结点中也包含一些结点属性,对应更多的、与本标签相关的信息。本发明中,我们主要关注的是inputtag结点和textareatag标签结点。一个dom树的形式如图2所示:该图的根节点是html节点,其两个子节点分别是head节点和body节点;head节点中可以包含多个子节点,如图中所示的title节点和link节点等;body节点中也可以包含多个子节点,如本例中有form节点和img节点等。第二步:编写递归遍历dom结构的算法。遍历dom树最好的方式是使用递归算法,本发明采用的算法递归遍历每个结点,判断每个结点所属的类型,并将每个结点的后继及孩子结点进行遍历。在遍历的过程中,寻找input结点及textarea结点。当找到这些结点时,判断这些结点的属性type是否为hidden,若不是,则记录下它们的id。具体的遍历算法如下所示:第三步:对基本的用户输入,使用10种变异算子对它们进行变异,得到变异后的输入。这些输入将用于xss漏洞检测。本发明使用的基本输入为以下内容:(1)对于第一种变异算子aeo,首先找到基本输入中的可以进行转义的字符包括“<”,“>”,“&”,“\”等,当在基本输入中找到这字符时,然后在其前面加上转义字符。具体示例如下:原始输入变异后输入&lt;script&gt;alert(1)&lt;/script&gt;\&lt;script\&gt;alert(1)\&lt;/script\&gt;(2)对于第二种变异算子reo,在输入字符中找到所有的转义字符标志“\”,使用reo变异算子后,转义字符“\”。具体示例如下:原始输入变异后输入\&lt;imgsrc=\=@onerror=alert\(123\)/\&gt;&lt;imgsrc=@onerror=alert(123)/&gt;(3)对于第三种变异算子ahbo,首先使用随机函数找到应该插入高字节字符的位置,然后在要插入的位置后插入高字节字符,高位字节的范围是0xa1~oxf7,具体示例如下:原始输入变异后输入‘“;alert(1)//‘0xa1“;alert(1)//(4)对于第四种变异算子albo,首先使用随机函数找到应该插入低字节字符的位置,然后在要插入的位置后插入低字节字符,低位字节的范围是0xa1~oxfe,具体示例如下:原始输入变异后输入‘“;alert(1)//‘0xfe“;alert(1)//(5)对于第五种变异算子aqmo,首先找到输入中成对的引号,然后利用随机函数,产生随机数以决定删除某对引号,具体示例如下:原始输入变异后输入“onmouseover=alert(1)x=”onmouseover=alert(1)x=(6)对于第六种变异算子rqmo,首先利用随机函数产生要插入引号的前后位置,然后插入在随机函数产生的位置插入这些引号,具体示例如下:原始输入变异后输入javascript:alert(1)//j“avascri”pt:alert(1)//(7)对于第七种变异算子aco,首先利用随机函数产生要添加注释的位置,然后在要随机函数产生的位置,添加注释,具体示例如下:原始输入变异后输入“onmouseover=alert(1)x=”“//onmouseover=alert(1)x=”(8)对于第八种变异算子rco,首先对基本的输入进行查找,找到,基本输入中出现的注释符号//,然后移除基本输入中的注释符号,具体示例如下:原始输入变异后输入javascript:alert(1)//javascript:alert(1)(9)对于第九种变异算子eo,首先找到基本输入出现的“<”,“>”,“&”,“\”字符,然后利用随机函数选择性的用“&lt;”,“&gt;”,“&amp;”,“&quot;”对对应的字符进行替换,具体示例如下:原始输入变异后输入<script>alert(1)</script>&lt;script>alert(1)&lt;/script>(10)对于第十种变异算子do,首先找到基本输入出现的“&lt;”,“&gt;”,“&amp;”,“&quot;”字符,然后利用随机函数选择性的用“<”,“>”,“&”,“\”字符进行替换,具体示例如下:原始输入变异后输入&lt;imgsrc=@onerror=alert(123)/&gt;<imgsrc=@onerror=alert(123)/&gt;本发明提出了一个将基本输入通过变异算子得到了一些变异的输入的算法,算法伪代码展示如下:第四步:根据第二步得到的输入点id,及根据第三步得到的变异输入,将这些变异输入利用selenium工具输入到网站的输入点中。然后根据输入执行的结果,判断此输入处是否存在xss漏洞,如果存在xss漏洞,则记录此处位置,否则继续进行测试。在本发明中我们使用python脚本来编写此程序。具体脚本内容包括:首先获得浏览器的驱动,如果使用的是火狐浏览器,则获得驱动语句脚本为driver=webdriver.firefox(),然后将要检测的网站的链接作为参数传递到dirver.get()方法中,接下来通过第二步得到的输入点的id,将这些id作为参数传递到driver.find_element_by_id()方法中,从而找到要输入的点,接下来,将变异后的输入作为参数传递到driver.find_element_by_id(id).send_keys()中。输入完后,我们根据是否出现弹窗来判断是否存在xss漏洞。上述方法不仅可以发现网站中存在的xss漏洞,而且检测所用到的方法不会占用太多的资源,能方便快捷地找出网站中的xss漏洞。下面结合某web网页对本发明作具体实施说明。本发明不仅限适用于该例。对该web网页的具体操作如下:1、将web网页转化成dom结构即dom树使用htmlparser2工具将web网页转化成dom结构,该dom结构是一种树形结构,用于表示web网页的结构,并方便使用程序分析。2、遍历得到的dom结构,得到web网页的输入点id。在web网页中,主要的输入标签包括input标签和textarea标签,本发明使用自己提出的dom遍历算法,通过遍历网页的dom结构找到input和textarea标签,当这些标签的属性中的type属性的值为不hidden时,我们记录这些标签的id,因为当标签的属性中的type属性为hidden时,用户是看不到的,所以无须记录这些id。在本例中,得到的输入点id是email和pwd。3、利用变异算子对基本的输入进行变异得到变异输入。这里,运用前面所提到的变异算法将基本的输入通过变异得到变异的输入。得到的变异输入如下所示:\<script\>alert(1)\</script\><imgsrc=@onerror=alert(123)/>“//onmouseover=alert(1)x=”&lt;script>alert(1)&lt;/script><imgsrc=@onerror=alert(123)/&gt;4、结合2中的输入点id和3中的变异输入,利用selenium自动测试框架对网站进行测试。这里,将3中得到的变异输入利用selenium写入2中的输入点中,输入后检查网站是否出现特定的行为(即弹出内容为1的弹窗)。如果检测到这个行为,则认为该网站存在xss漏洞,否则认为该网站不存在xss漏洞。在对本例的网站进行判断时,因为没有检测到弹窗内容为1的弹窗,所以认为该网站不存在漏洞。总之,本发明利用变异输入的检测方法对web应用进行xss的检测,提出了一种分析网页的思路,并给出了递归遍历dom结构的算法,再次设计了10种变异算子对基本的输入进行变异,最后结合selenium工具,检测网站中的xss漏洞,并能准确检测到漏洞的位置。相比于传统的xss检测方法,本发明不仅针对性强,目标更明确细致,最后的检测更具有全面高效性。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1