1814070分类号密级UDC注1学位论文Web应用安全漏洞扫描工具的设计与实现(题名和副题名)陶亚平(作者姓名)指导教师姓名邱会中吾IJ教授电子科技大学成都(职务、职称、学位、单位名称及地址)申请专业学位级别硕士专业名称计算机软件与理论论文提交日期2010.05论文答辩日期2010.05学位授予单位和日期电子科技大学答辩年月日注1.-注明《国际十进分类法UDC)的类号。‰;.h:,o、l独创性声明本人声明所呈交的学位论文是本人在导师指导下进行的研究工作及取得的研究成果。据我所知,除了文中特别加以标注和致谢的地p~方外,论文中不包含其他人已经发表或撰写过的研究成果,也不包含为获得电子科技大学或其它教育机构的学位或证书而使用过的材料。与我一同工作的同志对本研究所做的任何贡献均己在论文中作了明确的说明并表示谢意。签名::!鲴垒§日期:弘1。年r月刁日论文使用授权本学位论文作者完全了解电子科技大学有关保留、使用学位论文的规定,有权保留并向国家有关部门或机构送交论文的复印件和磁盘,允许论文被查阅和借阅。本人授权电子科技大学可以将学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存、汇编学位论文。(保密的学位论文在解密后应遵守此规定)签名::星虱垒圣导师签名:日期:加/摘要摘要随着计算机技术和信息技术的发展,Web应用系统在各个领域都得到了广泛侈旧的应用,伴随而来的针对Web应用的攻击也大幅度上升。Web应用系统开发周期l'较短,而WEB开发人员安全编程意识和能力严重不足,Web应用程序存在漏洞是难免的,给攻击者留下大量可乘之机。如何检测评估Web应用系统的安全性,是Web安全领域面临的严峻问题。Web应用安全漏洞检测技术,工作在应用层HTTP协议上,模拟黑客攻击的方式,向服务器发送具有特定漏洞探测特征的HrrP请求,期望从服务器的应答中来发现服务器存在的Web应用安全漏洞。传统的防火墙、IDS/IPS从网络层面对Web系统提供安全保护,Web应用安全漏洞扫描工具与它们是互补的,它们共同保证W曲系统的安全。通过Web应用安全漏洞扫描,可以在W曲应用受攻击前,对Web应用进行健康检查,从而提早了解到Web应用存在的安全漏洞,并进行修补,降低系统受攻击的风险,是成本最低并且效果最好的Web安全防护手段。Web安全是网络安全中最严重的问题之一,进行Web应用漏洞检测技术研究是一项十分有意义的工作。论文首先分析了Web应用安全严峻的形式以及Web应用安全漏洞检测技术的迫切需求;接着跟踪了Web应用安全的国内外现状,研究了Web应用安全漏洞的分类及其检测技术的发展,总结了基于网络爬虫的SQL注入和XSS漏洞检测方法;在此基础上,设计了扩展性良好的Web应用安全漏洞扫描工具的系统基础架构,分析了主要构成部分的工作原理,实现了系统原型;然后对系统原型进行了测试,证实了设计的可行性与合理性;最后分析了系统的不足以及下一步的工作。关键词:W曲应用安全,漏洞检测,网络爬虫,SQL注入,XSS≮●ABSTRACTWithapplicationsthedevelopmentofcomputertechnologyandinformationaretechnology,励increasedwidelyusedinmanyareas,accompaniedbyattackssignificantly.W曲applicationdevelopmenttheawarenesscycleisveryshort,butprogrammerslackandtoabilityofsecurityprogramming,loopholesindetectW曲applicationsaaleinevitable.HowandassesssecurityofW曲applicationsisseriousproblemofWebsecurity.W曲applicationsecurityvulnerabilitydetectiontechniques,workinga仰1icationlayerprotocol哪toatthesimulatethewaythathackerattackstorequesttosendspecifictovulnerabilitycharacteristicsdiscoveringtheofHTTPtheserver,lookforwardWebapplicationsecurityvulnerabilitiesintheresponsefromtheatnetworkserver.Firewall.IDS/IPSprovidesecurityprotectionforapplicationsecurityvulnerabilitythesecurityofWebsyStems.ThroughthescannerW曲systemslevel,Webensureiscomplementarywiththem,theyallW曲applicationsecurityvulnerabilityscanning,W曲applicationCancanfindoutbehealthycheckedbeforetheattackhappens,wevulnerabilitiesearlierW曲applicationsecurityandtheriskofthesyStemundercarryoutrepairingtoreduceattack.thatisthelowestcostsecurityisworktooneandmosteffectiveWebsecurityprotectionameasure.Webmeaningfulofthemostseriousproblemsofnetworksecurity.ItisveryresearChtheFirstthepaperW曲applicationvulnerabilitydetectiontechnology.analyzedseveresituationsofWebapplicationsecurityandurgentrequirementsofWebapplicationdomesticstudyingvulnerabilitydetectiontechnology.Thenfollowedtheandinternationalthepresentconditionofthewebapplicationsecurity,finishedofclassificationW曲applicationsecurityvulnerabilityandthedevdopmentofW曲applicationvulnerabilitydetectiontechnology,summarizedSQLoninjectionthoseandXSSvulnerabilityscalabledetectionmethodsbasedsysteminfrastructureofW曲crawler.Basedonachievements,ascannerW曲applicationsecuritymajorcomponentsISvulnerabilityintroducedisdesigned,theworkingprincipleofaanditsprototypeisimplemented.ThenⅡtestofthesystemprototypeISABSTRACTfeasibilityandrationalityofthedesign.Finallytheandun-doneworksaretalkedabout.security,vulnerabilitydetection,Webcrawler,SQLIII夺一目录目录咚、l第一章引言………………………………………………………………………………………….11.1研究背景……………………………………………………………………………11.2研究目的、内容和目标……………………………………………………………21.2.1研究目的……………………………………………………………………….21.2.2研究内容………………………………………………………………………..21.2.3研究目标……………………………………………………………………….21.3论文结构……………………………………………………………………………31.4本章小结……………………………………………………………………………3第二章2.1WEB应用安全介绍……………………………………………………………。4WEB应用安全现状………………………………………………………………….42.2WEB应用常见安全漏洞……………………………………………………………52.32.4WEB应用安全漏洞检测技术………………………………………………………7SQL注入及XSS漏洞的检测………………………………………………………82.4.1网络爬虫……………………………………………………………………….82.4.22.4.3“SQL注入漏洞…………………………………………………………………10XSS漏洞………………………………………………………………………………………………142.5本章小结…………………………………………………………………………..15第三章一-监WEB应用安全漏洞扫描工具系统设计………………………………………‰.163.1调度引擎(SCANENGINE)设计…………………………………………………~173.1.1调度引擎工作原理……………………………………………………………173.1.2调度引擎类结构………………………………………………………………173.1.3调度引擎工作流程……………………………………………………………183.2扫描模块(SCANMODULE)设计…………………………………………………19Ⅳ目录3.2.1扫描模块工作原理……………………………………………………………193.2.2扫描模块整体结构…………………………………………………………....203.2.3扫描模块类结构………………………………………………………………213.2.4扫描模块工作流程…………………………………………………………….233.3本章小结……………………………………………………………………………..24第四章WEB应用安全漏洞扫描工具详细设计与实现……………………………。254.1公共组件…………………………………………………………………………..254.1.1配置文件模块…………………………………………………………………254.1.2线程池模块……………………………………………………………………274.1.3数据库访问模块………………………………………………………………324.1.4HTTP传输模块………………………………………………………………。374.2扫描调度引擎………………………………………………………………………414.2.1配置文件加载…………………………………………………………………414.2.2公共组件初始化………………………………………………………………454.2.3扫描模块调度…………………………………………………………………464.3网络爬虫(CRAWLER)模块……………………………………………………..494.3.1网络爬虫结构…………………………………………………………………494.3.2网络爬虫实现…………………………………………………………………494.4SQL注入漏洞扫描模块……………………………………………………………574.4.1SQL注入漏洞扫描结构……………………………………………………….574.4.2SQL注入漏洞扫描的实现……………………………………………………584.5XSS漏洞扫描模块…………………………………………………………………..644.5.1XSS漏洞扫描结构………………………………-…………………………644.5.2XSS漏洞扫描的实现…………………………………………………………644.6本章小结…………………………………………………………………………。69第五章WEB应用安全漏洞扫描工具测试分析…………………………………………705.1WEBSCANNER测试目的…………………………………………………………….705.2WEBSCANNER测试………………………………………………………………………………………70V、:奎啦Il攻硕期间取得的研究成果…………………………………………………………………….79VI夏一-第一章引言A1.1研究背景随着计算机技术和信息技术的发展,Web应用系统在各个领域都得到了广泛的应用,伴随而来的针对Web应用的攻击也大幅度上升。根据著名统计机构Gartnertl】的报告,信息安全攻击有75%都是发生在Web应用而非网络层面上。同时,数据也显示,67%的Web站点都相当脆弱,易受攻击。然而现实却是,~绝大多数企业将大量的投资花费在网络和服务器的安全上,没有从真正意义上保证Web应用本身的安全,给黑客以可乘之机。OWASP[2】(OpenW曲ApplicationSecurityProject)发布了2010年Web应用十大安全缺陷,与2009年相比:tnjectionSiteScripting)退flaws(SQL注入为其中最主要的一种)位列榜首,XSS(Cross至第二。近年来,国内众多行业都在开发行业信息软件,如电力,石油,金融,物流,环保等。目前,几乎每个企业都有自己的Web应用系统,为客户提供更为方便、快捷的服务支持。这些应用在功能和性能上,都在不断的完善和提高,然而在非常重要的Web安全性上,却没有得到足够的重视。这些Web应用都是通过HTTP协议(h郇或者https)提供给用户使用。所有这些技术和应用实现,会很容易引入漏洞。由于网络技术日趋成熟,黑客们也将注意力从以往对网络服务器的攻击逐步转移到了对Web应用的攻击上。根据我国CNCERT/CC[3】(国家互联网应急中心)在《CNCERT/CC2008年上半年网络安全工作报告》一文中统计的数据来看,网络仿冒27.04%,网页恶意代码21.36%,2008年上半年我国大陆地区被篡改的.gov.cn网站数量共计2242个,我国Web安全形势严峻。Web应用的安全性是一个非常迫切的问题。Web应用只能从传统的网络安全保护措施得到有限的保护【41。HTTP请求的安全性并不被防火墙,操作系统,WebServer仔细的检查。因此Web应用程序必须提供必要的自我保护。也就是通过审慎的程序代码来达到对抗黑客的目的。长期来看,最好的办法还是以在开发阶段从源头上消除安全漏洞,而不是后期建立修复措施。因此对Web应用安全漏洞检测技术展开全面研究具有重要理论意义和实际应用价值,也引起来了越来越多研究组织和研究人员的注意。电子科技大学硕士学位论文1.2研究目的、内容和目标1.2.1研究目的Web应用系统开发周期较短,而开发人员程度参差不齐,Web应用程序存在漏洞是难免的。Web应用安全漏洞检测技术【4】是对Web应用程序安全漏洞的主动检测,它工作在应用层H1]曙协议上,模拟黑客攻击的方式,向服务器发送具有特定漏洞探测特征的HTTP请求,期望从服务器的应答中来发现服务器存在的Web应用安全漏洞。传统的防火墙、IDS/IPS从网络层面对Web系统提供安全保护,Web应用安全漏洞扫描工具与它们是互补的,它们共同保证Web系统的安全。通过Web应用安全漏洞扫描,可以在Web应用受攻击前,对Web应用进行健康检查,从而提早了解到Web应用存在的安全漏洞,并进行修补,降低系统受攻击的风险。是成本最低并且效果最好的Web安全防护手段。Web安全是网络安全中最严重的问题之一,进行W曲应用漏洞检测技术研究是一项十分有意义的工作。本课题的研究目的是设计实现一个具有良好扩展性及性能,检测结果较准确的W曲应用安全漏洞扫描工具。1.2.2研究内容本课题以Web应用安全漏洞检测技术及常见Web应用程序安全漏洞检测方法为主要研究内容,具体工作如下:1.研究HTTP协议相关内容。2.研究HTML文档中URL提取技术。3.研究URL格式规范相关内容。4.研究搜索引擎Crawler技术,实现目标站点结构获取。5.研究SQL注入技术,模拟其攻击方式,检测定位安全漏洞。6.研究XSS(CrossSiteScript)技术,模拟其攻击方式,检测定位安全漏洞。1.2.3研究目标本课题的研究目标包括:1.Web应用安全漏洞扫描工具具有良好扩充性,可以方便的加入新的漏洞扫描部件。2畸-,o,‘rI第一章引言2.Web应用安全漏洞扫描工具的运行效率较高,能够较完整的收集Web站点的漏洞测试点。3.Web应用安全漏洞扫描工具的漏洞检测结果具有较高准确性,能够给出较详细的检测结果报告。1.3论文结构本文共分为六章。第一章:简单介绍了论文背景,论文的研究方向,以及本文将要开展的研究工作。第二章:介绍了Web应用安全现状,Web应用常见安全漏洞,以及Web应用安全漏洞检测技术国内外研究现状,研究总结了基于网络爬虫的SQL注入和XSS漏洞检测原理。第三章:介绍了Web应用安全漏洞扫描技术核心原理,对Web应用安全漏洞扫描工具系统基础架构进行了设计。‘第四章:结合改进的网络爬虫技术,SQL注入漏洞检测方法,XSS注入漏洞检测方法,介绍了Web应用安全漏洞扫描工具各部分的详细设计与实现。第五章:介绍了Web应用安全漏洞扫描工具运行测试情况。第六章:对论文的贡献和不足做出总结,并提出了下一步工作设想。最后是参考文献和致谢。1.4本章小结本章介绍了本课题研究背景、研究目的、内容和目标,详细介绍了Web应用安全严峻的形势以及Web应用安全漏洞检测技术的迫切需求,为本文的深入研究打下基础。此外在本章末还给出了本文的论文章节安排,便于快速了解本文的研究的主要内容和结构安排。,’命改变了这个时代信息●而来的黑客事件的也是息和木马程序,至于基了以浏览器为客户端的“宅’’时尚,也是这些技术推动下的产物。近几年云计算的提出,更是无论从技术上还是概念上,把浏览器的重要性推到了一个高峰。毋庸置疑,不久的未来,浏览器成为各种Web应用的综合平台,对用户使用来说是非常受益的,但同时也预示着Web应用将成为网络安全的最大的风险来源,Web安全将成为全球性的重大课题。从2004到2005年的三次Symantec【6】网络安全威胁报告(SymantecInteractSecurityThreatReport)的统计数据可以看出,与WEB应用相关的漏洞比例飞速上升,占新增漏洞比例分别为48%,59%和69%。kw根据WHID[7】(网络黑客事件数据库W曲HackingIncidentsDatabase)的统计I,数据,2004年基于WEB的攻击次数是2003年的1.88倍,2005年的攻击次数是2004年的3.47倍。2006年的WEB安全事件名单上,google、hotmail、yahoo等知名大型网站的名字已经数次出现。中小企业的Web应用系统及网站由于受企业资金、人力资源等因素的限制,存在的Web安全问题尤为突出。很多企业的Web服务器成为黑客攻击的目标,或者作为黑客操作的肉鸡,出现在网络安全事件名单中。就连一些地方政府的网站,也被黑客篡改和挂马,严重影响了政府的形象和公信力。4Web应用的用户体验,大批传统的以C/S模式提供的服务,逐渐迁移到了B/S模式的Web应用上。如今的用户打开浏览器就可以:处理邮件、搜索信息、观看视频、编辑Office文件、玩游戏、与朋友互动等。基本上人类生活的衣、食、住、行、娱乐等各个方面都可以通过一个小小的浏览器得到满足,如今时下流行的浏览器将全面取代所有桌面应用,成为满足人类各种需求的综合服务平台。‰●第二章Web应用安全介绍Web应用安全问题的成因多种多样,Web应用系统的市场需求大,且软件开发周期较短,导致Web应用系统数量急剧膨胀,而WEB开发人员安全编程意识和能力严重不足,因此Web应用程序存在漏洞是难免的,给攻击者留下大量可乘之机。有些已运行的WEB应用系统由于难以更改、或更改成本过高,或系统已加密、或版权问题等原因无法更改也是WEB安全问题的重要原因。2.2Web应用常见安全漏洞>已知弱点和错误配置已知弱点指的是Web服务器的操作系统、服务器软件、硬件平台、网络协议的漏洞,例如Apache服务器本身的漏洞或者服务器FTP服务的漏洞。错误配置指的是采取了一些不安全的默认系统配置或者对需要进行安全配置的应用程序配置不正确,比如操作系统开放了远程访问权限,SQLServer开放了Shell执行权限。>隐藏字段在Web应用开发中,开发者经常使用隐藏的HTML标签来进行一些页面业务需要,但又不希望看到的参数的保存,但这些字段实际上并不是安全的,任何用户都可以通用查看网页源代码,看到隐藏字段的信息。攻击者通常通过修改隐藏字段的值来进行攻击,如果服务器对隐藏字段提交的数据充分信任的话,就很容易形成安全漏洞,并被攻击。最通常使用的是在早期的一些电子商务网,商品拍卖中,直接把商品底价等信息,直接以隐藏字段保存在网页中【51。>后门和调试漏洞‘在软件工程发展的前期,软件测试没有得到足够的重视,软件测试通常由开发人员简单执行一下。而开发人员为了方便的进行测试,通常在软件中留一些程序后门,来帮助测试程序中的bug,并且忘记在最终的软件发布产品中,把这些测试的后门关掉,就形成了攻击者攻击的漏洞。最常见的如Web信息系统开发过程中,开发人员为了访问数据库方便,通常保留一些链接可以不通过权限验证直接访问到数据库,开发过程中由于人员变迁或者时间间隔较久,这种链接在最后的发布版中依然存在。>跨站点脚本编写动态网站网页跟用户存在很多数据的交互,某些网站对这部分用户提交的数据,不执行仔细的检查就直接打印在网页中。黑客通常在提交的数据中嵌入可执行的脚本,称为跨站脚本编写【5】,然后把链接通过邮件、即时通讯软件、BBS发帖电子科技大学硕士学位论文等形式分发出去。当用户点击链接请求该网页时,黑客嵌入的脚本会在用户浏览器执行,盗取用户敏感信息。>参数篡改参数篡改的方式通常是篡改URL中query部分参数的值,大多Web站点后台都有数据库保存用户信息及业务信息,query的参数通常是生成SQL语句查询数据库的条件部分,如果Web应用程序直接使用用户提交的参数来拼接SQL语句,就会形成SQL注入漏洞,黑客把精心构造的SQL片段代替query参数发生到服务器,通过Web应用程序的拼装,就可以窃取到数据库中保存的用户敏感信息,甚至获得整个Web站点或者数据库的管理员权限。>更改Cookie一些Web站点为了提高用户体验,把用户的用户名、密码等信息以Cookie的形式保存在用户的系统中,Cookie保存信息是以键值对的形式保存,恶意的用户通过更改Cookie的值可以访问到不属于自己的信息,黑客也可以盗取用户的Cookie从而伪装成合法用户,访问Web站点,窃取用户的信剧51。>输入信息控制输入信息控制,利用CGI脚本对HTML中的输入信息检查不够的漏洞,在输入信息中嵌入一些系统命令。当一个用户通过CGI脚步向另一个用户发送信息的程序出现这种漏洞时,黑客可以在信息中嵌入系统命令,来获得系统口令或者删除系统上的文件。>缓冲区溢出缓冲区溢出是网络安全的最常见的漏洞【5】,在Web应用中同样存在。一些Web应用通常也会允许用户向服务器提交一些量比较大的数据,比如上传文件,如果服务器对上传文件的大小没有限制,上传的数据超过了服务器预设的缓冲区的大小,则一部分数据会溢出到堆栈中,如果溢出的部分为代码,贝,wJN务器接下来会执行该代码,此时黑客就可以获得该服务器运行权限下的所有数据。>直接访问浏览Web站点通过权限控制,来限制用户可以访问站内哪些URL指向的资源,如果权限配置不当,就会让恶意用户越权访问到系统中的敏感信息或者收费资源。>客户端网络带宽滥用恶意用户可以通过一些HTTP发包工具,不停请求某个Web站点的服务,造成Web站点带宽或者处理能力耗尽,不能给其他用户提供服务。这种情况最常发生在竞争对手的恶意竞争中,比如情人节时,一些网络花店商,为了提高自己的6第二章Web应用安全介绍营收,雇佣黑客对竞争对手的网站进行攻击,使其网站瘫痪。2.3Web应用安全漏洞检测技术传统的Web安全概念已经不能够应付今天Web安全的严峻现状,防火墙、IDS并不能防护针对Web应用程序漏洞的攻击,并且当前的情况是大部分关注Web安全的人员都存在一个误区,即认为Web安全主要是网络服务器的安全【8】。投入了90%的安全防护资源到只有25%攻击率的网络服务器上,仅仅投入了10%的资源到具有75%攻击率的Web应用程序上。针对Web安全严峻形势,首先必须加强Web安全知识的宣导,提高开发人员和安全人员的Web安全意识,以及加大对Web应用安全漏洞检测技术的研究。安全漏洞检测技术是网络安全防护技术的重要组成部分,不同于防火墙技术对攻击进行被动的防护,安全漏洞检测技术是模拟黑客攻击的方式去测试系统是否存在安全漏洞,对系统已知可能出现的漏洞进行逐项检测。安全漏洞检测技术最开始应用在网络服务器或者网络设备的漏洞测试,主要对服务器已知的操作系统、服务器软件、硬件平台、网络协议的漏洞进行检测。目前市场上存在的基于安全漏洞检测技术的自动化检测工具比较多,但绝大多数都是针对主机漏洞和网络漏洞进行检测,很少致力于Web应用程序漏洞的检测。根据前文的分析,我们了解到随着网络技术的发展,黑客们已经把攻击的重心转到了针对Web应用的攻击上。随着Web安全事件的攀升,越来越多的研究机构和安全组织开始研究Web应用安全漏洞检测技术。W曲应用安全漏洞检测技术是安全检测技术在W曲应用程序漏洞检测上的运用,首先它在对Web应用程序漏洞进行大量研究的基础上,对Web应用程序漏洞进行分类,并分析每种类型漏洞特征码,形成Web应用程序安全漏洞库,然后借鉴安全漏洞检测技术的自动化检测原理,研发Web应用安全漏洞检测工具【9】。目前国内外的研究现状是,基于Web应用安全检测技术研发的Web应用安全漏洞扫描工具,基本都是国外产品。最有名如IBM的APPSCAN,为收费软件价格特别昂贵,一般的中小型企业负担不起,而且使用操作也非常复杂。其他的产品像SQLInjectMe只能检测W曲应用程序中是否存在SQL注入漏洞,只能针对表单进行分析,而我们知道动态网页带参数的URL同样会存在SQL注入漏洞,而且该工具一次只能检测一个页面,无法对整个网站进行自动化测试。XSSMe是专门检测Web应用程序中是否存在XSS漏洞的工具,也存在跟SQLⅫectMe同样的缺点。目前7电子科技大学硕士学位论文在国内还缺少一款成熟的产品,据了解一些大学和国内的安全公司都开始在这个领域投入研究力量。Web应用安全漏洞检测技术的优点在于可以在Web应用受攻击前对Web应用进行健康检查,可以提早了解到Web应用存在的安全漏洞,并进行修补,降低系统受攻击的风险,是成本最低并且效果最好的Web安全防护手段。2.4SOL注入及XSS漏洞的检测2.2节给出了Web应用程序安全漏洞的大分类,具体细化的话还可以进一步分为几百种,其中最常见且危害最大的为SQL注入漏洞攻击和XSS漏洞攻击Bo]。本论文以SQL注入漏洞和XSS漏洞检测为切入点,研究基于网络爬虫的Web应用程序漏洞扫描技术。2.4.1网络爬虫2.4.1.1网络爬虫介绍网络爬虫是一个网页自动抓取程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成【111。网络爬虫通常基于广度优先策略在万维网上抓取网页,广度优先策略指在抓取过程中,先处理完当前层次的链接,再处理下一层次的链接。网络爬虫首先抓取起始地址网页,然后抓取起始网页分析出来的URL,再抓取上一步抓取的网页中的链接,直到满足系统的一定停止条件。URL(UniforrnResourceLocator)统一资源定位符,是WwW的统一资源定位标志,唯一标识一个WWW上的信息资源。URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。URL的语法格式为:protocol://hostname[:port】/path/[;parameters][?query]#fragrnent例如:http://www.imailtone.com:80/WebApplicationl/WebForml.aspx?narne---tomprotocol(协议):指定使用的传输协议,最常用的是HTTP协议,它也是目前WWW种应用最广的协议。hostname(主机名):是指存放资源的服务器的域名或P地址。在主机名前也可以包含连接到服务器所需的用户名和密码(格式:usemame@password)。path(路径):由零或多个“/’’符号隔开的字符串,用来表示主机上的一个目第二章Web应用安全介绍录或文件地址。query(查询):用于给动态网页(如使用CGI、ISAPI、PHP/JSP/ASP/AsP.NET等技术制作的网页)传递参数,可有多个参数,用“&"符号隔开,每个参数的名和值用“=”符号隔开。URL中的path部分标识了系统资源在服务器上的路径,例如/WebApplicarlonl/WebForml.aspx。/表示Web服务器根目录,/WebApplicationl/表示根目录下的WebApplicationl目录,以目录分层形成了站点的URL树,如图2-1所示:白-·舀站点结构自一镭瞄ht佃:liwww.■—■■■■keh.cn:80由.砭b。::审,·蓬函guestbook审“t函people.aspx窜”龟国tougao图2-1站点URL树图2.4.1.2网络爬虫在检测中的作用网络爬虫是Web安全漏洞扫描工具的核心组成部分,漏洞扫描工具通过网络爬虫模块来搜集目标站点的URL树,从中可以分析得到后续各个攻击模块的漏洞检测点,所以网络爬虫搜集到的站点URL的完整性,直接影响到漏洞扫描工具的检测覆盖率。Web安全漏洞扫描工具中的网络爬虫工作原理和搜索引擎网络爬虫的工作原理是基本相同的,不同的是工具中的网络爬虫只抓取目标站点网页,基于优化的广度优先策略对目标站点网页进行抓取【12.131。上一节提到,站点的URL构成一棵URL树,例如首地址为:http://www.imailtone.com:80/WebApplicationl/,网络爬虫中的URL过滤模块,对抓取过程中的URL按如下策略进行过滤:站外URL、非首地址URL子树的URL、重复的URL、同类型重复出现的URL。通过9电子科技大学硕士学位论文按照上述策略进行URL过滤后,可以在保证抓取覆盖率基本不变的情况下,极大的减少HTTP请求个数,能够大幅度提高系统的扫描效率。同时限定初始化URL子树的抓取策略,可以方便对大型站点进行拆分分析,提高工作效率。网络爬虫的工作流程,如图2.2所示:(,\开始、/J初始URL上H抓取网页上网页解析上URL格式4-1=占URL过滤j上URL保存上URL入队——■Z::—~tY图2-2网络爬虫工作流程图2.4.2S0l注入漏洞2.4.2.1SOL注入概念Web系统通常由前端的Web应用加后台的数据库组成。SQL注入是针对Web系统数据库的攻击手段。SQL注入采取SQL语法进行攻击,利用应用程序的漏洞,构造恶意的SQL语句注入到后台数据库执行【14】。目前来说,十大针对Web应用lO第二章Web应用安全介绍攻击手段,SQL注入名列榜首。2.4.2.2SGL注入产生原因Web应用程序存在的SQL注入漏洞,通常是开发人员在系统开发过程中引入的。开发人员可能由于缺乏Web安全方面的相关知识或者安全编程方面的经验,导致在编写代码时考虑不够完善,对用户提交的数据没有进行适当的验证,直接采取用户提交数据构造数据库查询语句,从而引入了SQL注入漏洞。SQL注入攻击,不同于网络层面的攻击,利用的是Web应用开放的端口,通常不被防火墙等设备检测到,所以SQL注入的特点是隐蔽性很高【15】,如果不是攻击者故意留下痕迹,或者管理员有查看数据库日志的习惯,基本不会被发现。Web应用开发周期短,开发人员进度压力较大,也是造成漏洞的原因之一。攻击者发现SQL注入漏洞后,通过构造SQL语句,就可以获得他想要的数据库敏感信息。W曲应用程序存在下面的情况【16】,存在SQL注入漏洞风险比较高:1.编程人员用网页上的输入参数,用字符串连接的方式拼凑SQL语句。2.使用过大权限用户访问数据库,如SQLServer的sa用户或者mysql的root用户。3.数据库开发了权限过大的功能,如SQLServer数据库的xp4.对用户的输入数据,完全不进行过滤。2.4.2.3SOL注入攻击过程第一步:判断Web应用是否可以进行SQL注入。如果URL仅是对静态网页的访问,不存在SQL注入问题,如:http://news.XXX.corn.cn/20305657658.shtml就是普通的网页访问。只有存在数据库动态查询请求的URL,才可能存在SQL注入,如:http:llwww.xxx.cn/web.jsp?id=39,其中?id=39表示数据库查询变量,这种语句会在数据库中执行,因此可能会给数据库带来威胁。第二步:寻找SQL注入点。完成带参URL的查找后,通过构造一些特殊SQL语句,替换掉URL参数的值,然后根据浏览器返回信息,来判断该URL是否为SQL注入点。第三步:猜解用户名和密码【171。软件开发人员设计的数据库表名、字段名通常是有规律可循的。通过精心构建的SQL语句在数据库中依次查找表名、字段名、用户名和密码的长度等内容。第四步:寻找Web系统管理后台入口。通常Web系统后台管理的界面不向普电子科技大学硕士学位论文通用户开放,要寻找到后台的登陆路径,可以利用扫描工具,对可能的后台入口地址进行测试。第五步:入侵和破坏。成功登陆管理系统后,接下来就可以任意进行破坏行为,如篡改网页、上传木马、修改、泄漏用户信息等,并进一步入侵数据库服务器。2.4.2.4SQL注入攻击危害目前几乎所有政府、电信、移动、证券、银行以及电子商务企业都提供查询、在线交易和在线咨询服务。用户的敏感信息包括个人账户、身份信息、交易记录等等,都是通过Web应用系统存储在后台数据库中,这样的在线服务一旦崩溃,或虽然运行正常,但数据库数据已被盗取或篡改,都会给企业及其用户构成巨大的损失。据相关部门统计,身份失窃目前已成为全球最严重的问题之一。政府网站被外来势力攻击和篡改,造成了恶劣的社会影响,已经在危害着社会的稳定。2.4.2.5SOL注入漏洞检测方法SQL注入漏洞的检测就是模仿黑客攻击网站的方法进行检查,因此漏洞检测的步骤和攻击的步骤很相似。因为网页存在对数据库的访问,才会存在SQL注入漏洞风险,所以首先需要收集带query字段的URL。如:http://www.xxx.cn/web.jsp?id=39。分别用原始的URL和预先设计好的测试脚本依次替换掉query的变量值后的URL进行HTTP请求,记录HT]rP回应头和回应头。对返回的HTrP报文进行分析,满足一定的条件,则说明该网页存在SQL注入漏洞风险。具体的测试方法分为两类【18】:>基于异常反馈信息的检测测试URL;http:llwww.料:l:.cn/bbs/list.asp?boardid=1071.测试脚本:“’”则连接变为l啪:价哪w.料木.crffbbs/list.asp?boardid=107’请求该链接,用抓包工具,捕捉回应的H1]限报文,存在以下情况说明该URL存在SQL注入漏洞的风险非常大:HTTP回应码为“500”:HT刀吖1.1500InternalServerError或者HTTP回应体存在类似内容:MicrosoftOLEDBProviderforSQLServer错误·80040e14’12第二章Web应用安全介绍字符串”之前有未闭合的引号。以上内容为SQLServer数据的数据异常信息。/bbs/list.asp,行332.测试脚本替换为:“’伪则连接变为11竹p://mvw-料宰.cn/bbs/list.asp?boardid=107”请求该链接,用抓包工具,捕捉回应的HTTP报文,存在以下情况说明该URL存在SQL注入漏洞的风险非常大:HTTP回应码为“500”:HTIT/1.1500InternalServerError或者HTTP回应体存在类似内容:MicrosoftOLEDBProviderforSQLServer错误’80040e14’不能使用空白的对象或列名。如果必要,请使用一个空格。/bbs/list.asp,行33服务器HTTP回应码500,通常是由于数据库异常访问导致的,所以回应码也可以作为SQL注入的判别特征,更明显的服务器返回的异常信息包含上述提到的特征字段,则数据库肯定是处在不安全的状态,Web应用程序直接把数据库异常信息,暴露在用户面前是非常危险的,黑客可以从异常信息得到数据库类型、版本、甚至有时候会暴露表名或字段名。并且SQL注入的风险相对大。具体的异常特征字段对每种数据库都是不一样的,所以需要收集各种数据库异常特征字段进行SQL注入漏洞的判断。>经典的1=1、1=2检测法不是所有的Web应用程序都会直接把数据库的异常信息直接返回给用户。通常的Web应用都会对常见的错误,较常见的有404、500,进行异常包装,用定义的比较友好的错误提示页面,取代系统的默认出错提示。或者有的稍有W曲安全概念的开发人员,以为屏蔽掉“’’’就可以避免SQL注入了,这种情况在实际的经验中,也确实存在过。这种情况下,是否存在SQL注入漏洞,用第一种检测方法就比较不准确了,此时就应该采用第二种测试办法,按如下方法请求:1.h却://www.料木.cn/bbsflist.asp?boardid=1072.http://www.宰木丰.cn/bbs/list.asp?boardid=107and1=13.http://www.枣木书.cn/bbs/list.asp?boardid=107and1=2这是针对数字型参数的1=1、1=2测试,除此之外还有字符型,这种测试方法13子科技大学硕士学位论文1.请求1正常显示2.请求2正常显示,且和请求1页面一样3.请求3显示和请求1,2不一样,提示出错或找不到记录或显示为空以上提到的检测方法都着重在检测原理的阐述,在实际运用中,还会尝试构造更多的测试脚本,具体的测试脚本构造会在实现部分详细介绍。2.4.3XSS漏洞2.4.3.1XSS概念现在的Web站点为了提高用户的体验,增加了很多动态的内容,动态内容通常是通过脚本语言来输出的。这类型的Web站点会受到XSS的攻击,XSS又叫CSS(CrossSitescrip0,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web页面的html代码会被执行,从而达到恶意用户的特殊目的【19】。XSS属于被动式的攻击,因为其被动且不好利用,所以许多人常呼略其危害性。目前来说,十大针对Web应用攻击手段,XSS名列第二。2.4.3.2XSS产生原因XSS漏洞可以分为两种类型【19】:一类是来自内部的攻击,主要是利用目标Web站点网页自身的漏洞,构造跨站脚本进行攻击。这种跨站漏洞产生的原因是Web应用程序没有对用户提交的参数进行充分的检查和过滤,攻击者通过提交特殊的跨站脚本,使得XSS漏洞直接存在于日标站点上。这种情况下受侵害的一般是该站点的用户,并且如果站点使用了Ajax功能,还可能被盗用服务器上的信息。另一类是来自外部的攻击,攻击者自己搭建站点,放置跨站网页,诱使攻击目标点击访问。这种情况,攻击者一般使自己的站点域名,跟一些知名站点域名类似,借以骗取被攻击者的信任。2.4.3.3XSS攻击过程XSS攻击一般采用社会工程学的方式进行。当攻击者发现站点跨站漏洞或者自己构造的跨站漏洞后,会把具有跨站漏洞的网页URL通过多种方式进行分发,例如:邮件、即时通讯、论坛发帖、博客等。通常攻击者还会用十六进制或其他14第二章Web应用安全介绍编码格式对URL进行编码,以降低用户对URL合法性的怀疑。当有用户在聊天、收邮件、或者逛BBS时不小心点击了该链接,网页的跨站脚本就会在用户浏览器执行,盗取用户Cookie、吸引用户输入一些敏感信息,如身份信息、信用卡信息等。2.4.3.4XSS攻击危害XSS攻击是目前危害最严重的Web安全攻击方式之一,其危害包括:窃取各类用户帐号,如邮件帐号、信用卡帐号、游戏帐号;窃取企业具有商业价值的重要资料;操纵企业数据,包括上传、下载、篡改、删除敏感的企业数据;网页挂载木马;电子邮件强制发送;非法转账;以受害者机器为攻击跳板。2.4.3.5XSS漏洞检测方法XSS漏洞检测的方法,同样是模拟黑客攻击的方法。类似SQL注入漏洞检测,XSS检测首先需要收集带query字段的URL。具体测试方法[2s】:测试URL:http://www.xxx.on/search.jsp?fitle=news。测试脚本:<script>alert(‘XSS’)</script>替换query变量值请求:http://www.xxx.on/search.jsp?keyword=<script>alert(‘XSS’)</script>结果分析:抓包工具抓取该请求的HTTP响应报文,如果回应体里检测到发送的测试脚本<script>alert(‘XSS’)</script>贝JJ说明该URL存在跨站漏洞风险。上述测试方法是对XSS漏洞检测的原理描述,实际运用中对测试脚本还有更多构造方法,在实现部分中会详细介绍。2.5本章小结本章首先介绍了Web应用安全的国内外现状,接着给出了Web应用常见安全漏洞分类,然后重点分析了Web应用安全检测技术的国内外研究现状和目前的研究产品,最后研究总结了基于网络爬虫的SQL注入和XSS漏洞检测原理。15图3—1WebScanner整体结构图第一部分:扫描调度引擎专门负责扫描模块的调度,与扫描任务的具体执行相隔离,无论扫描模块增加或者减少,都不影响调度引擎的调度逻辑。第二部分:扫描模块根据分析,所有的扫描模块,文章中涉及到的:如网络爬虫、SQL注入漏洞扫描、XSS漏洞扫描,文章中未涉及到的:如敏感目录、服务器方法等都具有同样的核心实现原理,在H们曙协议的基础上,构造漏洞探测请求,分析回应来判断是否存在漏洞【231。因此系统对整个扫描过程,高度抽象后,对所有扫描模块采用统一的设计。第三部分:公共组件对调度引擎和扫描模块中,使用到的公共功能,如配置文件访问、H订P传16第三章Web应用安全漏洞扫描工具系统设计输模块、线程池模块、数据库模块,作为公共组件。3.1调度引擎(ScanEngine)设计3.1.1调度引擎工作原理调度引擎除了一些系统初始化的工作外,核心工作就是调度扫描模块执行。对扫描模块的调度,简单的实现方法,其实也可以直接在程序代码里,指定先执行哪个模块再执行什么模块。但这样设计的话,实际上具体的调度模块已经侵入到了扫描模块的调度逻辑,如果此时需要增加或减少一个模块,就会修改代码。设计调度引擎的目的,就是要达到调度逻辑和具体调度模块的解耦的效果【241。具体的设计方案,就是扫描模块的执行顺序,以配置文件的形式提供。扫描调度引擎根据配置文件,动态加载扫描模块执行,扫描模块的增减只体现在配置文件的修改上,从而达到上述的设计效果。调度引擎工作原理如图3—2所示,模块的虚线箭头表示,该模块不一定会被真正调用。图中扫描匿园兰与隧幺叠芦喇———叫圈i囱|囱{自图3-2扫描调用引擎工作原理3.1.2调度引擎类结构调度引擎功能明确,类结构如图3—3所示,只有一个ScanEngine类。类成员和方法都围绕调度引擎功能来设计。httpTransHandler成员:HTrP数据传输模块17电子科技大学硕士学位论文旬柄。threadPoolHandler成员:线程池句柄。configI-Iandler成员:配置文件读写模块句柄。dataBaseHandler成员:数据库操作句柄。scanModuleQueue成员:从配置文件读取的需要依次被动态创建执行的扫描模块。Init函数:初始化函数,执行配置文件加载,公共组件初始化操作。Dispateh函数:执行扫描模块的调度执行。ScanEngine+httDTransHandler+threadP001Handler+configHandler+dataBaseHandler+logHandler#scanModuleQueue+Init():void+Dispatch0:void图3-3ScanEngine类图3.1.3调度引擎工作流程WebScanner启动后立即执行调度引擎模块。扫描调度引擎是系统的大脑,在这里系统的配置文件会被装载,系统的公共组件会被初始化,还有根据上一节讲述的工作原理,系统的扫描模块会被调度。扫描调度引擎的简要工作流程如图3.4所示:(,\开始、)/◆配置文件加载1L公共组件初始化1L扫描模块调度土(结束)图3_4SeanEngine简要流程图第三章Web应用安全漏洞扫描工具系统设计第一步:配置文件加载扫描调度引擎,负责系统配置文件,数据库配置文件加载。第二步:公共组件初始化根据配置文件内容,初始化配置文件访问、Hw曙传输模块、线程池模块、数据库模块等公共组件。第三步:扫描模块调度根据系统规则和配置文件,动态加载扫描模块,并顺序调度。3.2扫描模块(ScanModule)设计3.2.1扫描模块工作原理WebScanner中的网络爬虫、SQL注入扫描、XSS扫描等模块统称为扫描模块。之所以把这些模块划分为一类,是因为这些模块具有同样的实现原理。HTIIP协议是一个客户端和服务器端请求和应答的标准。客户端通常是浏览器,称为用户代理(useragent),服务器端就是W曲服务器。扫描模块的核心思想就是模拟浏览器和服务器交互的过程,并且通常就伪装成浏览器,向服务器发送具有特定漏洞检测特征的HTTP请求,期望从服务器的应答中来发现服务器存在的Web应用安全漏洞【25l。由于这种特性,黑客或者Web安全人员也常常使用浏览器,作为一些常见Web应用安全漏洞,如前面提到的SQL注入漏洞、XSS漏洞的检测工具。扫描模块的作用就是对这种HTTP请求构造、HTTP请求发送、HTTP回应接收、HTTP回应分析和检测结果数据保存,整个流程自动化、程序化。扫描模块的核心原理如图3.5所示:ttTTP请求圃臣夏=z=z互奇1..................一Web安全漏洞扫描程序计算机夺=互互显互四ttTTP回应Web服务器图3-5扫描模块核心原理图通过这种程序化的方式,采用并发编程技术,可以同时执行多个检测任务,这样扫描模块就可以短时间执行大批量Web应用安全漏洞检测任务,大大节省了Web应用安全漏洞发现时间,通过即时修补,降低Web应用的安全风险。19电子科技大学硕士学位论文扫描模块探测流程代表了扫描模块的共性。具体到一个特定的扫描模块会有细微的差别,如SQL注入模块,H,丌P请求的构造会有自己特定的参数,HTTP回应分析也会根据本漏洞特有的检测方法进行,探测结果数据保存也会由于数据结构的差异会有些微的不同。3.2.2扫描模块整体结构扫描模块是被扫描引擎调度执行的,扫描模块除了执行上一节讲述的通用流程外,还需要接收扫描引擎的命令,因此扫描模块需要设计为一个单独的线程,对于并发漏洞检测HTrrP请求的功能需求,设计线程池来满足,同时如前文中提到Web安全漏洞扫描工具的数据保存量比较大,所以设计一个文件DB来保存数据。ScanModule的整体结构设计【26】如图3-6所示:矩形框内的是线程池执行部分,功能包括:1.网页抓取:网页抓取是所有扫描模块的核心功能,无论是爬虫还是SQL注入等工具模块,只是具体模块发送的HTTP报文存在差别。2.漏洞分析:漏洞分析也是所有扫描模块的核心功能,区别在于对于爬虫来说,漏洞分析只是解析网页中的URL链接,而对于攻击模块来说就是分析是否存在漏洞。3.数据保存:数据保存同样是所有扫描模块的核心功能,结果数据保存到文件DB,当然各个模块发送或保存的数据是有一定差异的。矩形框外都是扫描模块线程负责执行部分,以轮询的方式执行功能包括:1.批量保存数据保存任务队列的任务到文件DB。2.批量从文件DB加载数据到UI也队列。3.从URL队列读取URL,根据测试脚本,构造测试任务加入ScanTask队列。4.读取ScanTask任务,丢入线程池执行。5.判断任务队列状态,线程池状态。20第三章Web应用安全漏洞扫描工具系统设计图3-6扫描模块整体结构图3.2.3扫描模块类结构扫描模块具有同样的核心流程和整体结构,所以很适合为扫描模块抽象出共同的接口。同时根据扫描模块整体结构图可以看出,扫描任务也可以抽象出共同的接口,扫描模块类结构如图3.7所示。Runnable接口:Runnable是仿照Java线程库的设计的线程接口,其中定义了一个run方法,需要线程执行的类可以实现该接口,这部分会在线程模块的设计做详细介绍。AbstractModule抽象类:扫描模块抽象类,实现了Runnable接口,并且定义了扫描模块在模块初始化、扫描命令接收、任务队列管理、数据库管理、Hash表管理、线程池监控等方面的函数接口。Init函数:扫描模块开始执行时调用,初始化模块配置。FlushDataToDB函数:按照系统策略把数据保存任务队列的数据刷到数据库。LoadDataFromDB函数:按照系统策略批量把数据库数据加载到URL队列。IsDataSaveQueueEmpty函数:判断数据保存任务队列是否为空。IsUrlQueueEmpty函数:判断UrlQueue是否为空。CreateTask函数:从URL队列读取URL,根据测试脚本,生成扫描任务,插入到ScanTask队列。IsTaskQueueEmpty函数:判断ScanTask队列是否为空。ExecuteTask函数:按照系统策略从ScanTask队列读取任务,放到线程池执行。IsThreadPoolBusy函数:判断线程池是否还有线程任务在执行。GetCommand函数:获取ScanEngine发送的命令。InsertI-IashMap函数:尝试往hashmap插入2l描参数设置、网页抓取、网页分析、数据保存等方面的函数接口。FetchHtml函数:网页抓取接口。VulnerabilityAnalyze函数:执行漏洞分析的接口,存在漏洞返回True。SaveDataToDB函数:执行数据保存到数据库的操作。ScanModule是一个扫描模块通用实现类,该类继承自AbstractModule类,对抽象扫描模块的接口做了简单的实现,并且管理了一些扫描模块需要用到的数据结构。scanEngineHandler.维护的扫描引擎旬柄,用于访问扫描引擎的接口和公共组件。dataSaveTaskQueue:保存数据任务队列,用于保存需要执行的SQL语句,按策略批量执行,减少数据库并发,提高事务粒度,减少执行时间。urlQueue:URL对象队列,保存从数据库加载的URL。ScanTaskQueue..扫描任务队列,保第三章Web应用安全漏洞扫描工具系统设计存构造好的扫描任务。urlHashMap:一个key为字符串的HashMap用于在扫描任务执行时,做一些重复URL过滤操作。ScanTask是一个扫描任务的通用实现类,该类继承自AbstractTask类,对抽象接口做了简单的实现,并且管理了扫描任务需要用到的数据结构。testUfl:此次任务执行的啊l对象。testPararn.此次任务执行测试的变量。testParamScript:此次任务执行用的测试脚本。设计通用实现类ScanModule和ScanTask的考虑是,当实现一个具体的扫描模块,如网络爬虫CrawlerModule类直接从ScanModule继承,CrawlerTask类直接从ScanTask继承,由于通用实现类已经实现了抽象接口的方法,所以网络爬虫扫描模块可以不做任何修改,先让整个调度执行流程先run起来,边查看运行情况,边覆盖需要修改的虚方法,可以提高扫描模块的开发效率。3.2.4扫描模块工作流程SeanModule的总体工作流程步骤如下:第一步:ScanModule线程启动,调用Init接口初始化扫描模块。第二步:调用GetCommand判断是否收到停止命令,收到停止命令则向线程池发送停止命令,然后执行下一步。未收到停止命令则转到第六步。第三步:调用IsThreadPoolBusy判断线程池是否仍在执行任务。第四步:调用IsDataSaveQueueEmpty判断数据保存任务队列是否为空,不为空则调用FlushDataToDB保存数据到数据库。第五步:综合三四步的结果,判断条件:ThreadPoolBusy为假且同时DataSaveQueueEmpty为真。如果条件满足,转到第十二步。如果条件不满足,转到第二步。第六步:调用IsThreadPoolBusy判断线程池是否仍在执行任务。第七步:调用IsDataSaveQueueEmpty判断数据保存任务队列是否为空,不为空则调用FlushDataToDB保存数据到数据库。第八步:调用LoadDataFromDB按照系统策略,加载一定量的url到URL队列。第九步:调用IsUrlQueueEmpty判断url队列是否为空,不为空调用CreateTask接口创建ScanTask插入ScanTask队列。第十步:调用IsTaskQueueEmpty判断ScanTask队列是否为空,不为空调用电子科技大学硕士学位论文ExecuteTask把任务丢掉线程池执行。第十一步:综合六、七、九、十步的判断结果,判断条件:ThreadPoolBusy为假且DataSaveQueueEmpty为真且UrlQueueEmpty为真且TaskQueueEmpty为真,如果条件不满足转到第二步,满足执行下一步。第十二步:扫描模块执行结束。3.3本章小结本章在基于HTTP协议的Web应用安全漏洞扫描技术核心原理的基础上,设计了扩展性良好的Web安全漏洞扫描工具(WebScanner)的系统基础架构,并对主要构成部分的工作原理,类结构和工作流程做了分析。第四章Web应用安全漏洞扫描工具详细设计与实现第四章Web应用安全漏洞扫描工具详细设计与实现4.1公共组件4.1.1配置文件模块4.1.1.1配置文件设计系统所有可变参数,全都配置文件化,系统配置文件结构如图所示4.1所示:图4-1系统配置文件结构图Config.xml是系统读取的第一个配置文件,它不做具体的配置,只是记录其他几个配置文件相对它的路径。需要这样做的原因是如图所示,登录序列配置文件(LoginSequence.xml)和扫描模板配置文件(ScanTemplate.xml)用不同颜色用于区别是因为,用户可以定义自己的登录序列文件和扫描模板文件,所以两个文件的文件名都是可变的,需要做这样的处理。SysConfig.xml定义一些系统参数,如开启最大线程数等。DataBaseConfig.xml顾名思义是对数据库相关内容进行配置。有时候需要登录系统后台进行扫描,前台模拟登录时会采用抓包的方式,抓取到电子科技大学硕士学位论文系统分配给用户的Cookie信息,保存到LoginSequence.xml文件中,用以在接下来的扫描执行时,设置上Cookie,抓取系统后台的网页。ScanTernplate.xml配置了一次扫描过程中,哪些扫描模块会被执行,扫描模块用属性配置是否执行。扫描模板还记录了每个模块的模块参数配置文件,如爬虫模块CrawlConfig.xml,SQL注入模块:SQLInjection.xml,XSS扫描模块:XSS.profile。4.1.1.2配置文件读写实现如上所述,系统的配置文件绝大部分都是XML文件形式的,如果直接采用eH标准库开发XML文件的读写是比较复杂的,因此系统引入了TinyXml[27】库,来实现系统XML配置文件读写功能。TinyXml是一个基于DOM模型的轻量级C++开源XML解释器。DOM(文档对象模型),即是在XML解析时将整个XML文档一次性装载入内存中,形成对应的树结构,同时向用户提供接口来访问和编辑树节点。TinyXml类结构:TinyXml的类结构非常简单,TiXmlBase:所有TinyXML类的基类,保存该结点或属性在XML原文中的信息。TiXmlAttribute:XML结点属性,键值对。TiXmlNode:XML结点的基类,封装了对XML文档树形结构进行操作和维护的方法。TiXmlDeelaration:XML声明结点。TiXmlDocument:XML文档结点。TiXmlElement:XML结点。TiXrnlText:XML文本结点。TiXmlComment:XML注释结点。TinyXml接口介绍:∥读取配置文件TiⅪn1Documentdoc(”SysConfig.xml”);doe.LoadFile(”SysConfig.xml”);∥保存配置文件TiXmlDocumentdoe;doe.SaveFile(”SysConfig.xml”);∥遍历配置文件首先以FkstChild获得第一个儿子节点,然后NextSibling获取下个兄弟节点,如此递归遍历所有节点即可。TiXrnlNode::FirstChild0;第四章Web应用安全漏洞扫描工具详细设计与实现TiXmlNode::NextSiblin90;//设置节点属性TiXmlElement::SetAttribute0;4.1.2线程池模块4.1.2.1多线程库设计与实现系统采用多线程编程技术,来保证漏洞扫描工具的执行效率。多线程编程的目的就是最大限度利用CPU资源,当某一线程不需要占用CPU只和I/O等资源打交道时,让需要占用CPU资源的其它线程有机会获得CPU资源。c++标准库中并没有多线程库的支持,因为多线程需要操作系统的支持,目前流行的C++库有许多,但还没有统一的标准,接口十分复杂,而且大多数是对操作系统API的简单封装,不是完全面向对象,不利于使用。本文在深入研究Java多线程库基础上【28】,基于其接口规范,结合面向对象及设计模式的思想,设计了轻量级跨平台的C十+多线程库。为了保证多线程库的易用性,在Java多线程库接口基础上进行剪裁,保留了进行多线程开发常用而且必要的接口,并保留其原始语义。线程库的类图如图4。2所示:线程库核心包括三个接口对象:NativeThread接口,NativeMonitor接口,NativeFactory接口和一个运行时类Runtime。此部分代码是在名字空间ilib::core中:namespacejlib{…namespacecore{…))NativeThread接口是线程对象的抽象基类,各平台的具体线程线程对象类是NativeThread的派生类,主要接口描述如下(本文中对接口的描述如未特别提及,则说明其是公共接口):1.NativeThread:传入Runnable构造线程对象实例。2.start:启动线程。3.join:等待线程结束。4.isAlive:判断线程是否还在运行。27电子科技大学硕士学位论文Monitor目椰Nat.ⅣeMonhor:NativeMonitor"’'Monitol0’-Monitor嚣宙%.vaitO’wait0,oti矗O’们i~A110%nter0’IeaveO图4_2线程厍类图NativeMonitor接口是实现线程同步的抽象基类,各平台的具体线程同步类是NativeMonitor的派生类,接口描述如下:1.enter:获取锁。2.1eave:释放锁。3.notify:随机唤醒一个等待该锁对象的线程。4.notifyAll:唤醒所有等待该锁对象的线程。5.wait:线程等待资源,释放锁,进入阻塞状态,直到被其他线程唤醒或超时。NativeFactory基于抽象工厂模式【291设计,负责线程对象和锁的创建,以及其他公用方法的实现。每个平台下负责派生具体的工厂类。接口描述如下:1.createMonitor:返回一个NativeMonitor实例。2.createThread:传入一个Runnable,返回一个NativeThread实例。3.sleep:当前线程休眠,参数毫秒。mmtime类基于单实例模式【2明设计,实现跨平台机制的类,接口描述如下:1.nativeFactory:静态函数,在运行时返回对应平台下唯一的工厂实例。28第四章Web应用安全漏洞扫描工具详细设计与实现线程库个平台下的具体实现版本是通过派@jlib::core中的接口来实现的。此部分代码在名字空间jlib::平台名::lallg中:namespacejlib{…namespace平台名{…namespacelang{…)))基于易用性的思想,本线程库设计了基于Java接口裁剪而来的Runnable接口,Thread类,Monitor类,Lock类和sychronized关键字,提供了与Java多线程库相同的外观。此部分代码是在名字空间ilib::lang中:namespacejlib{…namespacelang{…))Runnable接口:1.ran:子类覆盖此函数,实现具体的线程代码。Thread类使用外观模式㈣提供Java线程类外观,它实现的功能都是调用NativeThread和NativeFactroy得到。Monitor类使用外观模式【291,配合sychronized关键字提供Java线程同步外观,它通过调用NativeMonitor和NativeFactroy实现功能。Lock类,是Monitor管理类,类描述如下:1.Lock:传入Monitor,调用Monitor.enter加锁。2.~Lock:Monitor.1eave释放锁。3.Lock(Lock&):拷贝构造。4.Operator=(Lock&):赋值函数synchronized关键字,配合Monitor提供Java同步类使用外观,实现如下:#definesynchronized(x)if(Lockl—o—o—k=x)。x为Monitor对象由于L0ck类的赋值函数参数为L0ck,当传入参数为Monitor时,会进行隐式类型转换,调用Lock类的构造函数加锁,推出if语句的作用域时会自动调用Lock的析构函数释放锁。跨平台的支持:C++是通过宏和条件编译语句来实现跨平台的,由于Runtime类基于单体模式实现,是本线程库的入口,通过其nativeFactory接口我们能获得具体平台的唯一工厂实例。由于本线程库所有具体类来自于工厂,所以动态切换工厂就可以达到29电子科技大学硕士学位论文跨平台的效果。未来可以继续添加更多平台的支持,非常容易扩展。4.1,2.2线程池的设计与实现线程池一种常见多线程处理工具,线程池的基本原理很简单,通常内部维护一个任务队列,队列里的所有任务都实现同一个任务接口,然后线程池会生成多个具有相同优先级的线程,读取任务队列的任务,进行执行[28】。一个实际运用的线程池,通常会设计一个管理类,提供一系列接口,让外部模块可以对线程池进行配置和控制。线程池的整个类结构如图4.3所示:ThreadPoolManager—bStop:bool—taskQueue:TaskOueue—workThreadQueueWorkThreadQueue—taskQueueMonitor:Monitor+ThreadP001Manager(insize:unsignedint)+exeeuteTask(inpTask:constTask*):void+getThreadSi0:unsignedint+getBusyThreadSizeO:unsi&,nedint+isTaskQueueEmDtY0:bool+getTaskQueueSize0:unsignedint+isThreadPoolBusyO:bool+stopThreadPoolO:b001+1ThreadPoolManager(insize:unsishedint)图4—3线程池类结构图ThreadPoolManager类:线程池管理类,负责任务队列的管理,工作线程队列的管理,线程池状态的管理。bStop成员:标识外部是否发给线程池停止命令。taskQueue成员:线程池任务保存队列,队列里的任务都实现了Task接口。workThreadQueue成员:工作线程保存队列,常被用来遍历访问线程池工作线程状态。taskQueueMonitor成员:同步互斥变量,用于任务队列的并发访问控制。ThreadPoolManager构造函数:传入需要构造线程池,初始线程数。executeTask函数:执行任务,实际上把任务放入线程池任务队列,等待线程池执行。getThreadSize函数:返回线程池创建的线程数。getBusyThreadSize函数:返回线程池正在执行任务的线程数。stopThreadPool函数:向线程池发送停止命令,内部置bStop为true。isThreadPoolBusy函数:判断线程池是否仍有线程还在执行任务。getTaskQueueSize函数:返回任务队列任务数。isTaskQueueEmpty函数:判断任务队列是否为空。~ThreadPoolManager析构函数:用于在线程池管理类退出是,释放任务队列还未执行的任务资源和工作线程队列的线程资源。Task接口:需要置入线程池执行的任务需要实现的统一接口。execute函数:任务被调度第四章Web应用安全漏洞扫描工具详细设计与实现执行的方法。WorkThread类:工作线程类从线程库线程类Thread类继承,负责线程池任务的具体执行工作。rThreadPoolManager成员:线程池管理类的引用,用以访问线程池管理类的成员,线程池管理类会把WorkThread申明为友元。bStop成员:标准该线程是否正在执行任务。WorkThread构造函数:传入线程池管理类的引用。run方法:实现Thread的线程接口,具体实现从任务队列读取任务执行等操作。nln方法具体实现如下:voidWorkThread::rtm0{while(trThreadPoolManager.bStop){Task木pTask=null;Sychronized(rThreadPoolManager.taskQueueMonitor){pTask=rThreadPoolManager.front0;rThreadPoolManager.pop0;)if(null!=pTask){bBusy=true;pTask->execute0;deletepTask;pTask=null;bBusy=false;>else{sleep(20);>))31电子科技大学硕士学位论文4.1.3数据库访问模块4.1.3.1数据库连接池设计数据库对于本系统而言是一个共享资源,系统模块在访问数据库时会先请求数据库连接,执行完相关操作后会释放数据库连接,过程中对连接的创建和释放都是很耗费数据库资源的。对于共享资源,存在一个良好的设计模式:资源池【30】。该模式主要解决的就是资源的频繁分配和释放的问题。针对数据库而言,可以采取数据库连接池的方式进行设计。图4-4数据库连接池工作原理图数据库连接池的工作原理如图4—4,连接池主要作用是对数据库连接进行统一的创建、管理和释放,并提供接口供外部对连接池进行配置、申请链接、释放连接等。连接池的管理工作设计类DBConnectionPool完成,具体的数据库连接设计类DBConneefion。详细的类结构图在实现部分会给出。4.1.3.2动态数据构件的设计通常c++对关系型数据库的访问,都是通过编写SQL语句来完成的。这样的实现在功能上是可行的。但从设计的角度来看,这样导致的结果是数据库操作的代码侵入了系统业务逻辑方面的代码,并且散布在系统的各个角落。而且从实践的角度来看,数据库表在开发过程中,通常是会发生变化的,基于SQL语句的开发,往往在表发生变化的时候,会修改所有使用访问该表的SQL语句代码,工作量大,出错的机会也比较高。在Java等语言的开发中,为了解决数据库访问的上32第四章Web应用安全漏洞扫描工具详细设计与实现述问题,通常是引入对象关系映射(ObjectRelationalMapping,简称ORM)技术,该技术是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将iava程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。基于这方面技术流行的框架是Hibernate,基本统一了Java数据库开发的市场。对于Java能采用ORM技术的原因是其天然的优势,Java是解释性语言具有虚拟机,其具有代码自醒能力,通常称为Java反射机制,这在c++开发中是做不到的。但对于这种“将数据从一种形式转换到另外一种形式"的设计思想,在C++的开发中还是能借鉴的,因此本文在研究ORM技术原理的基础上,提出了可应用C++开发的动态数据构件技术。所谓软件构件即是指其独立于系统,可以方便更换,具有特定功能性的模块。动态数据构件设计主要包含两个部分:元数据映射文件【31】和动态数据对象。元数据映射文件主要定义对象和关系数据库表的映射关系,具体到对象的一个什么类型的属性,对应到数据库一个什么类型的字段。根据本系统应用的特定,目前动态数据构件的实现,只实现了数字型和字符型的映射,在以后的应用中可以继续扩展。以网络爬虫模块的部分元数据映射文件为例:<beanname=”CrawlerDataObject”tableName=”CRAWL—RESULT”>name=”strUrl"isNumeric=”0”columenName=”URL"<propertydbType=”VARCHAR(256)”,><propertyname=”strMethod”isNumeric--”0”columenName=”METHOD”dbType=”VARCHAR00)’’/></bean>其中bean节点有两个属性:name定义了对象名,tableName定义了映射到的数据表。Property节点代表的是条对象属性和数据库字段的映射,name属性定义了对象属性名,isNumeric定义了数据库类型是否为数字型,columenName定义了数据库字段名,dbType定义了数据库类型。动态数据构件在启用时,会首先把元数据映射文件加载到内存,根据元数据映射文件可以创建定义的表,在保存对象时也可以根据具体的数据类型映射,自动的构造SQL语句。动态数据对象的应用是在元数据映射文件的基础上的。动态数据对象本质是一个复杂的容器,内部除了一个记录对象名和一个记录数据库报名的两个简单成员外,就是四个哈希表成员,如图4.5:33e:保存数据对象名称;为对象属性名,valuevalue为对象类型(是value为对应的数据库字段名;columnType:哈希表,key为数据库字段名,value为数据库字段类型。4.1.3.3基于SOLite的数据库访问模块实现SQLite[32】是一种开源的嵌入式关系数据库,它在2000年由D.RichardHipp发布。SQLite嵌入到使用它的应用程序中,它们共用相同的进程空间,而不是单独的一个进程。从外部看,它并不像一个RDBMS,但在进程内部,它却是完整的,自包含的数据库引擎。SQLite减少了应用程序管理数据的开销,且SQLite的数据库就是一个单独的文件,而且采用自己专业的文件格式,移植性非常好,可以运行在Windows,Linux,BSD,MacOSX和一些商用Unix系统。SQLite是开源项目,可以自己下载源代码来编译。系统采用动态链接库的形式来使用SQLite。本文在数据库连接池技术和动态数据构件技术的基础上,对SQLite文件数据库的访问进行了封装。整个数据库访问模块的类结构如图4—6所示:DBConnectionPool类:数据库连接池管理类,该类具有双重职责,职责一:数据库连接的管理,职责二:动态数据构件的管理。下面是主要的成员介绍。metaTableVec:元数据映射文件以DataObject的形式加载到内存后,保存到这个vector,供后续数据库操作生产SQL语句时使用;getDBCPInstance:静态函数,单例模式的接口;init:数据库连接池使用前需要调用该函数,传入需要创建的数据库文件和动态数据构件元数据映射文件;bandTable:绑定一个DataObject对象到一个具体的表上,此时表的元数据信息会保存到DataObject对象的内部成员中;getDBConnection:获得一个数据库连接;close:关闭所有已创建的数据库连接,通常是在数据库连接池退第四章Web应用安全漏洞扫描工具详细设计与实现出前调用。除这些成员以外,数据库连接池类,会把数据库连接类申明为友元。DBConneetionPool—maxSize:unsignedint1llConnections:Connectionoucue-freeconnections:G0nneetionolIMe—dbcpinstanee:staticDBconnectionPool-metaTableVee:vector<DataObject>-DBConnectionPool(inmaxSize:unsignedint)+getDBCPInstance():staticDI℃onnectionPool+init(indbFile:string。inmetaDataFile:string):bool+bandTable(intableName:string,inoutdataObject:DataObject&):bool+getDBConnection0:DBconnection+close():void+。DBConnectionPool(inmxSize:unsignedint)DBConnecti∞一曲:sqlite3*-rDBconnectionPonl:DBconnectionPool-triteMonitor:staticMonitor+close0:void+save(indataObj:DataObject):beel+listDataObject(intableName:string.outrsVec:constvectorOataObjeet>丘inwheracondition:string2。’):booltDBCOnnection(inrDBCOnn∞tionPool:constDBConneetionPool&)十’DBConnection(inrDBConnectionPool:constDBCoanectionPool&)+createTable(intableName:string):bool}beginTransaction0:bool+comit0:bool+rollBack0:bool图4—6数据库访问模块类图DBConnection类:数据库连接类,负责具体的数据库相关方法的执行。writeMonitor:静态成员,因为SQLite数据库支持并发读不支持并发写,所以需要一个同步互斥对象来保证对数据库写操作的正确执行;close:关闭当前连接,实际操作会把当前连接置入到空闲连接队列里;save:保存动态数据对象到数据库,要求该动态数据库对象已经绑定到目标表;listDataObject:批量从一个表查询数据,可以输入查询条件,返回结果为vector;createTable:创建数据库表,只能创建元数据映射文件已经定义了的表。介绍完数据库连接池类和数据库连接类的成员后,下面将介绍数据库连接类的一些关键方法,怎么在sqlite3上封装的。DBConnection构造函数,调用sqlite3open接口,传入要打开的数据库文件名,如果文件存在,则创建该数据库文件,out参数即为数据库连接类的成员db。intsqlite3_open(char术filename,pDatabaseconstfilename(UTr一8)拳/dbhandle坪|sqlite3奄奄ppDb|,OUT:SQLite);ereateTable函数,该函数输入参数为要创建的表名,然后查找metaTableVec查找该表的元数据,从而生成建表的SQL语句,调用sqlite3exec接El:35电子科技大学硕士学位论文intsqlite3_exec(sqlite3寅,l噶Anopendatabase岛|constchar卑sql,|鲁SQLtobeexecuted奄{sqlite3_callback,|嚏Callbackfunction鼻|void★,.|嶙1stargumenttocallbackfunction鼻|char宰水errmsg/木Errormsgwrittenhere宰/);第一个参数传入成员变量db,第二个参数传入生产的SQL语句,后三个参数传入null即可。save函数,首先根据传入的已经绑定到表dataObject对象生成保存的SQL语句,然后调用调用sqlite3exec接口。listDataObject函数,首先根据要查询的表名和查询条件,生产SQL语句,调用sqlite3_get_table接13:intsqlite3_get_table(sqlite3鼻,|嶙Anopendatabase鼻|constchar每sql,|嶙SQLtobeexecuted鼻|char木宰宰resultp,/宰Resetwrittentoachar木[]thatthispointsto木/int鼻nrow,|★Numberofresultrowswrittenhere鼻|int木ncolumn,/毒Numberofresultcolumnswrittenhere誊/char^_errmsg|怫Errormsgwrittenhere鲁|);第一个参数为成员变量db,第二个参数为生产的SQL语句,第三个参数为查询结果输出参数,只需要申明一个该类型的指针传入即可,第四个参数输出参数查询到的行,第五个参数为输出参数查询到的列。该返回结果的第一行为数据库表列名,以后的每一行都是数据库一行数据,再结合传入的表名查询该表的元数据,就可以把每一行数据生成一个DataObjea对象,保存到rsDataObjectVec中,最后调用者从该vector得到调用结果。beginTransaction,commit,rollBack函数:构建一个对应事务的SQL语句,调用sqlite3_exec接口执行。36第四章Web应用安全漏洞扫描工具详细设计与实现4.1.4HTTP传输模块HTTP传输模块设计4.1.4.1H1]曙传输是系统中各个扫描模块都会用到的核心功能,因此抽象为一个单独的模块进行设计。H,丌P模块的工作原理是提交一个需要请求的uI也链接,HTTP传输模块会根据UtU.,构造HTTP请求,发送到Web服务器,然后把Web服务器HTTP响应写入到定义的Buffer中。HTTP传输模块的UML图如图4.7所示:U甩一protocol:char*-host:char*一port:unsigned-method:char*-path:char*-file:char*int一getParam:char*-postParam:char*-paramldentifier:char*一depth:unsigned-isProtocol(in+URL()+ ̄URL0+parse(in+isValid+get8ethodintstrOrl:char*):b001url:char*,inparent:URL*):void0:bool0:char*0:char*intint+getProtocol+getHost0:char*+getPort0:unsigned+getDepth0:unsigned+getPath0:char*Ht-1Fetcher+getFile0:char*+getGetParam0:char*-curlSH:CURLS脚一curls:queue<CYRL*>+getPostParaⅢ0+setPostParum(in:char*+HtmlFetcher(inconfigFile:char神+ ̄HtmlFetcher()+fetchHtml(inouthttpPackage:constpostParam:char*):void+setMethod(insetMethod:char牛):voidHttpPackage&):b001+getUrl0:char*+getParamIdentifier0:cha一图4.7HTTP传输模块LrML图HttpBuffer结构体:定义HTTP传输模块的buffer结构。buffer:执行缓冲区的指针;length:记录了缓存区的长度。URL类:基本按照URL格式规范【331定义的一个类,URL格式可以参照网络爬虫URL介绍部分,定义的接口除了可以清晰得到URL的各个部分,而且也考虑到HTTP传输模块的应用需求以及后续攻击模块的应用需求来进行设计。是在系统各个部分都广泛用到的一个类。protocol:记录解析到的URL的协议部分(http/https);host:记录解析到的URL的主机部分;port:记录解析到的URL端口部分,默认37电子科技大学硕士学位论文为80;method:记录解析到的URLHTTP请求方式,默认为GET;path:记录解析到的URL的路径部分;file:记录解析到的URL的文件部分;getParam:记录解析到的get参数部分;postParam:记录解析到的post参数部分;paramldentifier:对所有的get/post参数名进行md5,得到定常字串,后续用来URL判重时使用;depth:解析到的URL属于网络爬虫的爬行层次;isProtocol:私有函数,用于在解析URL时,判断是否以协议开头;URL:构造函数对成员初始化;~URL:析构函数,释放成员;parse:输入一个url字串,结合解析到该字串的网页URL来解析该字串;isValid:判断对象代表的url是否有效;getMethod:返回url的HW口请求方法;getProtocol:返回Wl的协议部分;getHost-返回ud主机部分;getPort:返回url端口部分;getDepth:返回url深度;getPath:返回ud路径部分;getFile:返回url文件部分;getGetParam:返回get参数部分;getPostParam:返回post参数部分;setPostParam:设置post参数部分,因为ud是从网页中解析出来的,当解析到form链接时,会调用该借口,写入post参数;setMethod:从form解析的链接,会调用此接121,写入HTTP请求方法;getUrl:返回完整的url;getParamldentifier:返回所有参数名拼接字串的md5字串;HttpPackage结构体:对一次HTTP请求中的几个参数,进行了简单封装。url:此次请求的url对象;httpRequestHeader:根据u以生成的请求头保存在此buffer;httpResponseHeader..HTTP回应头保存在此buffer;httpResponseBody:H们T回应体保存在此buffer,就是浏览器显示的网页内容。HtmlFetcher类:HTTP传输的执行类,在libcurl[34】开源库的基础上进行的封装,具体的实现在下一节详细介绍。curlSH:curl共享对象,可以在所有curl旬柄间共享Cookie和DNS;cuds:队列保存的空闲curl旬柄;HtmlFetcher:构造函数,传入HTTP传输模块的配置文件;~HtmlFetcher:析构函数;fetchHtml:类的关键方法,传入HttpPackage对象,执行HrrP传输。4.1.4.2HTTP传输模块实现H们曙传输模块的核心类就是HtmlFetcher类,该类对libcurl开源库的使用进行了封装。Libcurl是一个免费和易于使用的客户端URL传输库,支持FTP,FTPS,HTTP,HTTPS等多种传输协议,libcurl还支持SSL证书,HTTPPOST,HTTPPUT,HTrP上传,基于HTTPform的上传,代理,Cookie等特性。libcurl移植性很好,38第四章Web应用安全漏洞扫描工具详细设计与实现可以用在多个平台,并且线程安全。libcurl库提供C语言的编程接口,HtmlFetcher主要特性的实现如下:HtmlFetcher构造函数:构造函数中会调用libcurl共享函数库,创建一个共享对象CURLSH,由于本系统编程环境为多线程环境,会并发多个HTTP请求每个请求会持有一个CURL句柄,并且都是针对同一个站点的访问,因此采取共享DNS和Cookie的方式可以提高性能。除此之外,本扫描工具前台做了登录序列的模拟,抓取到的访问网站后台的需要的CooMe,可以在HtmlFetcher类构造时,设置到CURLSH对象中,从而可以抓取到网站后台的网页,提高整个漏洞扫描的覆盖率。简要执行代码如下:char*cookie=”乖水jIc木木乖串:I=奉籼;//前台模拟登录抓取的CookieCURLSH牢curlSH=0;curlSH=curl_share_.init0;//共享对象创建函数if(curlSH){∥调用共享对象参数设置接口,设置CookieCURLSHcodersCode=curl_share_setopt(curlSH,CURL..LOCK_DATA_COOKIE,cookie);if(CURLSHE_OK!=rsCode){curl_sharecleanup(CURLSH);//调用失败关闭共享对象curlSH=0;))feethHtrnl函数:传输执行函数,首先尝试从curl旬柄队列获取一个空闲旬柄,如果获取失败,创建一个新的句柄,然后为句柄设置共享对象,再根据传入的URL设置句柄的参数,最后执行HTTP请求,完成后清除句柄的参数,然后把句柄置入空闲旬柄队列。核心代码示例如下:staticsize__tresponseFunction(void半ptr,size—tsize,size—tnmemb,void半stream);{...)∥回应头和回应体的保存回调函数39…一∥设置请求头保存,HTTP请求方法,表单数据,等其他option,这里不一一介绍1"es=curl_easy__perform(curl);∥执行http请求产保存句柄到队列母/curls.push(curl);))~HtmlFetcher析构函数类:析构时,释放空闲旬柄队列的所有旬柄,释放共享对象,调用的libcurl函数为:第四章Web应用安全漏洞扫描工具详细设计与实现cud_easy_cleanup(curl);//释放一个curl旬柄curl_.sharecleanup(curlSH)∥释放共享对象4.2扫描调度引擎本文在3.1节中已经对扫描调度引擎的工作职责、工作原理、工作流程从设计的角度做了简单的介绍。在这一节将结合具体工作流程的实现来对扫描调度引擎做详细的介绍。4.2.1配置文件加载配置文件的加载工作,都是在扫描调度引擎的Init方法中执行的。配置文件设计章节讲到系统加载的一个配置文件为Config.xml,它不做具体的配置,只是记录其他几个配置文件相对它的路径。Config.xml的具体内容如下:<?xmlversion=”1.0”encoding=”utf-8”?><!一ThisdocumentshowsW曲Scannernavigationconfigurebytheuser-一><Configuration><!~系统配置文件一><SysConfig>SysConfig,xml</SysConfig><!一数据库配置文件~><DataBaseConfig>DataBaseConfig.xml</DataBaseConfig><!一扫描模板配置文件.》<ScanTemplate>ScanTemplate.xml</ScanTemplate><!一登录序列文件~><LoginSequenceEnable=’’0”>LoginSequence.xml</LoginSequence></Configuration>首先扫描调度引擎调用配置文件读写模块根据系统默认路径加载Config.xml配置文件,然后解析该配置文件得到系统配置文件(SysConfig.xml)、数据库配置文件(DataBaseConfig.xml)、扫描模板配置文件(ScanTemplate.xml)、登录序列配置文件(LoginSequence.xml)的相对路径。其中扫描模板配置文件,就是3.1.1节调度引擎工作原理中提到的调度配置文件。接着扫描调度引擎会加载系统配置文件,系统配置文件内容如下:<?xmlversion=”1.0”encoding=”UTF-8”?>41电子科技大学硕士学位论文<!一一ThisdocumentshowsWebScannernavigationconfigurebytheBSer-一><SystemConfiguration><!一爬虫层次.》<ScannerLayer>5</ScannerLayer><!一最大线程数一><Maxthreads>30</Maxthreads><!—.HTTP请求超时,单位是秒一><Overtime>3</Overtime><!一日志级别一><LogLevel>Error</LogLevel><!一日志大小,单位是M一><LogSize>10</LogSize><!一代理设置.-><ProxyEnabled=”1”><HTrllPEnabled=”0”Host=”196.168.O.0”Port=-”100”Usemame=”butterfly”Password=”123”/><SOCKSAuthentication=”Yes”Enabled=”0’’Host=”212.0.0.0”SocksLevel=”Socks4”Port=’’151”Usemame="butten'ly”Password=”123”/></Proxy></SystemConfiguration>ScannerLayer节点:配置的网络爬虫抓取站点的最大深度,在网络爬虫根据URL建任务的时候,会起到过滤URL的作用。Maxthreads节点:线程池初始化用到的参数,配置线程池可以创建的最大线程数。Overtime节点:配置HTTP请求的超时时间,单位为秒,在为CURL句柄设置请求超时时间的时候会用到,具体请参考4.1.4.2节HTTP传输模块实现,或者直接参考libcurl官方文档。Proxy节点:配置HTrrP模块使用的代理服务器信息,libcurl库支持代理,因此基于libcurl的HTTP传输库,也支持代理相关配置,目前支持的代理为HTTP和SOCKS4代理。接下来扫描调度引擎将加载数据库配置文件,数据库配置文件定义了扫描模块线程中,数据保存任务队列的Flush长度及URL队列的Load临界长度,还配置了4.1.3.1节中设计的数据库连接池的连接数目,除此之外数据库配置文件最主要的功能是4.1.3.2节设计的动态数据构件的元数据映射文件。数据库配置文件内容42<propertyname="strDepth”isNumerie=”0”<propertyname=”strMethod”isNumeric=”0”0)”/><propertyDame=”strGetParam”isNumeric=”0”<propertynallle=”strPostParam”isNumenc=”0”12)”/><propertyname=’’strParamldentifier”isNumenc=’’0”<propertyilanle=”strRequestHeader”isNumeric=”0”024)”/><propertyilame=”strResponseHeader”isNumeric=”0”024)”/><propertyname=”strResCode”isNumeric=’’0”CODE”dbType=”VARCHAR(20)”/>name:="strUrlSet¨isNumeric=”0”024)”/><propertyisNumeric=”0”43dbType-=”VARCHAR(256)”/>columenName="DEPTH”dbType=”VARCHAR(20)”/>columenName=”METHOD”dbType=”VARCHAR(1columenName=”GET—PARAM”dbType=”VARCHAR(256)”/>columenName=”POST—PARAM”dbType="VARCHAR(5columenName=)'’PAR.AM—IDENTIFIER”dbType=”VARCHAR(20)”/>columenName="REQUEST_HEADER”dbType=”VARCHAR(1columenName=”RESPONSE—HEADER”dbType=”VARCHAR(1columenName=”RESPONSEcolumenName=”URL—SET”dbType=”VARCHAR(1eolumenName=”URL—SET—CRAWL”dbType="VARCHAR(1024)”/>电子科技大学硕士学位论文</bean><bean>…</bean></beans></Configuration>cache节点:配置了前面提到的扫描模块线程中,在文件DB数据保存端数据保存任务队列和文件DB数据加载端URL队列的Flush和Load的临界值,请参考3.2.2扫描模块整体结构图和3.2.4扫描模块工作流程。dbConnection节点:配置创建的数据库连接池的最大连接数。beans节点:内部配置的都是系统三个扫描模块:网络爬虫、SQL注入扫描、XSS扫描的数据对象和对应数据库表的元数据映射,每个bean节点为一个具体的对象表映射,映射文件的原理在4.1.3.2节动态数据构件设计中已经详细描述,这里不在重复介绍。接着扫描调度引擎会根据LoginSequence节点的Enable属性决定是否加载登录序列配置文件,登录序列配置文件记录是前台模拟登录后抓取的Cookie信息,登录序列配置文件具体内容如下:<?xmlversion=”1.0”encoding=”gb2312”standalone=”yes”?><HtmlAuth><Cookie>JSESSIONID=ayrzNy7EhmOd</Cookie></HtmlAuth>Cookie节点:配置的就是前台模拟登录抓取到的Cookie。文章在4.1.4.2节HTTP传输模块实现中提到,在HTTP模块初始化时置入抓取的登录后台Cookie,扫描模块就可以扫描系统后台的网页,提高扫描覆盖率。最后扫描调度引擎会加载扫描模板配置文件,扫描模板配置文件,定义一次扫描需要执行哪些扫描模块,扫描模块的具体内容如下:<?xmlversion=”1.0”?><Profile><WebSite—ScanEnabled=”1"Name=”WebSiteScan”ModuleName=”CrawlerModule"><Config>CrawlConfig.xml</Config></WebSite——Scan><SQL_InjectionEnabled=”1"Name=”SQLinjection”ModuleName="SqIInjectionModule’’><Config>SQLInjection.xml</Config>44性为1,则此次扫描将执行站点结构扫描模块。ModuleName节点定义了该扫描模块的类名,扫描调度引擎读取所有需要执行的扫描模块名到ScanModuleQueue队列,顺序动态创建扫描模块然后执行。扫描模块都有一个内层节点Config,定义了模块内的配置文件,当执行到该扫描模块的时候,由扫描模块自己解析,通常为扫描模块的扫描参数或者测试脚本。4。2.2公共组件初始化公共组件初始化,是在扫描调度引擎Init函数中配置文件加载完成后,将执行的程序逻辑。在4.1节公共组件介绍了系统各个公共组件的设计与实现,除了配置文件模块,其他的几个公共组件创建时都需要初始化一些参数,这一节主要讲述的就是这一工作过程。线程池模块初始化需要的配置参数为,线程池的最大线程数。该配置从加载到内存的系统配置中获取,初始化好的线程池句柄由调度引擎threadPoolHandler成员保存。数据库访问模块需要配置的参数为,数据库连接池最大连接数,以及动态数据构件的元数据映射文件。该配置从加载到内存的数据库配置文件中获取,初始化好的数据库连接池句柄由调度引擎dataBaseHandler成员保存。HTrP传输模块读取系统配置文件中的H,rTP请求超时参数和代理服务器相关信息(如果启用了代理)。由调度引擎中的HttpTransHandler成员负责保存HrrP传输模块句柄。在扫描模块执行的过程中,会调用调度引擎的这些公共组件旬柄,执行具体的工作。45电子科技大学硕士学位论文4.2.3扫描模块调度扫描模块的调度是调度引擎的核心工作,其工作原理在3.1.1节已经作了介绍,这里主要介绍具体的实现技术和详细工作流程。4.2.3。1扫描模块动态创建扫描模板配置文件加载完毕后,调度引擎内存维护一个scanModuleQueue队列,队列里保存的都是需要动态创建的扫描模块的类名。实际上包括扫描任务类都可以动态加载。系统中实现了C++对象的动态加载技术,动态加载技术的原理很简单,每个设计为动态加载的类都拥有静态工厂方法,然后设计一个链表,链表的每个节点都保存了一个类的类名和类的静态工厂方法指针,然后运用一些编程技术,在程序运行前先构造好该链表,这样程序运行时,就可以通过查询链表获得具体类的静态工厂方法指针,创建该类的对象。设计所有需要动态加载的类,都从共同顶层基类AbstractObject继承,这样静态工厂方法就具有同样的形式,具体如下:typedefAbstractObject木(*pFactoryMethod)()FactoryMethod;AbstractObject还应具有形式如下的静态方法,作为具体动态创建的接口:staticAbstractObject木CreateObject(stringstrClassName);该接口传入需要动态创建的类名,通过操作链表获取类的工厂方法指针,从而创建类对象。因此AbstractObject还需要指向一个上述链表的头指针,链表节点为一个结构体CRuntimeClass,因此AbstractObjeet具有静态成员:staticCruntimeClass奉pRuntimeClassHead;AbstractObject的类定义代码如下:classAbstractObject{public:staticAbstractObject*CreateObject(stringstrClassName);//动态创建接151staticAbstractObject*CreateObject0;//静态工厂方法staticCruntimeClass*pRuntimeClassHead;//链表头指针)CruntimeClass静态成员变量记录了所属类的基本信息,类名和工厂方法指针。CruntimeClass类的结构和构造函数如下:第四章Web应用安全漏洞扫描工具详细设计与实现structCruntimcClass{stringstrClassName;|{类名factoryMethod;∥工厂方法指针FaetoryMethod,CruntimeClass*pNext;//下一个节点CmntimeClass0;//构造函数)CmntimeClass::CnmtimeClass(stringstrClassName,PCreateFuncpCreateFunc){this.>strClassName=strClassName;this->factoryMethod=factoryMethod;this->pNext=AbstractObject::pRuntimeClassHead;AbstractObject::pRuntimeClassHead=this;>如上代码所示,每个AbStractObject派生类声明一个静态的CruntimeClass成员,静态CruntimeClass成员在程序执行前初始化【35】,在CruntimeClass的构造函数中所有的CruntimeClass成员链接成一个链表,链表的头指针为AbstractObject::pRuntimeClassHead,当调用AbstractObject::CreateObject(stringstrClassName)i函时函数根据传入的strClassName遍历整个链表,如果链表中存在这个类,则调用FactoryMethod创建对应的类对象,函数伪代码如下:AbstractObject::CreateObject(stringstrClassName){CrtmtimeClass*pClass=AbstractObject::pRuntimeClassHead;while(null!=pClass){if(pClass一>strClassName—strClassName)returnpClass->factoryMethodO;}returnnull;))47电子科技大学硕士学位论文4.2.3.2扫描模块调度流程扫描模块调度在扫描调度引擎的Dispatch函数内执行,在介绍了扫描模块的动态创建原理和具体实现之后,结合3.2.4节扫描模块工作流程,再来介绍扫描模块的调度流程就非常清晰了。Dispatch执行流程如图4.8所示:(开始)pop扫描模块,动态创建得至UpScanMdule:Abstract*土pScanModule:由Abstract*向下转型为AbstractModule*上pScanl垤oduleThread七newThread(pScanIViodule)O上pScanModuleThread.start0上pscanM。duleThread.j。in()◆/,(结束、\)/图4.8扫描模块调度流程图第一步:判断扫描模块队列是否不为空,不成立流程结束。第二步:读取一个扫描模块,动态创建扫描模块对象Abstractobject。第三步:扫描模块对象对象向下转型为AbstractModule。第四步:由于AbstraetModule实现了Runnable接口,所以可以根据AbstractModule构造线程。第五步:线程启动。第六步:等待线程结束,调度引擎的停止命令,由扫描模块自己读取,详细图4.9网络爬虫详细结构图4.3.2网络爬虫实现4.3.2。1扫描模块类(CrawIModuIe)的实现本文在3.2节扫描模块设计,介绍整个扫描模块的类体系结构。CrawllVlodule爬虫扫描模块类从ScanlVlodule类继承,对业务有差别的虚函数进行了覆盖。设计49电子科技大学硕士学位论文中还提到扫描模块实现了线程接口,所有定义在AbstractModule的函数接口,都由线程调度执行,具体执行流程参考3.2.4扫描模块工作流程。下面将根据工作流程调度接口的顺序,介绍主要接口所代表的业务逻辑和具体的实现。>Init初始化函数接口:首先加载扫描深度配置项,研究发现一些大的站点,站点的URL量非常大,如果进行全站抓取,随着扫描的进行保存到文件DB的数据量会非常巨大,会导致数据库读写性能下降,从而使整个扫描过程的效率降低。因此系统对爬虫的抓取深度做了配置,保证爬虫一次完整抓取合适的工作时间和数据量。爬虫爬行深度配置在系统配置文件里,已有调度引擎在初始化时加载,爬虫模块可以直接从内存中获取,保存在成员变量maxScannerLayer中,具体内容为:<!~爬虫层次一><ScannerLayer>10</ScarmerLayer>接着Init函数从调度引擎保存在内存中的扫描模板配置文件中,读取爬行配置的路径,加载本模块的配置文件CrawlConfigx.xml,具体内容如下:<?xmlversion=”1.0”encoding=”UTF一8”?><!--ThisdocumentshowsWebScannernavigationconfigurebytheUSer=一><Configuration><!一目标URL一><StartUrlCasesensifive=”False”>http://www.母木木.cn</StartUrl></Configuration>爬行配置文件目前只配置了网络爬虫的起始URL,Init函数将根据起始URL,构造一个CrawlTask任务置入CrawlTask队列。最后Ink函数会读取数据库配置文件DataBaseConfig.xml中的数据库缓存队列长度配置项,保存在成员变量dbQueueSize中。<!一数据库使用的缓冲队列长度~><cache>l000</cache>>FlushDataToDB函数接口:负责按照系统策略,把数据保存任务队列dataSaveTaskQueue中的数据刷入数据库CRAWL—RESULT表。dataSaveTaskQueue实际上是一个queue<DataObject>的容器,里面保存了需要保存到数据库的爬虫模块的DataObject对象,4.2.1节扫描调度引擎配置文件加载介绍了元数据配置文件网络爬虫部分,网络爬虫模块的数据库表结构如表4.1,设计dataSaveTaskQueue队列来缓存线程池线程中需要保第四章Web应用安全漏洞扫描工具详细设计与实现存的DataObject对象原因是SQLite数据库是嵌入式文件数据库,支持并发读不支持并发写,因此多线程的写入SQLite数据库并不能提高效率,反而因为频繁的加解锁损失性能。并且数据库中耗时较多的是事务的提交,因此各线程中需要保存的DataObject缓存起来,统一的批量提交,既可以减少SQLite写并发量,也可以提高数据库事务到合适粒度,提高了数据库的性能。F1uShD吨门№DB函数按定量超时策略,调用数据库读写模块把DataObject批量保存到数据库。表4.1CRAWLRESUIT表除段磐‘纛熬落≤暴℃荨设类咝≥Ij0j耋键,非奎。,,索弓∥、≯簧义zi暴簇j?基豢0‘默认值毒IDINTEGER√√、,主键自增URLVARCHAR(25请求的URL6)DEPTHVARCHAR(20URL深度)RESPONSE——CODEVARCHAR(20HTTP回应码)METHODVARCHAR(10HTTP请求方法)PARAM—.IDENTIFIVARCHAR(20根据HTTP请求ER)参数名,计算的MD5值GET—.PAR_AMVARCHAR(25GET请求参数6)POST..PARAMVARCHAR(51POST请求参数21REQUEST_HEADEVARCHAR(10HTTP请求头R24)RESPONSE..HEADVARCHAR(10HTTP回应头ER24)URL——SETVARCHAR(10从抓取到的网页24)中解析到的URLURL—SET.-CRAWLVARCHAR(10经过格式化过滤24)需要后续爬行的URLF1usllDataToDB的执行流程如下:第一步:初始化静态变量flushTime为系统当前时间。第二步:判断dataSaveTaskQueue队列元素个数是否达到策略限制M个,为真执行下一步,为假转到第四步。51电子科技大学硕士学位论文第三步:调用数据库读写模块,保存队首M个元素到数据库,fiushTime更新为系统当前时间。第四步:获取系统当前时间currentTime,判断currentTime—flushTime>T,T为策略定义的超时时间,为真执行下一步,为假流程结束。第五步:调用数据库读写模块,保存队列元素(<=M)个到数据库,flushTime更新为系统当前时间。>LoadDataFromDB函数接口:负责按照系统策略,批量从数据库加载数据生成URL,保存到URL队列。系统的第一个扫描任务是在Init函数中,根据CrawlConfig.xml配置文件生成的,后续的扫描任务,都是根据扫描过程中抓取到的保存到数据库CRAWLRESULT表URLSETCRAWL字段的URL构造的,URLSETCRAWL字段保存的是从当前记录表示的URL网页中,解析出来经过格式化和过滤后的URL按一定格式拼接在一起的字符串。LoadDataFromDB的执行流程如下:第一步:初始化静态变量offsetld=0,offset记录访问CRAWLRESULT表偏移量。第二步:判断URL队列的元素个数是否少于系统策略限制M个,为真执行下一步,为假流程结束。第三步:调用数据库访问模块,从CRAWLRESULT表批量加载m<=M条记录。第四步:读取URLSETCRAWL字段内容,生成URL置入URL队列。第五步:更新数据库偏移量offsetld为加载的最后一条记录的ID。最后数据库访问模块生成执行的SQL语句为:select木fromCRAWLRESULTwhereURL—SET—CRAWL◇”andid>offsetldlimitM>CreateTask函数接口:负责根据URL构造CrawlTask任务,由于爬虫模块不需要测试脚本的,所以创建任务的时候,不需要加载测试脚本,只需要检测URL的深度属性是否超过系统配置限制maxScannerLayer,没超过限制的URL,创建一个CrawlTask对象调用SetUrl接口设置好URL,然后把CrawlTask置入ScanTask队列中。CreateTask函数工作流程如图4.10所示:52第四章Web应用安全漏洞扫描工具详细设计与实现(开始)上从URL队列,读取URL构造ScanTask任务,入ScanTask队列I●N-’(结束)图4.10爬虫任务创建流程图4.3。2.2扫描任务类(CrawlTask)的实现网络爬虫模块扫描任务类CrawlTask从ScanTask继承,参考3.2节扫描模块设计。扫描任务内实现了Runnable接口,所有的功能都在线程池内被执行。如4.3.2节网络爬虫结构图中,线程池中第一步为抓取网页,第二步为网页解析,URL格式化过滤,第三步为数据保存,分别对应到ScanTask的三个接口的实现。>FetchHtml函数接口:对应到网络爬虫结构图中,线程池第一步,执行网页抓取。网页抓取调用公共组件HTTP传输模块HttpFetcher::fetchHtml接口,传入构造的HttpPackage对象,HttpPackage对象的URL成员拷贝CrawlTask的URL成员,三个HttpBuffer是H,rrP传输模块在传输过程中写入的,最后H们限传输模块返回bool值,标识此次HTTP传输是否成功,详细请参照4.1.4节HTTP传输模块设计与实现。如果FetchHtml函数返回True,则流程进入到VulnerabilityAnalyze函数,否则流程结束。>VulnerabilityAnalyze函数接口:对应到网络爬虫结构图中,线程池第二步,执行网页解析,URL格式化过滤。VulnerabilityAnalyze函数逻辑首先执行网页解析,在网页解析的过程中同时执行URL格式化,最后执行URL过滤,在网络爬虫模块只要HrrP回应码不为404、500,VulnerabilityAnalyze函数就为True。53电子科技大学硕士学位论文a)网页解析:网页解析是网络爬虫的关键功能,网页解析从抓取到网页中解析链接,经过格式化和过滤后,作为爬虫后续的抓取任务,因此网页解析模块的也会影响到网络爬虫的覆盖率,从而影响这个系统漏洞测试的覆盖率。网页解析获得HTTP传输模块返回的HttpPackage对象后,并不是立即进行html解析,因为针对下列情况的报文是不需要解析的,比如H郇回应码为404、500等,或者content-type为image,—一的报文。HrrP回应头如图4.11所示:图4.11HTTP回应头示意图因此网页解析模块首先解析httpResponseHeader,如果回应头满足上述条件,流程结束,否则执行真正的网页解析流程。网页中存在URL链接的标签,用如下的数据记录:staticchar术tagArray[10][3]={∥一级标签{I,a",”11ref",”1”),{Iflilll【”,”href',"1”),{”script”,”srC",”1”),{It缸吼e”,”src”,”1”),{"iframe","src",”1”),{fIimg”,”src”,”1”),{"form”,”a嘶on”,”1”),//form内部的二级标签{lf妇put",”name","2"),{"select","name","2”),{"textarea","name","2”)>;tagArray第一列表示标签名,第二列表示需要解析的标签属性,第三列表示标第四章Web应用安全漏洞扫描工具详细设计与实现签的层级。httpResponseBody存储的是网页内容,网页解析采用基本的字符解析方法,对网页只从头到尾扫描一遍,提高解析效率,具体算法如下:第一步:初始化指针posParse指向网页首地址,初始化bool值formStarted为FALSE,初始化URL*formURL为NULL。第二步:从posParse开始扫描“<”,找到“<”地址赋给posParse,执行下一步,找不到转到第十四步。第三步:判断“<”开始是否为注释“<!一”,是则posParse跳过注释,回到第二步,否则posParse跳过“<"进入下一步,解析标签流程。第四步:posParset跳过空白字符,解析标签名是属于tagArray中的哪一类标签,记录需要解析的属性标签属性attribute,不属于tagArray中的标签则转到第十三步。第五步:判断标签级别,为一级标签,执行下一步,为二级标签转到第十一步。第六步:判断formStarted,为TRUE,则保存formURL记录的URL对象,且置formURL为NULL,置formStarted为FALSE。第七步:解析标签属性attribute,此时解析到的就是URL链接,构造URL对象传入解析到的attribute值。第八步:判断标签是否为form,是执行第九步,否则转到第十步。第九步:formStarted置为TRUE,formURL记录第七步的URL对象,设置对象的HTTP请求方法为“POST”。第十步:保存URL对象,转到第十三步。第十一步:判断formStarted,为TRUE,执行下一步,否则转到第十三步。第十二步:解析标签属性attribute,此时解析到的是post参数名,把参数纳入系统收集的常用参数名比对,比对成功赋予系统预设好的参数值,否则赋予参数值为test,然后保存参数到formURL记录的URL的postParam中。第十三步:当前标签解析结束回到第二步。第十四步:网页解析结束,如果formStarted为TRUE,则保存formURL记录的对象,且置formURL为NULL,置formStarted为FALSE。b)URL格式化:网页中的链接格式存在不规范性。爬虫需要一个URL格式化模块,对网页中解析到的链接进行预处理,把相对链接变成绝对链接,而且许多网页中的链接都55电子科技大学硕士学位论文没有主域名,需要把站点主域名补充到爬行到的URL中。如图4.12所示:图4—12URL格式化图网页解析中会构造URL对象来保存解析到的URL,URL类的定义在4.1.4节HTTP传输模块设计与实现。声明URL对象后,会调用URL::parse(char书url,URL*parent)方法,传入谢字符串和解析url的源网页链接,来对解析到的链接进行格式化。Parse方法流程如下:第一步:判断链接是否以协议开头,是执行第五步,否执行下一步。第二步:判断链接是否以/开头,是转到第四步,否执行下一步。第三步:相对路径,根据parentURL转为绝对路径。第四步:绝对路径,从parentURL获得协议、主机、端口拼接成一个完整的url。第五步:url按标准格式拆分获得各个部分信息,如协议、主机、端口、路径等,详细将查看URL类定义。c)URL过滤URL过滤针对四类链接:站外链接、站内非起始URL子树的链接、站内重复链接、站内类似的动态链接。Web安全漏洞扫描工具的爬虫跟搜索引擎网络爬虫区别是,扫描工具只抓取目标站点的网页。网站的网页都会交叉引用,通常站内网页中解析出来的链接有很多一部分都是站外,这部分链接需要过滤。系统设计考虑到大型站点的解决方案,只抓取起始URL子树的URL链接,所以对非子树上的URL链接也需要过滤。除了上述两类链接外,不同的网页中可能会解析到完全相同的站内链接,这部分重复链接也需要过滤。除此之外由于搜索引擎爬虫通常只抓取静态网页,对动态的链接会丢弃到,对扫描工具的爬虫来说,动态链接是爬虫主要收集的链接,更是后续比如SQL注入检测和XSS检测的测试点,所以不能采取搜索引擎爬虫的方式丢弃到动态链接。但动态链接往往存在这样的情况,例如动态链接:http://www.木宰宰.eom/new.jsp?id=100对这个链接的分析,其明显属于查看新闻的链接,针对id不同的值访问不同的新闻内容,熟悉Web开发的人员知道,这样的动态网页结构都是一样的,只有第四章Web应用安全漏洞扫描工具详细设计与实现中间新闻内容部分不一样,因此爬虫在抓取的时候,只需要抓取到一个这样的网页就行了,不需要对比如id=101或者id=102的进行抓取,而且后续的漏洞测试如SQL注入检测、XSS检测,都只关注测试参数id,并不关心id的值,因此对类似的URL只抓取一个,其余的过滤掉是合理的,并且网站中这种类似的链接都非常多,可以节省爬虫抓取一个站点的时间。URL的过滤流程非常简单,当得到一个来自网页解析的URL对象后,站外链接直接根据host过滤掉,非初始URL子树链接根据path过滤掉,站内重复链接和站点类似动态链接采用扫描模块类的Hash表接口进行过滤,采取的过滤流程如下:第一步:host名过滤,过滤掉站外链接。第二步:path过滤,过滤path不以起始URL的path开始的链接。得到urlldentifier字串。例如http:黼.料木.com/news.jsp?id&keyword&content。第三步:不带query部分的URL连接所有的参数名构造字串,对结果MD5,第四步:Hash表中查找urlldentifier,不存在key为urlldentifier的结果,保存该URL对象,并插入urlldentifier到Hash表,存在则过滤该链接。>SaveDataToDB函数接口:如果VulnerabilityAnalyze函数接口函数返回True,程序流程进入保存数据到数据库流程。根据HttpPackage以及解析到的原始URL和格式化过滤后的URL构造DataObject,调用数据库访问模块保存到数据库中,原始URL保存在爬虫表URLSET字段,格式化过滤后的URL保存在URLSETCRAWL字段。4.4SOL注入漏洞扫描模块4.4.1S01_注入漏洞扫描结构SQL注入漏洞扫描的整体结构是在3.2节设计的扫描模块结构基础上,做了一些功能模块的具体化。SQL注入漏洞扫描的整体结构如图4.13:线程池内部,执行的是SQL注入漏洞扫描任务的功能,跟3.2.2节的扫描结构图相比,结构没有发生变化,只是执行的第二步,通用结构图中的漏洞分析,具体化成了对应SQL注入漏洞扫描模块的SQL注入漏洞分析。线程池外部,执行的是SQL注入漏洞扫描模块主线程的功能,跟3.2.2节的扫描结构图相比,结构没有发生变化,只是通用结构图中的测试脚本加载,具体化成了对应SQL注入漏洞扫描模块的SQL注入脚本加载。57电子科技大学硕士学位论文图4.138QL注入漏洞扫描结构图4。4.2SOL注入漏洞扫描的实现SQL注入漏洞扫描模块从网络爬虫抓取的站点URL中,分析出漏洞测试点,具体为拥有参数的URL,包括GET参数和POST参数,然后基于3.2节设计的扫描模块基础架构,结合SQL注入漏洞检测原理基础上设计的测试脚本,对漏洞测试点进行逐个检测。4.4.2.1扫描模块类(Sql|njectionModuIe)的实现本文在3.2节扫描模块设计,介绍整个扫描模块的类体系结构。SQL注入漏洞扫描模块类SqlInjectionModule从ScartModule类继承,对业务有差别的虚函数进行了覆盖。设计中还提到扫描模块实现了线程接口,所有定义在AbstractModule的函数接口,都由线程调度执行,具体执行流程参考3.2.4扫描模块工作流程。下面将根据工作流程调度接口的顺序,介绍主要接口所代表的业务逻辑和具体的实现。>Init初始化函数接口:负责本模块的初始化工作,主要是加载配置文件,Init函数从内存中的扫描模板配置文件,本模块节点解析到本模块内SQL配置文件的路径。n配置文件主要配置的是根据oitcejnI_LQSlSQL测_.注Inj入ec漏tio洞nm检x原理设计的SQL注入漏洞测试脚本,具体内容如下:<?xmlversion="1.0"encoding=”UTF一8"?><,<ItemValue=”JyI%3D”Type="1lI></Item><!一经典1=1,1=2数字型一><ItemType=”2”><ItemEnabled=”1”Name=”1=1"Value=””></Item><ItemEnabled=”1”Name=”1=1”V甜He=”%20and%20l=1”></Item><ItemEnabled=”1”Name=”1=2”Value=”%20and%201=2”></Item></Item><!一经典1=1,1=2字符型一><ItemType=”2”><ItemEnabled="1”Name=”’and’1.-’1”Value=””></Item><ItemEnabled=”1”Name=”1=1”V砒u萨”’%20and%20’1t_’1”>’</Item><ItemEnabled=”1”Name=”1=2”‰萨…%20and%20’1I_’2”></Item></Item></Profile>Type节点标识了测试脚本类型,Type=”1”表示测试脚本基于测试方法一,基于异常反馈信息的检测,Type=…2’表示测试脚本基于测试方法二,经典的1=1、1=259的加解锁损失性能。并且数据库中耗时较多的是事务的提交,因此各线程中需要保存的DataObject缓存起来,统一的批量提交,既可以减少SQLite写并发量,也可以提高数据库事务到合适粒度,提高了数据库的性能。F1uslDataIToDB函数按定量超时策略,调用数据库读写模块把DataObject批量保存到数据库。努段藿t、。;≯iojj含义,衅寰;≯∥,i默认值虢赫毒麓jf≮城I。;’字段类擎Io主;暑彦空7索弓};?冉j‘,·二i、,。j。4。ji≯‘_挣i≯j÷2t?≯.:■?“,’≯叠07i镰s:;键j誓聱,n,t;≮I一≥IDn、iTEGER、,√√主键自增URLVARCHAR(256)请求的URLMETHoDVARCHAR00)HTIP请求方GET——P删法VARCHAR(256)GET请求参数POST——PARAMVARCHAR(512)POST请求参数PARAM..TESTVARCHAR(100)此次测试的参数名PARAM——TEST..VAVARCHAR(1024)测试脚本LUEREQUEST_HEADEVARCHAR(1024)HTTP请求头RRESPONSE——HEADVARCHAR(1024)HTTP回应头ERRESPONSE——BODYVARCHAR(4096)HTTP回应体FlushDataToDB的执行流程如下:第一步:初始化静态变量flushTime为系统当前时间。第四章Web应用安全漏洞扫描工具详细设计与实现第二步:判断dataSaveTaskQueue队列元素个数是否达到策略限制M个,为真执行下一步,为假转到第四步。第三步:调用数据库读写模块,保存队首M个元素到数据库,flushTime更新为系统当前时间。,第四步:获取系统当前时间currentTime,判断currentTime—flushTime>T,T为策略定义的超时时间,为真执行下一步,为假流程结束。第五步:调用数据库读写模块,保存队列元素(<_M)个到数据库,flushTime更新为系统当前时间。>LoadDataFromDB函数接口:负责按照系统策略,批量从数据库加载数据生成URL,保存到URL队列。SQL注入模块的扫描任务,都是根据网络爬虫抓取到的保存到CRAWLRESULT表的带参数的URL构造的。跟网络爬虫的区别是,本模块读取的是当前记录所代表的URL,URL链接是否具有参数由该表PARAMIDENTIFIER字段标识,查询条件判断PARAMIDENTIFIER不为空,说明该URL具有参数。LoadDataFromDB的执行流程如下:第一步:初始化静态变量offsetld=0,offset记录访问CRAWLRESULT表偏移量。第二步:判断URL队列的元素个数是否少于系统策略限制M个,为真执行下一步,为假流程结束。第三步:调用数据库访问模块,从CRAWLRESULT表批量加载m<=M条记录。第四步:根据该条记录的内容,生成URL置入URL队列。第五步:更新数据库偏移量offsetld为加载的最后一条记录的ID。最后数据库访问模块生成执行的SQL语句为:select术fromCRAWLRESULTwherePAR.AM—IDENTIFIER◇¨andid>offsetldlimitM>CreateTask函数接口:负责根据URL构造SqlInjectionTask任务,从URL队列读取一个URL,读取保存在内存中的测试脚本配置,构造SqlInjectionTask然后置入ScanTask队列中。CreateTask函数工作流程如图4.14所示:61电子科技大学硕士学位论文(开始)+从URL队列读取一个[JRL对象士获得URL对象的所有参数名入队一—墨逐箜坠21:全型乒‘翱瘾亲滁胁YesT从参数队列读取一个参数L——宅F酾磊丽幂::乏i潇存力卜-7——垃昱型坚竺竺兰型璺堕丛-一YesT选择测试脚本J拷贝一个URL对象,选择的参数名的值追加选择的测试脚本0O构造SqlInjectionTask对象0设置构造URL对象,设置测试参数,设置测试脚本,ISqlIniectionTask对象入队0(结束)图4-14CreateTask工作流程图4.4.2.2扫描任务类(SqI|njeerionTask)的实现SQL注入模块扫描任务类SqlInjectionTask从ScanTask继承,参考3.2节扫描模块设计。扫描任务内实现了Runnable接口,所有的功能都在线程池内被执行。如4.4.2节SQL注入扫描模块结构图中,线程池中第一步为抓取网页,第二步为SQL注入漏洞解析,第三步为数据保存,分别对应到ScanTask的三个接口的实现。>FetchHtml函数接口:对应到SQL注入扫描模块结构图中,线程池第一步,执行网页抓取。网页抓取调用公共组件HTrP传输模块HttpFeteher::fetchHtml接口进行,跟网络爬虫模块有区别的地方是,爬虫模块FetchI-Itml函数只调用H卸Fetcher做一次HTrP请求,而对于SQL注入扫描模块,发送的H,丌P请求的数据跟测试脚本的类型相关,如果为Type=¨1"的测试脚本,则只做一次H1]曙请求,得到一个HttpPackage对象,如果是Type=…2’的测试脚本将执行三次H1]即请求,得到三个HttpPackage对第四章Web应用安全漏洞扫描工具详细设计与实现象只要任何一次HTrP请求失败,则FetchHtml函数返回False。>VulnerabilityAnalyze函数接口:如果上一步FetchI-Itml函数返回True,流程进入到当前函数,对应到SQL注入扫描模块结构图中,线程池第二步,执行SQL注入漏洞分析。漏洞分析流程跟测试的参数类型相关,如果为Type=”1”的测试脚本,基于异常反馈信息的漏洞检测,此时只有一个HttpPackage,漏洞分析步骤如下:第一步:检测HttpPackage.httpResponseHeader,判断此次HT邛请求回应码是否为500。第二步:检测HttpPackage.httpResponseBody(HTTP回应的HTML代码)中是否存在,异常反馈信息特征码库中的,某个异常反馈信息特征码。第三步:综合一二步判断条件,如果第一步条件成立且第二步条件成立,则存在SQL注入漏洞风险,VulnerabilityAnalyze返回True,同时按照FetchHtml函数介绍的方法,调用扫描模块接口,更新Hash表。如果为Type="1”的测试脚本,基于经典1=1,1=2检测,此时HttpPackage有三个,分别对应检测原理的该方法的请求1、请求2、请求3,漏洞分析步骤如下:第一步:判断请求1,HttpPackage.httpResponseHeader的回应码是否为200。第二步:判断请求2,HttpPackage.httpResponseHeader的回应码是否为200,且HttpPackage.httpResponseBody内容和请求1基于一致,检测办法为在请求2中随机截取N个长度为L的字串,然后在请求1中查找该串,如果查找成功的概率达到P,则认为相同,参数为在实际运用中调整。第三步:判断请求3,HttpPackage.httpResponseBody内容和请求1是否不一致,检测方法为在请求3中随机截取N个长度为L的字串,然后在请求1中查找该串,如果查找失败的概率达到P’,则认为不同,参数为在实际运用中调整。第四步:综合一二三步判断条件,如果第一二三步的条件都满足,则存在SQL注入漏洞风险,VulnerabilityAnalyze返回True。>SaveDataToDB函数接口:如果VulnerabilityAnalyze函数接口函数返回True,程序流程进入保存数据到数据库流程。本模块数据保存在SQLTCEJRESULTNI_跟样同辑逻据数存保,表测试脚本类型相关。如果为Type=…1’的测试脚本,只有一个H丁rP请求需要保存,结合测试的URL,测试参数名,测试脚本,构造DataObject对象,调用数据库访问模块保存即可。如果为Type=”2"的测试脚本,有三个哪请求需要保存,会把三个请求的请求头拼接在一起,回应头拼接在一起,组成一个HttpPackage后,电子科技大学硕士学位论文跟类型1一样的保存。4.5XSS漏洞扫描模块4.5.1XSS漏洞扫描结构XSS漏洞扫描的整体结构同样也是在3.2节设计的扫描模块结构基础上,做了一些功能模块的具体化。XSS漏洞扫描的整体结构如图4。15:图4-15XSS漏洞扫描结构图线程池内部,执行的是XSS漏洞扫描任务的功能,跟3.2.2节的扫描结构图相比,结构没有发生变化,只是执行的第二步,通用结构图中的漏洞分析,具体化成了对应XSS漏洞扫描模块的XSS漏洞分析。线程池外部,执行的是XSS漏洞扫描模块主线程的功能,跟3.2.2节的扫描结构图相比,结构没有发生变化,只是通用结构图中的测试脚本加载,具体化成了对应XSS漏洞扫描模块的XSS脚本加载。4.5.2XSS漏洞扫描的实现XSS漏洞扫描模块,跟SQL注入模块类似,也从网络爬虫抓取的站点URL中,分析出漏洞测试点,具体为拥有参数的URL,包括GET参数和POST参数,然后基于3.2节设计的扫描模块基础架构,结合XSS漏洞检测原理基础上设计的测试脚本,对漏洞测试点进行逐个检测。第四章Web应用安全漏洞扫描工具详细设计与实现4.5.2.1扫描模块类(XssModuIe)的实现XSS漏洞扫描模块类XssModule从ScanModule类继承,请参考3.2节扫描模块设计,介绍了整个扫描模块的类体系结构,对业务有差别的虚函数进行了覆盖。设计中还提到扫描模块实现了线程接口,所有定义在AbstractModule的函数接口,,都由线程调度执行,具体执行流程参考3.2.4扫描模块工作流程。下面将根据工作流程调度接口的顺序,介绍主要接口所代表的业务逻辑和具体的实现。>Init初始化函数接口:负责本模块的初始化工作,Init函数从扫描调度引擎加载到内存中的扫描模板配置文件,XSS节点解析到本模块内XSStpprofileircS.置配该。径路的件文置配文件配置的是根据XSS漏洞检测原理设计的漏洞测试脚本,由于XSS模块的配置文件比较简单,所以才有文本文件作为配置,一行为一个测试脚本。XSSScript.profile的部分比较具有代表性的内容如下:<script>alert(¥{random})</script><ScRiPt%20%0a%0d>alert(¥{random})%3B</ScRiPt>>’><ScRiPt%20%0a%0d>alert(¥{random})%3B</ScRiPt>>”><ScRiPt%20%0a%0d>alert(¥{random})%3B</ScRiPt></textarea><ScRiPt%20%0a%0d>alert(¥{random})%3B</ScRiPt></title><ScRiPt%20%0a%0d>alert(¥{random})%3B</ScRiPt>··-·><ScRiPt%20%0a%0d>alert(¥{random})%3B</ScRiPt>email@some<ScRiPt%20%0a%0d>alert(¥{random})%3B</ScRiPt>domain.corn[img]JaVaScRiPt:alert(¥{random})[/img】%3Cimg%20src%3D%22JaVaS%26%2399%3BRiPt:alert%285{random}%29%3B%22%3E●<%00seript>alert(¥{random})%3B</seript><serip<seript>t>alert(¥{random})%3B</scrip</seript>t><DIV+STYLE=”width:expression(alert(¥{random}))%3B”><FRAMESET><FRAME+SRC=”JaVaS%26%2399%3BRiPt:alert(¥{random})%3B”></FRAMESET>%3Cimg%20dynsrc%3D%22JaVaScRiPt:alert%285{random}%29%3B%22%3E<META+HTTP-EQUIV=”refresh”+CONTENT=”0%3Bud-JaVraS%26%2399%3BRiPt:alert(¥{random})%3B”>电子科技大学硕士学位论文<iframe+src=”data:text/html%3Bbase64,PHNjcmlwdD5hbGVydCgnYWNlbmV0eHNzLXRlc3QnKTwvc2NyaXBOPgo=”+invalid=”¥{random}”><body+onload=alert(¥{random})>’+style='background:url(JaVaScRiPt:alert(¥{random}))’+invalidparam=’%253CScRiPt%253Ealert(¥{random})%3B%253C/ScRiPt%253Er”+onmouseover=alert(¥{random})+%00”’><ScRiPt%20%0a%0d>alert(¥{random})%3B</ScRiPt>”onmouseover=”alert(’XSS-test’)<iframel+lonload=alert(¥{random})></iframe>测试脚本的设计思想是,基于XSS漏洞测试原理,首先构造一些简单脚本,尝试设想测试脚本运行在HTML不同地方,然后采取一些脚本混淆技术:比小写变换、不可见字符(如Tab键)添加、以及16进制变换、URL编码,混目的是使脚本通过Web应用程序的一些简单字符过滤。根据上述原则,可以的脚本是无止尽的,但在测试时并不是越多越好,测试脚本太多会影响测试效率,测试的时候按配置文件的顺序,从测试简单的脚本开始。>FlushDataToDB函数接口:负责按照系统策略,把数据保存任务队列dataSaveTaskQueue中的数据刷入XSSSCANRESULT表。dataSaveTaskQueue实际上是一个queue<DataObject>的容器,里面保存了需要保存到数据库的XSS模块的DataObject对象,4.2.1节扫描调度引擎配置文件加载介绍了元数据配置文件XSS部分,XSS模块的数据库表结构如表4.3,设计dataSaveTaskQueue队列来缓存线程池线程中需要保存的DataObject对象原因是SQLite数据库是嵌入式文件数据库,支持并发读不支持并发写,因此多线程的写入SQLite数据库并不能提高效率,反而因为频繁的加解锁损失性能。并且数据库中耗时较多的是事务的提交,因此各线程中需要保存的DataObject缓存起来,统一的批量提交,既可以减少SQLite写并发量,也可以提高数据库事务到合适粒度,提高了数据库的性能。FlushDataToDB函数按定量超时策略,调用数据库读写模块把DataObject批量保存到数据库。FlushDataToDB的执行流程如下:第一步:初始化静态变量flushTime为系统当前时间。第二步:判断dataSaveTaskQueue队列元素个数是否达到策略限制M个,为真执行下一步,为假转到第四步。第三步:调用数据库读写模块,保存队首M个元素到数据库,flushTime更新。:k第四章Web应用安全漏洞扫描工具详细设计与实现为系统当前时间。第四步:获取系统当前时间currentTime,判断currentTime—flushTime>T,T为策略定义的超时时间,为真执行下一步,为假流程结束。第五步:调用数据库读写模块,保存队列元素(<-.M)个到数据库,flushTime更新为系统当前时间。表4-3XSSSCAN黪麟麓纛麓≮≥RESULT表字段类型:::爱■,主键j翡璺。索黜护:套。眵4鸳…。≯?:巍芦1≯“尊.^嘴%|.i;:‘铝≮。;默认僵“IDDJTEGER√√√主键自增URLVARCHAR(25请求的UI也6)METHODVARCHAR(10HTTP请求方)法GET—.PARAMVARCHAR(25GET请求参数6)POST——PARAMVARCHAR(51POST请求参数2)PARAM..TESTVARCHAR(10此次测试的参0)数名PARAM——TEST——VAVARCHAR(10测试脚本LUE24)REQUEST_HEADEVARCI-IAR00HTTP请求头R24)RESPONSE——HEADVARCHAR(10HTTP回应头ER24)RESPONSE—.BODYVARCHAR(40HTTP回应体96)>LoadDataFromDB函数接口:负责按照系统策略,批量从数据库加载数据生成URL,保存到URL队列。XSS模块的扫描任务,都是根据网络爬虫抓取到的保存到CRAWLRESULT表的带参数的URL构造的。跟SQL注入模块相同,本模块读取的是当前记录所代表的URL,URL链接是否具有参数由该表PARAMIDENTIFIER字段标识,查询条件判断PARAMIDENTIFIER不为空,说明该URL具有参数。LoadDataFromDB的执行流程如下:第一步:初始化静态变量offsetld=0,offset记录访问CRAWLRESULT表偏67图4_16CreateTaskI作流程图68(k第四章Web应用安全漏洞扫描工具详细设计与实现4.5.2.2扫描任务类(XssTask)的实现XSS模块扫描任务类XssTask从ScanTask继承,参考3.2节扫描模块设计。扫描任务内实现了Runnable接口,所有的功能都在线程池内被执行。如4.5.2节XSS扫描模块结构图中,线程池中第一步为抓取网页,第二步为XSS漏洞解析,第三步为数据保存,分别对应到ScanTask的三个接口的实现。>FetchHtml函数接口:对应到XSS扫描模块结构图中,线程池第一步,执行网页抓取。网页抓取调用公共组件HTTP传输模块HttpFetcher::fetchHtml接口进行,XSS扫描模块只调用HttpFeteher做一次HTTP请求,得到一个HttpPackage对象,如果HTrP请求失败,则FetchHtml函数返回False。>VulnerabilityAnalyze函数接口:如果上一步FetchHtml函数返回True,流程进入到当前函数,对应到XSS扫描模块结构图中,线程池第二步,执行XSS漏洞分析。跨站漏洞的分析比较简单,只需检测HttpPackage.httpResponseBody(保存的HTML代码)中,是否存在本次的测试脚本,测试脚本代码中,¥{random}表示嵌入一个随机数,从而降低误匹配率,如果存在VulnerabilityAnalyze函数返回True。>SaveDataToDB函数接口:如果VulnerabilityAnalyze函数接口函数返回True,程序流程进入保存数据到数据库流程。本模块数据保存在XSSSCANRESULT表,根据HttpPackage、测试参数、测试脚本,构造DataObject对象,调用数据库访问模块保存到数据库。4.6本章小结本章在第三章设计的Web安全漏洞扫描工具(WebScanner)的系统基础架构基础上,结合改进的网络爬虫技术,SQL注入漏洞检测方法,XSS注入漏洞检测方法,介绍了Web应用安全漏洞扫描工具各部分的详细设计与实现。电子科技大学硕士学位论文第五章Web应用安全漏洞扫描工具测试分析anner测试目的f计并实现的Web安全漏洞扫描工具(WebScarmer),主要是针对WebSQL注入和XSS漏洞进行检测的工具。该工具实现基本满足了SQLXSS漏洞检测的要求,并且具有良好的扩展性。为了验证该工具的扫的功能有效性,以及各扫描模块的具体功能,选取了一个Web站点,进行了SQL注入漏洞和XSS漏洞的检测工作,以评估Web安全漏洞扫描工具(WebScanner)的性能。由前文所述情况可以了解,基础架构基本决定了整个扫描工具的性能,网络爬虫(Crawler)模块的功能决定了工具对目标站点抓取的信息的完整性和全面性,SQL注入漏洞扫描模块和XSS漏洞扫描模块则决定了漏洞探测的准确性。5.2WebScanner测试为了验证Web安全漏洞扫描工具(WebScanner)的各部分功能,本文选取了某高校教育网站作为测试目标,为了对扫描网站的信息保密,本文对敏感部分进行了处理。图5.1某教育网站扫描结果图70:k图5.2爬虫模块HTTP报文显示图图5-3爬虫模块网页解析的URL显示图图5.2、5.3对爬虫抓取的网页map.aspx的HTrP报文以及该网页解析出来的原始URL链接进行了检查,结果表明爬虫核心模块网页抓取工作正常,网页解析到的URL类型多样,达到设计目标。图5-4显示了一个检测到的SQL注入漏洞,由左边红圈部分的测试脚本看出,该漏洞是基于经典的1=1、1=2方法检测出来的。71电子科技大学硕士学位论文目罄搿岛国肭}蓦l每l岛’爵营o剐娃凡霪霹·豢!j^tb出details蘑xttp://m·带_-一.·hn:80/缀尊http:llm-_%■,‘h4:t101y‘镞IkPOST伯fin妇吐抬瞄捌凼蕾I吐h,b嘲●吐协曩0略扭懒I-”让倒h∞铅o-一尊Ihttp:llwt”韵静嘴a■·机“e01J‘缓尊kttp://w.w捌瞻啪·■·缸n:∞,J‘霪{蠡尊htt,:,,坩t毋■鞠■··hn:∞,且纛;毋尊Ihttp:ll~_M__-·hn:80,”缀.毒http;//m__喇■■。h矗:∞,d缓。毒http辱http:llwn-_*--·.dtL“e01“缀矗kttp:llw*’__目啊●·hn:∞,c,’!哥哥’}‘;诤http:llm韵__-·hat:801c‘镞‘:;llwww椭·h∞:∞,c‘缓辫茅鬣雾弋:瞰1,R甲tnc“乒如喀k埘c。雌n日即EtpP薹b蜘酗H暇甘南衄哪出篮嘲\、一Ⅷ弗掣渔聃酬盎c嗍瞰酗区q一哇枷缸啪皓删牺面n锄吨虹鼬游‰&堪扣s摹I叫揣∞^正d煳l—l硝船4童%《≥爵口http:,,t”q_嘲···缸CJll:80,c·t赫jhtl-:,,坩-_喇__-·h“:∞,cc;{哇}口htt,:,/Ⅲ·■目-一·h.A:80/c‘参http:ll_w●∞嘶_嘲·hn:∞,c‘l密口http://vw.捌融_蝴■I·n.A叫口P:争西坠Ⅶ:,,t什■臆哪●■.·缸诅:o口,cc嚣=芝竺=!多膨踟麟一一螂晴兀奢1.1Dl嗽缸.20M茸2010埘b∞:描aMr譬。c嘟x酝f珥a缸Ⅱ譬5矗墨h哪蚺吐习《^聍脚X-AspNa-V妇2.050721CKh■C0an北箭咄;<刨争丽面面五五—\!t~口。锄汹函i=懒蒜赫宪):锄I州矗n搿蛔硼LI畦吐硝畦-曲为垃葫连二嚣娑:竺苎哆口■0卸h址五脚堪k11438塞2:等慧篡·=:越t-}酗rtftfm貔缴茏施藏茏茏2滋…”~,…二。i。i..篓:罢.。当黧等然毛,撼雾:鼹:№t女目■自女___-_E_*-_---__h“4目自-—_-一一—·--_-_蝴-——t岫…一-__。。自目“__自*R___∞日#☆曲固http://www㈣.edu.on/show.卸羽磊6637&sort=新画D图5-4SQL注入漏洞显示图[B服务面…’≯web防火墙一…国lowA5P}i镑{嗡。搜狗网址导…咳忧醅网-中国…嘞。j6∞口b}镪统沌来查找移下—个镫上叫?∥高壳本文作者:■———_●■.捷布日期:2010-3-5.你矗第250位浏览者.最后审拔:●温家宝总理作2010年竣府工作缀告温家宝总理』r'e20lO年政府工作报告温旁:宝-各位代表。现在,我代表国务阮向大会作政府工作报告.请予审设,并请垒国政协各位委员提出意见。I瞧h却:,M例栩蚺-煳-.edu.cn/show.器p《刭宣6637%20and%201=i%20菇ort=新闻…’—。。_%L-…——。_}B服务面…’铲w曲髓_火墙~。·囊OWASPi≮鍪i咳挂狗网址导…魄忧酷网.中雷…镄§lGooq忙一l;lrl……一…一f……‘“^‘^oo~'~………蠲k家宝总理"依201个∥,罗。。~。…。,一一一Jj’…^一,J…!i妇:…∞∞t∞H∞口一…n口H∞m∞m“2……“2……。o年政府工作报告本文怍者.■…~‘■,发布日期2010-3-'S,俅矗第箱t旺浏览看,最后审梭:●●温家宝总理作20lO年政府工作报告温衮宝一各位代表·现在,拽代表国务院向大会作政霄工作报告,请予审议。并请全国政协各位委员提出惹见。I掰两h七也c,^Ⅳw__-_-edu.cn^廿1(州.a;a,《'螽三66量7‘%,n月nd‘狺20i=,%三右您lnrf=蠢芹嘲田服务面…j芦web防火墙.…国owAs,。;锄}{褫擅狗网址导…魄忧酷F乎中苗…瞧m。咖.壳;.高j,一.。.卟上鼋个—下零蛾枣:淞觋曩野委癸、+|?I统簪ijj,j..z—J.'叩.-:一一1一,0q“。7笔?≯鼍jo·v?jj。i?:?j冀一‘”?d?≮ij每’tj:?j?’。?|27..i,。。、、。x≥‘¨÷t。≯tt:l,“?j‘=。jj-‘。一’,?7“‘jj,27÷+ti。?。j,|‘一j:j’。’jj…j—j。‘一一繁轰麓羲:繁::?荔:、??。。i+。。i=j岛?蓦搿:劳ji一?j…。?:寸j?÷,:i.'‰j;j每i?L-;,毛毫强差强一≮曩一-。.|t-f’i一一÷。…?:J?‘。^||,;,?’一?lj|i。·’?j:tj南“¨n。i,.幺7。礁‘Frj;。t0 ̄_o|Ii?。一I,J』一I:?j≯影秀:黟◇j移≈。7一二,…,“¨,。.i1。i;蟊:’≥f誊拳一蠹《’Io癣|jtj·f|.:z≮%≮菇j一毒嗡t。嘻oz.图5-5SQL注入攻击示例图k—·0第五章Web应用安全漏洞扫描工具测试分析图5—5演示的是对一个检测到的SQL注入漏洞的人工攻击示例,整个图像由红色矩形框分为三个部分:第一部分为正常请求,返回正常网页;第二部分为参数id追加测试脚本“%20and%201=1%20",同样返回正常页面;第三部分为参数id追加测试脚本“%20and%201=2%20",返回错误提示页面。对于黑客来说,发现了该SQL注入漏洞,就可以构造更加复杂的测试脚本,来攻击站点的数据库。由5—4和5—5图可以看出,SQL注入漏洞扫描模块工作正常。营疆b扫描结果藏l翰威胁富0鞠堪执缓:M止∞懈嘲皿夥iq∞‘妇错轴却‘vl强c吼^撕晰墨EI姬WFlt幽imoa明血ef·bk珲管轻吐岫to自潮t1Hd五宙d耳}o争d坷t缓,膏Ⅻl衄^丑耻t妇锄删岫s嘲h鲫岫捌曲ea瞰岫a∞叫哦,砘煳蚴th崞tlm'm雕.了t备幽op嘲曲b∞·盘每tl,m傅白一0符站母《秘h“,:,,m·——-_·dL∞:∞缓i瓣,th}pt乒pf嚣et嘲协岫帆^Hntn■ih》自0磐国nt,:,,t”'觯嘲瞒ehhttp:llm㈣D·hcz:80缀,;羽+固I磐蛰htt,:,,Tn崩陶蚴糟thA锄凌。n:鲫htt,:/,竹’镰骚帮嘲鼬·h丑:瞰;窝≈Dhtt,:∥竹’柏略M嘲协edtl爵蛰http://m-球*_--h口:∞;脚裟Re\拆est—一、\\\搴磕}h唧17i钾1帮瓣嚼■■·h4:∞j、辞o《·血Ⅱ——/岁“嵊≮/自键江啪m钿剞函赫_—~h口:∞。∞1d誉为站点拮构岛日瞄htt,://m硼脚嘲蛳·缸4:∞H兀1ⅥJ2000KDi妊:S峨20五出E20tO删≈恐蚺GM'I"茁£0!sefwck血博拍危.五酗.0丑∞iMX{啊睫r吐B崔A弹二蕾r警蛰ilal:es墨删n-忱蜘“:心727C越h舢C触∞t口融暗;∞d·fm“m;·铲诤捌砸№阳h;c。出球TyP£t龇hma;由雕n帕3l:CⅫ目I.L∞吐38甜7:∞‘1h“i·riAtrahc··‘叼‘。潼‘"·lp;。潆haxlRetiaqWtlrol翻’Ⅱ晒蟹潆list··”递蹈缀潞戮锄黼蕊矧罩壤竺:兰一瓣灞t图5.6XSS漏洞显示图酬展务面¨.9webI|a火墙一…囊owAsP‘i戆{堍搜狗网址导…堍懒s爵中国…嚆IGoogIe·宅二二]赣绕汁:耒查找簪‘卜卟学上一个_缈高亮熬麓鬻鹫鎏盛?一一j;:≮奠:囊餐托幕%毽搿赢繁一麓滋。,j2亡自’…:Ii器黢髯鬻爨彗夏孑了■一,簪鬈鞭。慧,沁嚆毒撵‰≯o“.《芬阮蝴鬻糕糕雾瑟签谤瓷豫嗡彬■≮唾《强箨搿蕊纛瀵嚣鳓襄辣鬈强滋舅罅鬈。磐∥一荔图5.7XSS攻击示例图图5-6显示的是一个检测到的XSS漏洞,左边圈内为存在跨站漏洞的参数,右边圈内为此次测试的脚本,以及HTTP请求信息。打开该漏洞页面,人工验证示例如图5.7,图中红圈部分为测试脚本,该网页直接把用户提交的脚本代码执行,所以出现了图中所示的弹出窗口,存在XSS漏洞,易被挂马利用。电子科技大学硕士学位论文由图5-6和5.7可以看出,XSS漏洞扫描模块工作正常。5.3WebScanner测试分析由5.2节测试情况,可以说明WebScanner的各个模块都能正常工作,基础架构运行正常。网络爬虫可以准确快速的进行站点网页抓取,网页提取的URL的也(一比较全面,给后续攻击模块提供了完整的站点漏洞测试点。SQL注入漏洞扫描模块和XSS漏洞扫描模块也能有效对测试点进行检测,准确判断漏洞情况。因此本文设计并实现的漏洞扫描工具可以快速有效的检测到SQL注入和XSS漏洞。该工具可以减少人工检查Web应用程序漏洞的工作量,而且本工具采用的检测方法,完全是模拟黑客攻击Web应用的方法。对于Web开发人员来说,可以使用该工具对Web应用漏洞进行检测,就可以在开发阶段提高Web应用的安全,降低后期Web应用被攻击的风险。5.4本章小结本章选取某教育网站对开发的WebScanner进行测试分析,测试结果表明WebScanner各部分功能正常,并且能够快速对测试站点进行抓取,并检测系统的SQL注入和XSS漏洞,准确性较高,可以证明设计的合理性和该工具的实际应用价值。74‘6.1为最备、已经成为网络安全的主要问题之一。对Web应用安全的检测评估展开全面研究具有重要理论意义和实际应用价值,也引起了越来越多研究组织和研究人员的注意。本文以Web应用安全漏洞检测技术为研究对象,主要工作有以下几个方面:1.详细总结了SQL注入漏洞的产生原因、危害、检测方法。2.详细总结了XSS漏洞的产生原因、危害、检测方法。3.改进了网络爬虫技术,快速完整的收集Web应用系统的漏洞检测点。4.设计了扩展性良好的Web应用安全漏洞检测的基础架构。5.在基础架构基础上,结合SQL注入和XSS漏洞检测方法,实现了自动检测Web应用程序SQL注入漏洞和XSS漏洞的扫描工具。6.2今后的工作本文在完成上一节讲述的工作外,下一步还可以开展的研究工作包括:1.Web应用程序漏洞类型很多,本文主要完成了对SQL注入漏洞和XSS漏洞的研究,未来可以展开更多类型漏洞研究工作,扩展到扫描工具当中,使其可以进行更多类型漏洞的检测。2.目前设计的网络爬虫功能上存在不足,对脚本语言内部的链接无法解析,未来可以设计在网络爬虫模块引入脚本解析器,分析出脚本语言的链接,提高网络爬虫的覆盖率。3.目前实现的扫描工具只支持HTTP/HTTPS协议,基础架构也是基于HrrP协议设计的,未来可以引入更多协议的支持,进一步优化基础架构。75电子科技大学硕士学位论文致谢在论文最后,我谨向所有在我硕士研究生学位攻读期间,关心和帮助我的导、同学、朋友和家人,表示深深的感谢。∥,一;q感谢我的导师邱会中副教授。在三年研究生学习期间,邱老师给我提供了良的科研和实践环境,在论文选题撰写期间,更是在百忙之中抽出时间来进行指,每次都能让我获益匪浅。在此向邱老师表示最真挚的感谢,他渊博的知识,谨的治学态度,勤奋的工作作风,平易近人的师长风范十分令人尊敬。感谢教研室的周刚、欧黎源、孙杨、曾子剑、缪霖、余国家等同学,在我研究生期间对我的指导和帮助。感谢与我共同参与此项目的邓国金、杨新英、郭小林同学,在项目期间的共同学习、探讨、成长让我留下了美好的回忆。感谢我的家人一直以来对我的关爱和支持。最后,感谢评阅此论文和出席论文答辩的各位专家教授在百忙中给予指导。76℃一‘’参考文献参考文献【l】Gartner.http://www.gartner.eom/technology/home.jsp.【2】OWASP.http://www.owasp.org/index.php/Main_Page.[3】CNCERT/CC.http://www.cert.org.cn.【4】杨波,朱秋萍.Web安全技术综述明.计算机应用研究,2002,19(10)-1—4,10.[5】http://www.venustech.com.cn/Newsinfo/350/4489.Html.[6]Symantec.http://www.symantec.com.[7】WHID.http://www.xiom.com/whid.【8】刘大勇.W曲的安全威胁与安全防护[J】.大众科技,2005(6):39.【9】9李必云,石俊萍.Web攻击及安全防护技术研究[J】.电脑知识与技术:学术交流,2009,5(11)-8647-8649.【lO】诸葛建伟,叶志远,邹维.攻击技术分类研究[J].计算机工程,2005,31(21):121.123,126.[11]张岭,叶允明等.一种高性能分布式WebCrawler的设计与实现【J].上海交通大学学报,2004,38(1):59-61.[12]俞小怡,常艳,许捍卫.Web应用中的攻击防御技术的研究与实现[J】.计算机安全,2008(6):47.51.[13】赵亭,陆余良等.基于表单爬虫的Web漏洞探测【J].计算机工程,2008,34(9):186—188,215.[14】赵文龙,朱俊虎,王清贤.SQLInjection分析与防范【J】.计算机工程与设计,2006,27(2):300-302,306.【15】陈小兵,张汉煜,骆力明,黄河.SQL注入攻击及其防范检测技术研究[J】.计算机工程与应用,2007,43(11):150.152,203.【16】Isson,Roger.SQLinjection[J].ITNOW,v47,n2,March,2005,25.[17】Kosuga,Vuji.SyntacticandsemanticanalysisforautomatedtestingagainstSQLinjection[C].Proceedings23rdAnnualComputerSecurityApplicationsConference,ACSAC2007,2007,107.116.【18】沈寿忠.基于网络爬虫的SQL注入与XSS漏洞挖掘[硕士学位论文】.西安电子科技大学硕士论文,2009.【19】吴耀斌,王科,龙岳红.基于跨站脚本的网络漏洞攻击与防范[J】.计算机系统应用,200877电子科技大学硕士学位论文(1):38-40,44.沈寿忠,张玉清.基于爬虫的XSS漏洞检测工具设计与实现【刀.计算机工程,2009,35(21):151.154.Fong,Elizabeth.Webapplicationscanners:Definitionsandfunctions[C].Proceedingsofthe40thAnnualHawaiiInternationalConferenceonSystemSciences2007,HICSS’07,2007,4076950.Kals,Stefan.SecuBat:Awebvulnerabilityscanner[C].Proceedingsofthe15thInternationalConferenceonWbddWideW曲,2006,247—256.Curphey,Mark.Webapplicationsecurityassessmenttools[C].IEEESecurityandPrivacy,V4,n4,July/August,2006,32-41.Huang,Yao-Wen.AtestingframeworkforWebapplicationsecurityassessment[J].computerNetworks,v48,n5,Aug5,2005,WebTraffic,739-761.[25】Huang,Yao-Wen.Non—detrimentalWebapplicationsecurityscanning[C].Proceedingsofthe15thInternationalSymposiumonSoftwareReliabilityEngineering,2004,219—230.【26】Fonseca,Jose.TestingandcomparingwebvulnerabilityscanningtoolsforSQL蝎ectionandXSSattacks[C].Proceedings一13thPacificRimInternationalSymposium011DependableComputing,PRDC2007,2007,365-372.[27】TInyXML.http://www.grinninglizard.com/tinyxml/.[28】BrainGoetz.JavaConcurrencyinPractice[M].电子工业出版社,2007.【29】ElisabethFreeman,EricFreeman,BertBates,KathySierra.HeadFirstDesignPatterns[M].O'ReillyMedia,Ine.2004.【30】ErichGamma,RichardHelm,RalphJohnson,JohnVlissides.设计模式:可复用面向对象软件的基础[M】.李英军,马晓星,蔡敏,刘建中译.机械工业出版社,2007.[3l】张新华,朱跃龙,梁正和.基于数据字典的通用动态查询系统设计与实现【J】.计算机与现代化,2006,(04):33.36.【32】SQLite.http://www.sqlite.org/.【33】URL.http://baike.baidu.corn/view/1496.htm.【34】Libcurl.http://curl.haxx.se/libcud/.【35】ScottMeyers.EffectiveC.H,n砌Edition[M].侯捷译.电子工业出版社,2006.78,≥0一Q■攻硕期间取得的研究成果攻硕期间取得的研究成果[1】陶亚平,邱会中.一种基于DocumentRank的垂直搜索检索模型.电子科技大学研究生学报.已录用●、j]X:睁目:鲴王挺嚣:蛳台。碗动上髟幂晕甲勒贸牲肇掣益衅<i=丰孵羁贸:里面晕碗动。娶辨明暂鞘益垂业而一上辑膨‘魁绺上身承朗骢曾掣朝囤椠少护朝妻回髻牲口辩朝掣垂聚辨益鐾肖的鼹暂搿椠明国椠辜圈髻:圈面晕磋铆。尝t7。Z嘉=髯眨龌勐影擗驹眺戥SSX瞠Y琨"lOS、审制粝幽鲷诳甲嘉向髻嘉=髻唛碑夥擗明醢帛妻向髯:三面巢碗动。猛乖半甥斯妊明固乱骤堑9己、69上碗动鳍刨国酩骤:=面巢碗动。鳍照I匦茸警韶谣诵聊藓业粤璺益衅茸誓七b上);芑动益骅茸迸中:一面晕碗动膨群龌觋茸磁’\0IRON OXIDEhttp://www.pigmentpigment.com/
Web应用安全漏洞扫描工具的设计与实现
作者:
陶亚平
学位授予单位:
电子科技大学
本文链接:http://d.g.wanfangdata.com.cn/Thesis_Y1802606.aspx
vacuum interrupterhttp://www.cnhogen.com/