自动注入攻击工具的研发_第1页
自动注入攻击工具的研发_第2页
自动注入攻击工具的研发_第3页
自动注入攻击工具的研发_第4页
自动注入攻击工具的研发_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

项目背景及意义SQL注入攻击是一种非常有效且破坏性很大的渗透手段。它是针对于数据库的一种攻击手段,通过利用数据库的外部接口把恶意代码插入到SQL语言中使数据库服务器解析并执行,以达到入侵目标数据库及至整个操作系统的目的。了解和熟悉SQL注入原理,掌握防御SQL注入攻击的原理和技巧就变得至关重要。SQL注入攻击的普遍性、难捉摸性、简易性等特点让其成为了网络中黑客主流攻击方式之一。因为SQL注入是从正常的Web平台入口进行请求访问,和请求正常的Web页面没有什么区别,所以目前市面上除了专门的Web防御防火墙外,大部分防火墙都不会对这类SQL注入攻击进行监控和发出警报,若网站管理员没有经常查看IIS日志的经验和习惯,有可能被入侵很长一段时间后都没有任何发觉。由于现在广泛流行的恶意攻击工具,SQL注入在近年来呈现一种增长的趋势。据OWASP(开放式web应用程序安全项目)每隔三年更新一次的“十大安全隐患列表”,在近几次公布的总结Web应用程序最可能、最常见、最危险的十大安全隐患中,SQL注入攻击一直排列靠前。OWASPTOP102010中列出的最严重的Web应用程序的漏洞中,注入(Injection)风险位居第一。Web应用的发展越来越成熟,应用的各项技术发展得也越来越复杂。它们涵盖了从外部动态展示INTERNET和内部工作网络到以WEB协议方式传递数据的企业工作应用(如文档管理系统等)。这些系统的实用性及其数据存储、处理内容的机密性和敏感性对于企业的主要业务而言都非常重要。当前市面的注入攻击检测工具只能对单个网页或者单个URL进行检测和注入,无法对整个网站的漏洞进行检测。而漏洞扫描工具可以对整个网站漏洞进行扫描却无法进行进一步的注入攻击检测。很大程度上不能满足开发人员和管理人员对网站SQL注入漏洞全面了解的要求。本研究的最终目的是分析SQL注入攻击的类型、关键技术和原理,并研究SQL注入在实际应用中的操作方法,在此基础之上,设计并开发了一套自动注入工具。因为恶意攻击者不仅可以通过SQL注入攻击对Web应用数据进行盗取、篡改信息,还可以进一步对于服务器进行恶意操作,并且植入木马或者后门程序,甚至控制整个服务器,这就严重影响了应用的正常运行以及对于应用的信息安全带来严重后果。所以,对于功能齐备的SQL注入攻击扫描与检测工具的研究与开发具,具有非常重要的现实意义。应用程序开发者或网站管理人员使用此工具对自已的网站进行安全检测,以达到减小$。任主入的可能性。同时,在渗透测试工作中,对于安全测试也具有很大的帮助。研究内容自动注入攻击工具的研发本研究首先理解Web应用的工作原理,首先简要概述Web应用系统通用的架构模式,理解了构建模式后能更清晰的了解SQL注入的产生过程,然后从Web应用的代码层来分析介绍是什么引起了通用的SQL注入,然后研究介绍SQL注入漏洞的利用过程。从框架到利用逐步分析SQL注入的过程和利用,然后根据分析的内容构建SQL注入的自动化检测及注入攻击利用框架。SQL注入原理SQL注入的原理,是将SQL代码插入或者非正常时添加到应用的参数当中,并且进行了一定的拼接传入到了后台的数据库服务器,最终使服务器执行了该拼接的恶意SQL命令。所有的是通过SQL语句执行的应用过程均存在被攻击的威胁,因为SQL的多样多变性语言结构特征使得攻击者可以拼接构建丰富的代码编码手段等来拼接语句来欺骗服务器。SQL注入攻击的主要方式就是直接将命令插入到应用服务的表单参数中传入到后台数据库查询字符串中,这些参数就会被带入到后台数据库服务器进行执行解析,攻击者便可以构造恶意命令来达到攻击目的。SQL注入检测技术检测发现SQL注入漏洞有一条简单的规则:SQL注入是通过发送特殊数据来触发异常操作。该规则包括如下含义:•检测Web应用上所有的输入数据;•集合SQL语法,归类所有可能触发异常的数据类型;•检测数据库服务器应用响应中的异常。首先需要清楚Web浏览器向Web服务器发送请求的过程。不同的服务应用会有不同的体现方式,它们均处在基于Web的环境中,所以基本原理是相同的。识别和检测应用接受的所有数据,攻击一般都会修改这些数据,所以需要识别并分析服务器对它们的响应。有时响应中会直接包含来自数据库的SQL错误,有时需要不断的方式来检测和确定响应中细微的差别。章节安排本论文章节安排如下:第一章绪论:综述此研究设计的背景意义以及研究内容。第二章SQL注入技术研究:主要对SQL注入攻击方式过程和攻击特点进行归类、识别,首先理解Web应用的工作原理,概述Web应用通用的构建方式,为理解SQL注入的产生过程提供一些背景知识,接下来从Web应用的代码层介绍引发SQL注入的因素以及哪些开发实践和行为会引发SQL注入。分析SQL注入过程和利用,并架构如何将SQL注入的发现过程自动化以提高检测简单SQL注入的框架。第三章SQL注入攻击技术研究:根据SQL注入技术,研究利用数据库中的功能来攻击系统端口的技术。数数据库大多均带有丰富的数据库编程功能,可以利用SQL注入漏洞来访问文件系统以执行有效的任务,可以在基础操作上执行各种命令,扩大范围攻击的利用技术细节。当发现SQL注入漏洞以及初步的利用获取数据后,可以利用SQL注入漏洞来访问文件系统来扩大渗透范围。还可以在操作系统上执行各种命令,攻击可以使用它们扩展数据库的可达区域并在更大的范围内发动攻击。第四章注入高级技巧研究:Web应用通常会使用过滤应用,设计这些过滤的目的就是防御SQL注入在内的常见攻击。这些过滤方式可以是位于web应用的代码层中,也可以通过第三方的外部实现,如Web应用防火墙(WAF)或入侵防御系统(IPS)。当注入攻击碰到这些防御应用,若想进一步利用漏洞,则需要寻找一种能避开过滤器防护的高级方法以便恶意输入传递给易受攻击的代码。第五章自动注入工具框架设计:根据项目的设计需求,以及Python编程语言的特点,对自动注入攻击工具整体框架进行分析和设计。并且分析功能模块中的重点和关键技术。第六章SQL注入测试:自动注入攻击实例测试。第2章SQL注入技术Web应用工作原理和架构简析不论是用何种脚本语言开发的Web应用,都有一个共同点:具有交互性并且大多是数据库驱动的。基于数据库驱动的Web应用一般都包含三层:apresentationtier(表示层,Web浏览器或呈现引擎)、alogictier(逻辑层,如C#、ASP、.NET、PHP、JSP等编程语言)和astoragetier(存储层,如MicrosoftSQLServer、MySQL、Oracle等数据库)。Web浏览器(表示层,如InternetExplorer>Safari、Firefox等)向中间层(逻辑层)发送请求,中间层通过查询、解析数据库(存储层)来响应该请求。图2-1简单的三层架构Web三层架构解决方案没有扩展性,研究人员不断地对Web三层架构进行改进优化,在可维护性和可扩展性的基础上建立了一种新概念:n层应用开发模式。其中有一种就是Web四层架构解决方案,该方案在Web服务器和数据库之间使用了一层中间件服务器(通常称为应用服务器)。下图2-2中,Web浏览器(表示层)向中间层(逻辑层)发送请求,后者一次调用由位于应用层的应用服务器所提供的API,应用层通过查询、更新数据库(存储层)来响应该请求。图2-2四层架构识别SQL注入SQL注入就是程序员对程序中动态的SQL语句没有作严格的过滤或检测,导致黑客能在注入点提交非法的SQL语句,导致程序和服务器的信息被泄漏。由于SQL注入的入门门槛低,隐蔽性好,破坏性大,杀毒软件无法查杀,是当前最主流的入侵手段。SQL注入攻击的本质,就是服务器将用户传入的数据在数据库中当成了SQL代码执行。这里便有两个关键因素:第一个是用户有权限输入数据;第二个是服务器应用数据执行了用户传入的数据。识别数据输入Web环境是一种C/S(客户端/服务器)架构。客户端使用浏览器向Web服务器发送请求并等待响应。Web服务器接收到请求后,通过查询、解析数据库,将响应发送回客户端。很明显,双方便必须使用一种协议作为双方的约定,这种传输协议就是HTTP。首先,必须识别远程Web应用所接收的所有数据输入。HTTP协议定义了可以发送给服务器的操作方式,这里只关注研究与SQL注入攻击相关的两种方法:GET和POST。GET请求:GET是向服务器发索取数据的一种请求,是一种请求服务器的HTTP方法。使用GET请求时,信息是显示在URL中的。GET请求对用户是透明的,如下例,WEB服务器的GET请求如下所示:GET/general/vote/show/webst/VOTE_ID=131HTTP/Accept:text/html,application/xml;q=,application/xhtml+xml,image/png,image/webp,image/jpeg,image/gif,image/x-xbitmap,*/*;q=Accept-Language:zh-CN,zh;q=,en;q=Accept-Encoding:gzip,deflateProxy-Connection:Keep-Alive该请求中与数据查询相关的参数在URL中,格式如下所示:VOTE_ID=131上述示例中包含一个参数:VOTE_ID。服务器应用将会把参数值带入数据库中解析执行,然后将响应结果返回给客户端。POST请求:POST请求是作为HTTP消息的实际内容发送给web服务器的HTTP方法。在浏览器中填写表单并点击Submit按钮时通常使用该方法。下面的例子是浏览器发送给远程WEB服务器的内容,请求如下所示:POST/general/vote/show/webst/ITEM_ID=345HTTP/Accept:text/html,application/xml;q=,application/xhtml+xml,image/png,image/webp,image/jpeg,image/gif,image/x-xbitmap,*/*;q=Accept-Language:zh-CN,zh;q=,en;q=Accept-Encoding:gzip,deflateConnection:Keep-AliveContent-Length:40Content-Type:application/x-www-form-urlencodedcontent=POST+TEST&submit=+%CC%E1+%BD%BB+其他注入数据:除了GET或POST参数传输检索数据外,HTTP请求的其他内容也可能会触发SQL注入漏洞。Cookie就是个很典型的例子。Cookie由服务器发发送到用户端的浏览器,并会在用户端每次请求中都会回发给服务器。Cookie一般被用于辨别用户身份、进行session跟踪而储存在用户本地终端上的数据。由此可见,用户完全可以控制发送给服务器的Cookie内容,所以Cookie也作为一种有效的用户数据输入方式和易受注入影响的对象。如:Accept:text/html,application/xhtml+xml,application/xml;q=,*/*;q=Accept-Language:en-US,en;q=Accept-Encoding:gzip,deflateConnection:keep-alive该应用系统存在一个cookie注入漏洞,漏洞代码下图2-3,程序代码没有任何过滤就将用户传入的cookie参数带入到数据库中进行执行。用户只要利用抓包工具将传入的数据包截下来修改cookie字段的数据就可以将恶意命令传入到后台数据库进行执行。图2-3存在漏洞的代码文件操作请求参数下面先通过介绍一个非常简单的例子来熟悉SQL注入漏洞。页面收到一个名为VOTE_ID的参数。现在开始开始手动修改VOTE_ID参数的值,将其改为意外的数值。按照下列方式进行首次尝试:上例中使用不存在的类型名向服务器发出请求。服务器返回如下图2-4响应:图2-4服务器响应结果1该警告是当用户尝试从空结果集中读取记录时,数据库返回的一个MYSQL数据库错误。该错误表明远程应用未能正确处理意外的数据。继续进行推理操作,现在向之前发送的值添加一个单引号('),发送下列请求:下图2-5是服务器的响应:图2-5服务器响应结果2服务器返回下列错误:请联系管理员错误#1064:YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear'\''atline1SQL语句:SELECTEND_DATEfromVOTE_TITLEwhereVOTE_ID=attacker\'文件:D:/***root/general/vote/show/webst/不难发现,有些应用在处理用户数据时会返意想不到的结果。WEB检测的异常并非都是由SQL注入漏洞引起的,还会受到很多其他因素的影响。这里还可以通过进行另一个测试来识别SQLServer和Oracle中的漏洞。向Web服务发送下面两个请求:在MYSQL中,与其等价的请求为:'1如果两个请求结果相同,则很可能存在SQL注入漏洞。数据库响应测试SQL注入攻击漏洞时,可能会从WEB服务器收到不同的数据库错误响应,所以对于这些错误的意义需要熟悉和掌握。图2-6展示了产生SQL注入错误的过程和WEB服务器对错误进行处理得过程。图2-6产生SQL注入错误的过程中的信息流产生SQL注入错误的过程中发生了以下事件:用户端发送请求数据,尝试触发SQL注入漏洞。假设用户发送了一个带单引号的值。WEB服务器接收到用户端的请求数据,并向数据库服务器发送SQL查询。本例中,在WEB服务器执行的SQL语句中包含了用户输入参数并且构造了一条SQL查询,该查询因末尾存在单引号而导致语法错误。数据库服务器接收执行了格式不正确的SQL查询,并向WEB服务器返回一条错误消息。WEB服务器接收到的来自数据库的错误向用户发送HTML响应。下面列举常见的SQL错误。1)SQLServer错误在请求中插入一个单引号在参数中会产生数据库错误。对于SQLServer中,远程应用返回类似于下列内容的错误,图2-7所示:图2-7SQLServer错误通过上面的例子,我们可以确定运行在数据库上的远程SQL语句与下面的内容相似:SELECT*FROMNewsWHEREArticleID='2650''该Web应用未检测单引号,所以数据库服务器响应返回了一个错误。2)MYSQL错误下面介绍一下典型的mysql错误。MYSQL可以在很多架构和操作系统下执行,兼容性很好,常见的配置是在装有linux操作系统的apacheweb服务器上运行php,但它也可以出现在很多其他场合中。下列错误通常表明存在MYSQL注入漏洞:Warning:mysql_fetch_array(1):suppliedargumentisnotavalidMySQLresultresourcein/var/www/online9自动寻找SQL注入对于SQL注入工具的开发,如何的适度的自动化SQL注入的请求是其中的关键。识别数据输入是可以自动化的内容,它涉及搜索WEB站点和寻找GET及POST请求。数据注入也可以自动完成,因为上一阶段已经获取了发送请求所需要的所有数据。若想自动寻找SQL注入漏洞,主要问题在于检测远程服务器响应中的异常。对于管理员来说,区别一个错误页面或其他类型的异常页面非常容易;但对于程序来说,要识别出服务器异常输出,有时会非常困难。某些情况下,应用可以很容易地检测到数据库发生了错误,如以下情形下:WEB应用服务器返回由数据库产生的SQL错误;WEB应用服务器返回HTTP500内部服务器无法执行错误;某些SQL盲注情况下。但对于其他情况,应用系统将很难识别存在的漏洞,而且很容易出现遗漏。所以,自动发现SQL注入存在着一定的局限性,自定义的测试和手动测试也显得非常重要。SQL盲注很多时候,WEB服务器为了安全设置关闭了错误回显,但是这可以阻挡住SQL注入攻击吗当发现一个SQL注入点,但应用只提供了一个自定义的通用的错误页面;或者虽然提供了正常的页面,但与期望的测试响应存在一些小的差异。基于这种情况下的SQL注入攻击测试,都属于SQL盲注。所谓“盲注”,就是在在注入攻击Web应用时,攻击语句被带入到后台数据库中执行,但是服务器查不会返回错误或者执行结果的回显的情况下进行的注入攻击。服务器没有了攻击者期望的错误回显,对于攻击者来说没有了非常重要的SQL注入攻击“调试信息”,所以攻击者必须找到一个方法来从侧面验证注入的SQL语句是否得到成功执行。注入带判定的参数(TimingAttack)当已经识别可能存在SQL注入漏洞,但又没有正常的回显的时候,要想进一步确认和检测漏洞,一般可以提交包含副作用的查询参数。比较老的技术是使用timingattack,计时攻击。2011年3月27日,一个叫TinKodes]的黑客在着名的安全邮件列表FullDisclosure上公布了他入侵的细节。这次入侵事件,就是因为一个SQL盲注漏洞引起的。据黑客公布描述,当时这个漏洞是出现在下面这个页面,如图2-8:图2-8漏洞页面可以看到网址URL:id=1170,通过修改参数id后的数值,服务器将返回不同的查询的客户信息。这个漏洞中,id=这个参数链接就是一个很隐蔽的“SQL盲注”漏洞,攻击者通过精心构造id参数的URL,就可以进行SQL注入攻击。利用通常的SQL语句比如“and1=2”在此链接下是无法看出异常的,因为应用服务器不会返回任何异常的数据。在这里,TinKodes]利用“SQL盲注”的一个技巧:TimingAttack,用来确认漏洞是否存在。在MYSQL数据库中,有个函数:BENCHMARK。,可以用来测试函数性能。同时它含有两个参数:BENCHMARK(count,expr)函数执行的结果,是将表达式expr执行count次。比如:mysql>SELECTBENCHMARK(1000000,ENCODE('hello','dllk));TOC\o"1-5"\h\z++\o"CurrentDocument"|BENCHMARK(1000000,ENCODE('hello','dllk'))||0|++1rowinsetsec)就将ENCODE('hello','dllk)执行了1000000次,共用秒。因此,攻击者就可以利用MYSQL数据库中的这个函数BENCHMARK。,在传入到后台服务器的参数中让同一个SQL函数在数据库中执行若干次,然后通过服务器执行该SQL语句的时间的长短变化,就可以用来侧面判别出SQL注入攻击语句是否已经成功的执行。这个攻击利用技巧在盲注中被称为TimingAttack。在此次的攻击中,攻击者接下来就是利用TimingAttack攻击。比如构造的攻击参数id值如图2-9:图2-9TimingAttack攻击语句1这段攻击Payload首先进行的是判断库名的第一个字母是否为小写的w,即CHAR(119)。如果判断结果为真,就会执行后面的BENCHMARK()函数,执行该函数就会造成较长的延时;如果判断结果为假,则该攻击语句很快就会被执行完毕,页面将很快得到加载。这样,攻击者就可以通过构造攻击Payload猜解遍历出所有的库名字母,直到将整个数据库名全部猜解完成为止,然后进一步可以猜解遍历出数据表明、列明和数据内容,将可以将整个数据中的内容下载过来。同时,攻击者还可以通过以下Payload获取到更多有用信息,图2-10:图2-10TimingAttack攻击语句2此外,攻击者可以通过利用DumpFile的方法如图图2-11,来写入一个webshell木马:图2-11DumpFile写如websehllTimingAttack是SQL盲注中的一种高级技巧。在各种不同的数据库中,都有与BENCHMARK()函数类似的东西。如MYSQL:BENCHMARK(1000000,MD(1))orSLEEP(5)PostgreSQL:PG_SLEEP(5)orGENERATE_SERIES(1,1000000)MSSQLServer:WAITFORDELAY'0:0:5'如,在MicrosoftSQLServer中,可使用如下SQL代码来产生一个8秒的暂停:WAITFORDELAY'0:0:8'同时,攻击者还可以利用应用服务器的回显输出来进行判断。例如,若将注入下面的字符串:'AND'1'='2插入到一个搜索字段中,将产生与'OR'1'='1不同的结果响应。ParameterSplittingandBalancing技术如果注入带判断的函数不起作用,可以尝试"parametersplittingandbalancing”(参数拆分与平衡)技术。拆分是指拆分正常的参数输入,平衡则是指保证最终的查询与正常的输入是一致。其基本思想是:将正常的请求参数进行拆分,然后使用SQL语句关键字对它们进行修改,最终需保证与原数据不同,使得后台数据库服务器解析执行带入的参数时,与正常的参数请求一样的同时也带入了“非法”的请求。SELECTreview_content,review_authorFROMreviewsWHEREid=5如果使用2+3替换5,那么输入应用中的参数将不同于原始请求中的输入,但SQL数据执行在结果上是等价相同的:SELECTreview_content,review_authorFROMreviewsWHEREid=2+3这种方式不仅仅只局限于数字值型。SELECTCOUNT(id)FROMreviewsWHEREreview_aouthor='dllk'可以使用特定的数据库运算符将dllk字符串拆分,向Web服务应用提供与dllk相对应的不同的参数输入。对于再oracle数据库的利用中,可以使用“||”运算符来链接两个字符串:SELECTCOUNT(id)FROMreviewsWHEREreview_aouthor='dl'||'lk'它与之前的第一个查询在最终执行的参数是等价的。下表2-1是带子查询占位符的拆分字符串参数:表2-1带子查询占位符的拆分字符串第3章SQL注入攻击技术研究识别数据库要成功进行SQL注入攻击,还有重要的一点就是需要探测出服务器正在使用的数据库系统DBMS。若是攻击者连数据库系统都无从判断,就不可能构造出有效的“恶意”参数来进行SQL注入,也就无法实施攻击。通常WEB架构技术可以使我们猜测验证出数据库系统。例如,ASP和.NET的WEB服务应用通常使用的事MicrosoftSQLServer作为数据库系统,而PHP应用则很可能使用MYSQL数据库。如果是用JAVA、JSP等编写的,那么很有可能使用的是Oracle数据库。在识别SQL注入漏洞所存在的数据库中,如果不是SQL盲注,通常情况下可以很快的判断出数据库系统。如果数据库响应返回出SQL注入的错误消息,一般都会在报错的响应中可以找到是何数据库系统的线索。如图3-1SQLServer错误信息:图3-1SQLServer错误信息根据报错信息可以很直接的就判断数据库类型为MicrosoftSQLServer。这种方法就是添加一个单引号将使得构造的SQL语句参数带入到数据库服务器当作SQL语句来执行,这将产生一条语法错误而暴露出错误信息。如图3-2SQLServer错误信息:图3-2SQLServer错误信息在错误消息中明确提到了“MySQL”,还附加了一些关于出错内容的有用细节。如下表3-1返回各种DBMS所对应的查询:表3-1返回各种DBMS所对应的查询例如,对于SQLServer2000SP4来说,执行SELECT@@version查询时,将得到如图3-3所示信息:图3-3SQLServer2000服务器返回信息如果应用服务器并不能直接的在响应中返回所想要的数据信息,则需要一种间接的方法来触发获得想要的信息。不同的数据库,在语法查询方式上有略微的不同,不同的数据库系统就会有不同的查询方式。比如一个简单查询如下:SELECT'somestring'该查询语句对于大多数主流的数据库系统都是有效的,对于不同的数据库系统,将查询的字符串分成两个字串的SQL语句的时候还是存在有细微的差异的,就SQLServer、Mysql、Oracle来说,如下表3-2:表3-2字符串分成两个字串的SQL语句假设Web应用中没有可以利用的SQL注入字符串参数,则可以使用之前数字参数类似的技术。这样的话就需要一条针对特定情况特定技术的SQL语句,使得在服务器经过执行SQL语句后计算后生成一个数字。在下表3-3所示列举的SQL语句中,在对应的数据库系统上执行对应的SQL语句后都会生成一个整数,而若在其他不同的数据库下执行语句的话,就将会产生错误。表3-3从数字函数推断DBMS版本注入语句获取数据UNION语句是数据库管理员经常使用函数之一。使用UNION的SQL语句,可以连接两条或多条SELECT语句的联合查询得到结果。基本语法如下所示:SELECTcolumn-1,column-2,...,column-NFROMtable-1UNIONSELECTcolumn-1,column-2,...,column-NFROMtable-2执行该查询后,返回结果得到的是由两个SELECT语句返回结果组成的表。通常在默认情况下,得到的返回结果中只会包含不同的数值。如果想在查询的结果中将重复的值也显示出来,只需要稍微修改下语法即可:SELECTcolumn-1,column-2,...,column-NFROMtable-1UNIONALLSELECTcolumn-1,column-2,...,column-NFROMtable-2在SQL注入测试攻击中,数据库的UNION查询方法对于攻击来说作用很大:如果服务器可以正常返回第一个查询得到的数据,若想修改加入数据库UNION查询,便可以利用读取到攻击者想要读取的该数据库用户,然后就可以访问的其他的任何一张数据表。如,如果想要找到页面执行的查询的数据表所返回的列数,则可以按下列方式请求URL,直到不再返回错误位置信息:获取列的另一种方法是使用ORDERBY语句,ORDERBY语句并不是通过注入另一个查询语句来获得查询结果。通过增大ORDERBY子语句中代表列的数字就可以来识别查询中的列数,如下所示:若在以上使用ORDERBY9查询时收到第一个错误回显,就意味着查询的数据库中包含的数据有8列。当攻击识别出数据库的列数后,接下来就是选择数据中的其中一列或几列来继续攻击查询数据库中的数据了。因此,如果攻击者想提取一个数据库字符串值,就可以通过它来保存正在寻找的数据,以便找到一个字符串类型的列。攻击者可以用NULL来很容易的实现,只需要重复的使用字符串示例替换掉NULL即可。例如,如果原始的数据查询中包含4列数据,则可以做如下尝试获得字符串类型的列:只要数据库没有返回错误,就可知道刚才存储dllk值的列保存的一个字符串,因此就可以用它来显示需要的值。例如,若数据中第二列可以保存一个字符串字段,则当请求下面的URL即可存储到第二列中:而下列URL则可以同时检索当前用户名和当前数据库名:攻击者通过精心构造使用UNIONSELECT的SQL语句注入,就可以获取整张数据表。假设攻击者已经得到当前数据库包含一张名为users的表,表中包含userid、first_name、和second_name列。则可以使用下面的方式来获取用户名:使用UNION注入任意查询来攻击数据库,是一种既快捷又有效的攻击手段技巧。但该方法并不通用,WEB应用也没那么容易就轻易的泄漏数据库数据。在MicrosoftSQLServer中,对于攻击者来说,攻击者最想了解的是当前执行数据库查询的应用用户是否是以系统管理员帐户(SA)运行的。因为权限的不同,所能进行的查询和操作就不同,在后续的扩大渗透中,在数据库上执行的敏感的提权操作也会有所不同,对于攻击者的攻击的程度也不同。为确定是否为SA权限,可以使用下列注入语句查询:IF(system_user='sa')WAITFORDELAY'0:0:5'--该查询将转换为下列URL:语句中的System_user在SQLServer中是T-SQL函数,这个函数在数据库中执行完成后会返回数据为当前登录的用户名。该Payload的执行,是根据system_user函数执行的值来判定是否执行WAITFOR函数(等待6秒)。攻击者可以通过Web应用查询后返回的结果加载HTML数据所花费的时间来判定是否为SA用户。该Payload的SQL查询语句尾部的两条横线是注释作用,可以注释掉所有可能影响原查询结果的除伪造拼接的SQL攻击查询代码。上面基于时间的判定的技巧很灵活,但是基于时间判定的的方法不适合提取大量信息。可以利用基于错误的判定的方法,如:is_srvrolemember()也是SQLServer中的T-SQL函数,当它被执行,可以返回下列值:1:用户属于该组。0:用户不属于该组。NULL:该组不存在。我们假设用户属于webadmin组,那么URL中的id的参数应该等于12/1,因此,Web应用就会正常返回数据页面。如果当前的用户并不是webadmin组中的成员,那么此时URL中的id值就是12/0;这样的话将会导致SQL语句查询失败,Web应用返回的结果是一个错误。对于返回的错误来说,错误的具体消息内容肯定会各有千秋:错误可能只是由Web服务器相应错误返回的‘500internalservererror’,错误信息也有可能包含了完整的SQLServer错误消息,甚至由于管理员的限制,错误的信息是管理员主动设置的自定义的404错误页面。对于WAITFOR的基于时间的方法来说,基于错误来判定的方法有个很大的优点就是效率,基于时间的方法涉及查询延迟的问题,基于错误的判定的方法的请求可以马上返回注入利用的结果。当然基于错误的方法缺点就是将会触发很多错误,这些错误将会被记入到服务器的日志当中,这对于攻击者来说是不愿意见到的。不过,可以稍作修改优化,例:%2B是“+”的URL编码。最终将按照下列式子为id参数赋值:id=24+(casewhen(system_user='sa')then1else0end)如果执行的不是sa,那么id=24,请求等价于:而如果执行查询的用户是sa,那么id=25,请求就等价于:所以,攻击者就可以可以根据Web服务器查询后返回的结果中加载的HTML中包含的字符串的不同来判断当前用户是否为sa。提升权限所有的数据库系统管理员都可以对数据库用户的权限进行很详细的很细微的设置和控制。管理员可以为每个用户赋予一定量的操作执行权限来实现用户对数据存储信息的访问。通常一个数据库系统都可能包含了很多个数据库,但是攻击者利用的数据库的用户权限只能访问其中某一个数据库,在正常的情况下,其他的数据库都不能进行任何操作,但是攻击者目前掌控的数据库中并没有想要的信息。或者是当前数据库的用户权限可以读取所有数据库的内容,但是只有对于当前数据库有写权限,对于其他数据库不能执行修改操作。攻击者若想获取其他数据库的操作或者对于系统的其他地方进行操作,就需要更高的权限。这个过程就是提升权限。SQLServer数据库的提权在MicrosoftSQLServer中,使用命令OPENROWSET是一个很好也比较典型的的数据库攻击方法。OPENROWSET是可以实现SQLServer对远程的OLEDB数据源进行一次性连接,而DBA则可以用来检索和查询远程数据库上的数据,这样就可以作为连接数据库的一种方法。下面是典型调用OPENROWSET的方法,例:SQLServer的OPENROWSET在SQL注入攻击中有多种攻击方式和技巧。例如在SQLServer2000上,攻击者可以使用OPENROWSET来进行暴力猜解SA密码并提升权限。例如:若dllktest是正确的密码,那么执行该查询并会返回结果A;但若密码不正确,那么将收到下面的返回信息:LoginFailedforuser'sa'.这样就可以构造一种暴力猜解SA密码的方法。如果找到正确的密码,接着就可以使用sp_addsrolemember存储过程来将用户添加到sysadmin管理员组,这样就可以很容易地提升权限。命令OPENROWSET同时也可以用于扫描SQLServer存在的弱口令,如:Oracle数据库的提权对于Oracle数据库,通常通过Web应用的来进行SQL注入利用提升权限的很困难。因为在Oracle数据库中,大多数的提权攻击方法都需要前提是PL/SQL注入,而PL/SQL这种注入漏洞通常都很少见。若碰到PL/SQL注入漏洞,则可以通过注入PL/SQL代码来提升权限,以及在数据库服务器上操作系统命令。在非PL/SQL注入漏洞中,存在有一个方法,漏洞是出在ORACLE的mod_plsql组件中。该漏洞的利用示例如下URL:攻击者在SQL的接口应用上提权要简单得多。大多数提权过程都是用的以下的步骤:(1)首先创建一DBA权限并授权给public的Payload。然后将Payload注入存在漏洞的PL/SQL存储过程中。Payload如图3-4所示:图3-4创建DBA权限给public(2)下图图3-5然后将该Payload注入到包中:图3-5Payload注入(3)图3-6所示激活启用DBA:图3-6激活DBA(4)图3-7所示从public中取消DBA:图3-7从public取消DBA当前session虽然依然有DBA权限,但不再是ORACLE权限设置中了。使用这种攻击的局限就是前提利用要有CREATEPROCEDURE的权限。获取口令hashSQL注入利用要想攻击得到口令hash,所以也必须构造一定的SQL语法传入数据库服务器进行查询检索。一般很多WEB应用也是将WEB管理员的帐号密码存放到数据库中。(1)SQLServer如果,。匚注入利用的环境是MicrosoftSQLServer,但根据数据库版本的不同,利用的方式会差别很大。但不管是那个版本的数据库,都得需要有管理员权限猜能访问得到口令hash。举例若是数据库为SQLServer2000,hash是存储在master数据库的sysxlogins表里。我们可以通过下面的语句进行查询得到:SELECTname,passeordFROM.SysxloginsSQLServer2000数据中,存储的hash是由pwdencrypt()这个函数生成的。这个函数并不是公开的,它会生成带盐的salthash,其中的salt是一个和时间相关的函数。(2)MySQLMySQL数据中,hash是存储在表中。如下是可以获取用户名等的SQL查询语句:SELECTname,passwordFROM;MYSQL数据库中的hash是通过PASSWORD(涵数生成的,不同的MYSQL版本函数生成hash的算法不一样。(3)Oracle在Oracle数据库中,hash是存储在$表的password列中。其中dba_users的视图指向于$表,但是自Oracle11g开始,hash不再出现在dba_users视图中了,Oracle的hash是数据加密标准(DES)hash。$表中包含Oracle数据库的用户以及hash。可以使用下列SQL查询来获得hash,如图3-8所示:图3-8SQL查询获得hash针对OracleDES角色hash,如图3-9所示:图3-9查询OracleDES角色hash针对OracleSHA1hash(Oracle11g以上),如图3-10所示:图3-10Oracle11g以上查询SHA1hashOracle数据库安装时附带了很多其他的默认表,这些表中有时也存储着hash,有时甚至还包含明文密码。很多时候明文通常都是在表中。文件读写技术MySQL数据库的文件读写MySQL提供了一个很敏感的功能,该功能经常被攻击者利用,该功能是SQL语句中可以使用LOADDATAINFILE和LOAD_FILE命令来进行文件读取,可以将文件以文本文件的方式读取存储到数据库中。下面来示例LOADDATAINFILE的使用方法。创建一个文本文件,名为,如图3-11所示:图3-11内容然后在MySQL控制台下运行下列命令,作用是创建一张表来保存信息,如图3-12所示:图3-12创建表然后使用下面的命令导入数据到表中,如图3-13所示:图3-13导入数据到表然后查询刚新建的表,可以看到文本文件已经导入到数据库中,如图3-14所示:图3-14表中导入的数据MySQL数据库还提供了LOAD_FILE函数来进行文件的读取,该函数可以不用创建数据表就可以直接查看到结果,如图3-15所示:图3-15LOAD_FILE文件读取攻击者通常利用上面的命令函数来读取应用系统的配置文件,甚至可以通过读取的编码转换变形等读取到系统的hash文件。对于MySQL写文件,与在文章前面的说到的MYSQLLOADDATAINFILE读文件命令有一个相对应的写文件的命令slectintooutfile(dumpfile),就可以用来写文件。MySQL的这条命令可以将select语句的记过直接写入到一个完全可读文件中,同时,MySQL的dumpfile允许直接写入二进制文件。写文件示例,如图3-16所示:图3-16MYSQLoutfile写文件上述示例中的SQL语句执行后,会在/tmp目录中创建一个文件。SQLServer数据库的文件读写对于MicrosoftSQLServer的文件读取方法,攻击者通常借用的最多的就是BULKINSERT语句。下图3-17所示是使用MicrosoftSQLQueryAnalyzer进行的测试示例:图3-17SQLServer文件读取测试SQLServer的写文件可以使用前面说的读取文件的的方法来有效地向文件系统写文件。示例如图3-18所示:图3-18SQLServer写文件测试MicrosoftSQLServer还可以从数据源创建文件的能力,方法如图3-19所示:图3-19SQLServer创建文件对于SQLServer的SQL注入攻击利用,很多SQL注入工具的都是使用xp_cmdshell来实现文件操作。利用xp_cmdshell写文件最简单的方法,就是使用重定向符>>来创建文本文件,如图3-20所示:图3-20SQLServer利用xp_cmdshell写文件示例Oracle数据库的文件读写Oracle数据库提供了很多与系统底层的交互,有很多种方法底层系统操作读取文件的方法,但是其中大多数方法都是基于PL/SQL代码才能够运行。Oracle中通过三种不同的接口来访问文件:Utl_fiel_dir/OracledirectoriesJavaOracleText在默认情况下,非特殊权限的用户是没有权限在操作系统层读写文件的。Oracle数据中攻击者读文件最常用的是使用utl_file_dir和Oracledirectories这两种方法。使用utl_file_dir可以让Oracle数据库在系统中指定一个目录,数据库的用户都可以在指定的该目录中进行文件读写。若设置utl_file_dir的值为*,则用数据库写文件的操作就没有了目录限制。下表3-4所示列举的就是使用utl_file_dir/Oracledirectories的方法基于Oracle数据库来读取文件的情景:表3-4Oracle数据库utl_file_dir/Oracledirectories的方法读文件下面提供的就是一个Oracle读取文件的示例,示例中利用PL/SQL代码读取了位于MEDIA_DIR目录下的一个文本文件,读取了其中的1000个字节。如下图3-21所示图3-21Oracle读取文件自Oracle9i开始,Oracle数据库提供了从外部表读文件的功能。Oracles数据库可以使用SQL*Loader或OracleDatapump从一定结构的文件中读取到文件。下面的示例是针对于从外部表读取文件的代码,如图3-22所示:图3-22从外部表读取文件在Oracle数据库中,除了使用utl_file_dir、Oracledirectory这两种方法外,还可以使用Java程序来进行文件的读写。可以在MacroIvaldis的Web站点上找到该方法的示例代码,网址为:除以上方法外,还有一种是利用OracleText,这是一种比较少见的读取文件的技术。它需要将想读取的文件插入到一张表中,然后创建一个全文索引或者等待索引创建成功的过程状态下即可。下面示例代码就是利用OracleText方法将插入到一张表中,用以来读取该文件,如图3-23所示:TASLE£ile^1idHUMBERPREWARXEY,VARCHfiR{255}UtTIQUE;otformat寸ARCHA甘{后】iWSEttTrtrrofilesVALUES(lfrc;\boot.lri'rNTTLLh;C^-JATEIN&EXQtT快上卓目也心2ISctnsya.cunLextPARAMETERS(!datastareflle_datastcreformatcoluminformat1)?--retxievedatafrgm(hqItSKtknd愣XSelecttaken_teMtfrcun.c!e$file?图3-23OracleText方法将插入到一张表中对于Oracle数据库写文件,与读文件一样,同样提供了很多从底层操作系统创建文件的方法,可使用Utl_file、DBMS_ADVISOR、外部表、Java、操作系统命令和重定向等方法来进行文件的写入操作。从Oracle9i以后,使用utl_file方法可以在文件系统上写入二进制文件。其中,DBMS_ADVISOR基本是创建文件最快捷的方式,下面的示例创建一个的文件,内容为dllktest:CreatedirectoryEXTas'C\'EXECSYS.('dllktest'.'EXT','')从Oracle10g以后,可以使用外部表创建一个包含用户名和密码的文件,如图3-24所示:图3-24从外部创建包含用户名和密码的文件可以在MacroIvaldi的Web站点上找到Java的示例代码:执彳丁系统命令执行系统命令根据数据库来操作分别有以下几种方式:MySQL执行系统命令MySQL数据库本身并不支持执行shell命令。但大多数情况下,若MYSQL数据库服务器和WEB服务器没有分离,是位于同一服务器上时,这样攻击者可以先使用“selectintoDUMPFILE”的方法在服务器上写上一个webshell,然后通过webshell来对操作系统进行控制执行命令。SQLServer执行系统命令在MicrosoftSQLServer中,可以利用xp_cmdshell的方法来直接执行所要执行的命令。如下图3-25所示:图3-25xp_cmdshell执行命令SQLServer在默认情况下,是禁止对组件"xp_cmdshell”以及"”的访问的,同时,此组件通常也在管理员进行服务器安全配置时被关闭。但是系统管理员还是可以通过使用sp_configure的方法来启用"xp_cmdshell”,这样就给攻击者有了可趁之机。而攻击者可以通过执行其他的几条指令进行恢复:;EXECsp_configure‘showadvancedoptions’,1-;RECONFIGUREWITHOVERRIDE-;EXECsp_configure‘xp_cmdshell’,1-;RECONFIGUREWITHOVERRIDE-;EXECsp_configure‘showadvancedoptions’,0-dbccaddextendedproc("sp_oacreate”,””)dbccaddextendedproc("xp_cmdshell”,””)Oracle执行系统命令不同的Oracle数据库版本,执行命令的方法也各有差异。利用DBMS_SCHEDULER图3-26利用DBMS_SCHEDULER执行系统命令本地PL/SQL下列的示例代码使用的是本地PL/SQL为Public授予为DBA权限。其中Grant命令通常是在SYS用户执行的命令,通常为INSERTINTOSYSAUTH$命令。在下面的示例中,执行后,创建了一个名为的文件,并且是由Sqlplus来执行的文本文件。示例如下图3-27所示:图3-27本地PL/SQL执行系统命令其他方法除了上面的提到的执行命令的方法外,还可以使用数据库中的其他功能来执行系统命令:Altersystemsetevents本地PL/SQL9i缓冲区溢出+shellcode自定义代码当然,对于大多数攻击者来说,通常攻击者都是通过数据库来写入一个木马文件,然后通过基于调用数据库组件或者其他的组件的木马文件来进行命令执行。第4章SQL注入高级手法过滤绕过机制概述Web应用通常会使用过滤应用,设计这些过滤的目的就是防御SQL注入在内的常见攻击。这些过滤方式可以是位于web应用的代码层中,也可以通过第三方的外部实现,如Web应用防火墙(WAF)或入侵防御系统(IPS)。在SQL注入攻击中,遇到的过滤关键字一般是:SQL关键字:landlexeclinsertlselectldeletelupdatelcountl*l%lchrlmidlmasterltruncatelcharldeclare等;特定的单个字符,比如引号标记等;空白符;截断符等。可能还会有代码层级别的过滤器,使用的方法包括编码、消除敏感字符等等各种方法,用来过滤掉畸形的数据串等,从输入中去除掉带有攻击型的敏感字符然后正常处理剩下的内容,甚至采集识别进行二次渲染生成新的文件。这些受到保护的web应用层,要是想利用漏洞,则需要寻找一种能避开过滤器防护的方法以便恶意输入传递给易受攻击的代码。常见方法大小写变换如果对于关键字过滤的不是太严格或者机制不够完善,攻击者有时则可以通过变换攻击字符串参数的字符大小写就可以绕过过滤机制。此技巧的基础就是因为数据库不区分执行的SQL语句代码的大小写。例如,如果下面的输入被拦截:'UNIONSELECTpasswordFROMwebUsersWHEREusername='admin'--则可以通过下列方法绕过过滤:'uNioNSeLecTpasswordFroMwebUserswHeReusername='admin'--•使用编码的方式编码是一种很具有技巧性的技术。通常攻击使用的是URL编码,其最基本的方式就是将问题字符的十六进制用ASCII码来编码替换它们,并且在转换后的ASCII编码前面加上%。如,单引号字符的ASCII码对应的为0x27,其URL编码的表示方式为%27,空格则为%20。而在有时,基本的URL编码确实被一些防御过滤软件或者过滤机制过滤掉了,但是攻击者还可以将编码转换为双URL编码,这种情况通常就是用在有些Web应用本身会将用户输入的内容多次解码,而攻击者就使攻击的参数在解码完毕之前绕过滤防护。•构造畸形数据包的方式攻击者可以通过构造畸形数据包来绕过过滤,其核心思想就是:原本是GET的数据包,用POST的方式提交。反之亦可。这个利用技巧利用的是接参函数的不规范造成的漏洞。•使用空字节绕过过滤机制对于在应用代码外部实现的SQL注入过滤,如入侵检测系统或WAF,很多时候对于这些情况,都可以尝试使用空字节来绕过过滤。要想利用空字节进行攻击,只需要在过滤程序对于阻止的攻击代码前插入一个使用URL编码的空字节(%00)即可。•利用截断技巧绕过过滤机制有些过滤防护系统采用对用户输入的数据进行截断或者调整数据使其在预定义的最大长度,有时可能是为了尽量阻止缓冲区溢出攻击的行为。截断用户在SQL查询中提供的输入会引发漏洞。在MicrosoftSQLServer中,参数化查询必须为每个字符串参数指定最大长度。如果参数中包含更长的输入,那么输入会被截断成为预定的最大长度。假设应用允许忘记口令的用户通过提交email的形式来找回原来的口令,如果应用接收过长的输入并在SQL查询中将其截断,那么攻击者便可以提交下列的输入:接下来当应用向原来提供的email发送口令是,还会向攻击者发送一份副本,这样攻击者就可以成功攻击受害者的账户。构造超长数据包的方式对于某些过滤系统,如WAF等,攻击者可以尽量超长的构造一些正常的数据请求,然后再在后面带入SQL注入的攻击参数,因为很多过滤系统在对于提交的数据数据超出某个长度以后,将不能有效的进行过滤判断。二阶SQL注入对于前面所提到的SQL注入攻击,都是属于常规性的。前面提到的SQL注入在单个HTTP请求和响应中的流程如下所示:(1)攻击者HTTP请求中插入了精心构造的参数;(2)应用服务器处理输入的参数,参数经过了拼接导致SQL查询被执行;(3)应用服务器有可能会对攻击者请求的参数返回输出结果。而这里提到另外一种高级的注入手法就是二阶SQL注入。这种攻击事情的过程如下所示:(1)攻击者HTTP请求中插入了精心构造的参数;(2)应用服务器存储该输入的参数准备处理;(3)攻击者进行第二次HTTP请求,同时插入了精心构造的参数;(4)应用服务器将处理第二次请求,应用服务器将会检索已存储的参数并处理,因此导致了SQL查询被执行;(5)应用服务器有可能会对第二次请求的参数响应返回输出结果。二阶SQL注入属于一种更细微的漏洞,通常更难被检查到。下面举例说明,假设一个通讯簿的应用,在应用系统中,用户可以保存朋友的联系信息。用户在创建一个联系人时,用户可以输入姓名、Email和地址等信息。应用系统使用INSERT语句为该联系人创建新的数据库记录,并将输入中的引号双重编码以防止SQL注入攻击。流程图如图4-1所示:图4-1通讯簿的添加记录流程图而当用户修改已存在的联系人时,应用系统将会先使用SELECT检索该联系人的信息,并保存到内存中;然后使用用户提供的新信息更新相关数据,并在此对该输入中的引号进行重新编码,而用户没有更新的数据项将在内存中将保持不变;最后使用UPDATE语句将内存中的数据回写到数据中。这个过程的流程图如图4-2所示如下:图4-2通讯薄应用更新数据流程图假设上例中引号双重编码可以有效的防止常规的SQL注入。但是,这样的情况下应用系统仍然易受到二阶SQL注入攻击。若攻击者想利用该漏洞,首先需要使用某个字段中的攻击payload创建一个联系人。现假设数据库系统是MicrosoftSQLServer,使用下列语句创建一个联系人;a'+@version+'a输入中的引号被双重编码,最终INSERT语句会如下所示:联系人的姓名安全的保存到数据库中了。接下来更新创建联系人,只需要提供一个新值即可。应用首先检索已存在联系人的信息:SELECT*RROMwebUserswherecontactid=123检索出来的信息保存在内存中。应用系统使用新提供的数据值替换内存中的值,并将引号双重编码。然后执行UPDATE语句,将信息保存到数据库中:UPDATEwebUsersSETname='a'+@@version+'a',address='mianyangswust',...WHEREcontactid=123到上面这个语句后,攻击以成功执行并修改了应用的查询。当查看更新过的联系人的细节信息时,显示出来的是:Name:aMicrosoftSQLServer....Copyright(c)....(Build2600:)aAddress:mianyangswust通讯薄应用系统成功的执行了攻击者构造的SQL语句,这就证明该应用存在SQL注入攻击漏洞,并且可被攻击利用。混合攻击混合攻击就是指使用多种攻击技巧来对应用服务器进行攻击,同时也可以就SQL注入漏洞与其他漏洞或者技术相结合起来来进行应用服务器攻击。如,在有时,可以利用SQL注入漏洞和和其他不同的漏洞或bug进行结合,如跨站脚本(XSS)漏洞。若进行SQL注入利用攻击的时候,应用服务器并没有给出返回的输出回显,可以利用该漏洞与反射XSS漏洞相结合来侧面判断SQL注入攻击是否成功执行来当成返回回显。在不同的数据库类型和版本中,还有很多各自可利用的小bug和漏洞可以与SQL注入进行结合。第5章自动注入攻击工具框架设计设计需求项目的需求是软件设计和实现的最根本需求依据。根据SQL注入漏洞的利用过程,据分析的内容构建SQL注入的自动化检测及注入攻击利用框架。根据SQL注入攻击的过程设计开发一个SQL注入攻击程序,实现以下功能:(1)能够自动扫描识别两种以上类型的SQL注入攻击;(2)能够利用SQL注入漏洞,进行数据库攻击,如猜测帐号、口令等;(3)至少具有对四种类型的数据库进行进行攻击检测,能够对数据库的结构信息进行猜解,能对数据库进行数据操作;(4)能够利用SQL注入执行系统命令,能对有一定权限的目标进行文件操作和提权操作;(5)能一定程度上自定义注入攻击以绕过简单防注入机制。自动注入攻击工具框架总体设计通过对Python程序编写的学习和研究,软件分成三个主体部分:自动抓取目标Web网站链接;检测是否存在SQL注入漏洞;进行SQL注入攻击。自动注入攻击工具框架总体架构图如图5-1所示:图5-1自动注入攻击工具框架总体架构图关键技术需要识别Web应用程序是否具有SQL注入漏洞,首先必须得要找出目标Web应用程序的网站链接,并且识别该链接是否为可控制输入数据。只有有了这个基础,才有可能是产生可控的数据交互。然后通过遍历发送HTTP请求以及特殊数据来触发和进一步验证,通过服务器处理发送的数据所产生的反应来一步步的判断SQL注入。对于识别和抓取目标Web系统的链接,设计有两条思路,一为通SWeb爬虫实现对于Web系统进行链接爬行和抓取,然后判断是否存在SQL注入;一为通过搜索引擎收录的目标Web链接,将之抓取过来进行注入分析。网络爬虫技术Python内置的很多模块对于网页爬取都有很大的作用,无需再借®Web«览器或者服务器就能处理HTML文档。使用httplib,urlparse,urllib2库用来爬取链接、数据、图像、Cookie等都非常便利。若想对于目标进行链接爬取,首先需要解析URL,通过Python的urlparse模块可以很轻松的分解URL并重新组装。关键代码如图5-2所示:图5-2python使用urlparse解析URL当解析了URL链接后,更重要的是分析页面的内容,因为页面中的内容有可能还包含着该Web网站的其他链接,这样通过一层层的爬取,就能将Web站点中的页面基本爬取完毕。Python中的HTMLParser模块能够根据HTML文档中的标签来快捷、简便地解析HTML文档,这对网页内链接的抓取就显得易如反掌。先定义一个HTMLParser的新的类,使用覆盖handle_starttag()的方法来显示所有链接中的href标签属性,然后创建好一个实例用来返回HTMLParser的对象,这样,就可以使用(url)打开并读取HTML文档中的内容了。对于HTML文件中包含的链接内容,可以使用read()函数读取将数据传递给HTMLParser对象,HTMLParser的feed函数可以接收到数据,这样就可以抓取到页面内的链接了。同时ChilkatPythonModule是一个很强大的商业版Python工具开发包,Chilkat可以处理网络、加密、压缩解压缩、XML等等内容。关键代码如图5-3所示:图5-3爬虫抓取链接判断,。1注入利用谷歌抓取链接利用爬虫技术来对Web目标的链接进行抓取确实不失为一个好方法,但很多时候,由于服务器安全设置或者是防火墙的设置,并不允许同一台服务器的与目标服务器建立大量的连接请求。很多时候网络爬虫的效率和效果并不是很好。这时就可以利用搜索引擎搜索的关键字来定位与目标相关的Web链接,然后直接将抓取的链接进行SQL注入检测。核心代码如图5-4所示:图5-4抓取谷歌收录的Web链接识别服务器响应信息当在测试SQL注入漏洞时,发送给目«Web服务器一些非法或者意外的字符后,需要根据服务器返回的信息来判断是否存在SQL注入漏洞或者是SQL注入攻击是否成功执行。这就需要识别服务器响应的信息。需要对于页面中的内容进行识别。对于SQL注入页面判断来说,常规的注入,基于错误的页面可以通过判定访问的正常页面与返回的页面进行比较。首先记录正常页面的信息,然后发送非法请求后再次记录返回的页面信息,通过分析出产生错误的页面中数据的不同来确定页面是否有误。如正常页面中网页包含字符"true”,通过,。匚注入测试请求后返回的爆错页面中并不会存在字符“true”,这样就可以通过分析定义关键字“true”来判断测试是否成功。而这其中关键的地方就在于怎样让程序来识别页面内容中的信息。同样在Python中,可以使用HTMLParser模块,使用覆盖handle_data()的方法来解析文本数据。关键代码如图5-5所示:图5-5python解析文本数据在对于一些服务器的返回爆错信息中,可以直接通过识别服务器上的每一个HTTP响应对象中的respose包含的数字“状态码”。对于服务器的httperror,urlopen会产生一个httperror。典型的错误包含“404”(页面无法找到),“403”(禁止请求),和“401”(需验证)。提取Cookie信息使用Python从页面中提取cookies信息,可以使用cookielib模块中的LWPCookieJar(涵数创建一个cookiejar来实现。LWPCookieJar(涵数可以返回一个从硬盘加载和存储的Cookie的对象。然后使用urllib2模块的build_opener([handler,...])函数创建opener对象来处理cookies。然后使用urlopen(Request)函数来打开HTML文件,HTML文件中的Cookie就会被存放在LWPCookieJar对象中,之后,使用save(filename)函数就获取到Cookie了。利用爬虫技术来对Web目标的链接进行抓取确实不失为一个好方法,但很多时候,由于服务器安全设置或者是防火墙的设置,并不允许同一台服务器的与目标服务器建立大量的连接请求。很多时候网络爬虫的效率和效果并不是很好。核心代码如下图5-6所示:图5-6Python提取Cookie信息SQL注入工具模块实现这里以Mysql数据库为示例。检测流程如下图5-7所示:图5-7SQL注入检测流程存活测试,通过发送数据包GET或POST的方式根据服务器的响应来判断目标Web是否存活。对于网页的稳定性测试,因为只有动态的网页才会有数据的交互,对于纯粹的html页面是没有直接的数据库交互的,所有可以通过多次访问来确定服务器响应的网页的md5值是否完全匹配。也可以直接通过寻找关键字来确定是否是动态网页。通过GET/POST方式请求来发送非法或者意外的数据请求来进行SQL注入攻击检测。数据库指纹识别,通过提交注入参数使得应用服务器返回版本信息,然后通过抓取网页中的内容信息来获取数据库指纹。同时不同的数据库提交的注入参数不同,通过返回的数据版本信息特征码来区分数据库版本。数据库指纹识别核心代码如下图5-8所示:图5-8数据库指纹识别代码SQL注入

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论