自动注入攻击工具的研发.docx

上传人:牧羊曲112 文档编号:1715817 上传时间:2022-12-15 格式:DOCX 页数:57 大小:2.54MB
返回 下载 相关 举报
自动注入攻击工具的研发.docx_第1页
第1页 / 共57页
自动注入攻击工具的研发.docx_第2页
第2页 / 共57页
自动注入攻击工具的研发.docx_第3页
第3页 / 共57页
自动注入攻击工具的研发.docx_第4页
第4页 / 共57页
自动注入攻击工具的研发.docx_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《自动注入攻击工具的研发.docx》由会员分享,可在线阅读,更多相关《自动注入攻击工具的研发.docx(57页珍藏版)》请在三一办公上搜索。

1、西南科技大学本科生毕业论文第1章 绪论1.1 项目背景及意义SQL注入攻击是一种非常有效且破坏性很大的渗透手段。它是针对于数据库的一种攻击手段,通过利用数据库的外部接口把恶意代码插入到SQL语言中使数据库服务器解析并执行,以达到入侵目标数据库及至整个操作系统的目的。了解和熟悉SQL注入原理,掌握防御SQL注入攻击的原理和技巧就变得至关重要。SQL注入攻击的普遍性、难捉摸性、简易性等特点让其成为了网络中黑客主流攻击方式之一。因为SQL注入是从正常的Web平台入口进行请求访问,和请求正常的Web页面没有什么区别,所以目前市面上除了专门的Web防御防火墙外,大部分防火墙都不会对这类SQL注入攻击进行

2、监控和发出警报,若网站管理员没有经常查看IIS日志的经验和习惯,有可能被入侵很长一段时间后都没有任何发觉。由于现在广泛流行的恶意攻击工具,SQL注入在近年来呈现一种增长的趋势。据OWASP(开放式web应用程序安全项目)每隔三年更新一次的“十大安全隐患列表”,在近几次公布的总结Web应用程序最可能、最常见、最危险的十大安全隐患中,SQL注入攻击一直排列靠前。OWASP TOP 10 2010中列出的最严重的Web应用程序的漏洞中,注入(Injection)风险位居第一。Web应用的发展越来越成熟,应用的各项技术发展得也越来越复杂。它们涵盖了从外部动态展示INTERNET和内部工作网络到以WEB

3、协议方式传递数据的企业工作应用(如文档管理系统等)。这些系统的实用性及其数据存储、处理内容的机密性和敏感性对于企业的主要业务而言都非常重要。当前市面的注入攻击检测工具只能对单个网页或者单个URL进行检测和注入,无法对整个网站的漏洞进行检测。而漏洞扫描工具可以对整个网站漏洞进行扫描却无法进行进一步的注入攻击检测。很大程度上不能满足开发人员和管理人员对网站SQL注入漏洞全面了解的要求。本研究的最终目的是分析SQL注入攻击的类型、关键技术和原理,并研究SQL注入在实际应用中的操作方法,在此基础之上,设计并开发了一套自动注入工具。因为恶意攻击者不仅可以通过SQL注入攻击对Web应用数据进行盗取、篡改信

4、息,还可以进一步对于服务器进行恶意操作,并且植入木马或者后门程序,甚至控制整个服务器,这就严重影响了应用的正常运行以及对于应用的信息安全带来严重后果。所以,对于功能齐备的SQL注入攻击扫描与检测工具的研究与开发具,具有非常重要的现实意义。应用程序开发者或网站管理人员使用此工具对自已的网站进行安全检测,以达到减小SQL注入的可能性。同时,在渗透测试工作中,对于安全测试也具有很大的帮助。1.2 研究内容1.2.1 自动注入攻击工具的研发本研究首先理解Web应用的工作原理,首先简要概述Web应用系统通用的架构模式,理解了构建模式后能更清晰的了解SQL注入的产生过程,然后从Web应用的代码层来分析介绍

5、是什么引起了通用的SQL注入,然后研究介绍SQL注入漏洞的利用过程。从框架到利用逐步分析SQL注入的过程和利用,然后根据分析的内容构建SQL注入的自动化检测及注入攻击利用框架。1.2.2 SQL注入原理SQL注入的原理,是将SQL代码插入或者非正常时添加到应用的参数当中,并且进行了一定的拼接传入到了后台的数据库服务器,最终使服务器执行了该拼接的恶意SQL命令。所有的是通过SQL语句执行的应用过程均存在被攻击的威胁,因为SQL的多样多变性语言结构特征使得攻击者可以拼接构建丰富的代码编码手段等来拼接语句来欺骗服务器。SQL注入攻击的主要方式就是直接将命令插入到应用服务的表单参数中传入到后台数据库查

6、询字符串中,这些参数就会被带入到后台数据库服务器进行执行解析,攻击者便可以构造恶意命令来达到攻击目的。1.2.3 SQL注入检测技术检测发现SQL注入漏洞有一条简单的规则:SQL注入是通过发送特殊数据来触发异常操作。该规则包括如下含义:l 检测Web应用上所有的输入数据;l 集合SQL语法,归类所有可能触发异常的数据类型;l 检测数据库服务器应用响应中的异常。首先需要清楚Web浏览器向Web服务器发送请求的过程。不同的服务应用会有不同的体现方式,它们均处在基于Web的环境中,所以基本原理是相同的。识别和检测应用接受的所有数据,攻击一般都会修改这些数据,所以需要识别并分析服务器对它们的响应。有时

7、响应中会直接包含来自数据库的SQL错误,有时需要不断的方式来检测和确定响应中细微的差别。1.3 章节安排本论文章节安排如下:第一章 绪论:综述此研究设计的背景意义以及研究内容。第二章 SQL注入技术研究:主要对SQL注入攻击方式过程和攻击特点进行归类、识别,首先理解Web应用的工作原理,概述Web应用通用的构建方式,为理解SQL注入的产生过程提供一些背景知识,接下来从Web应用的代码层介绍引发SQL注入的因素以及哪些开发实践和行为会引发SQL注入。分析SQL注入过程和利用,并架构如何将SQL注入的发现过程自动化以提高检测简单SQL注入的框架。第三章 SQL注入攻击技术研究:根据SQL注入技术,

8、研究利用数据库中的功能来攻击系统端口的技术。数数据库大多均带有丰富的数据库编程功能,可以利用SQL注入漏洞来访问文件系统以执行有效的任务,可以在基础操作上执行各种命令,扩大范围攻击的利用技术细节。当发现SQL注入漏洞以及初步的利用获取数据后,可以利用SQL注入漏洞来访问文件系统来扩大渗透范围。还可以在操作系统上执行各种命令,攻击可以使用它们扩展数据库的可达区域并在更大的范围内发动攻击。第四章 注入高级技巧研究:Web应用通常会使用过滤应用,设计这些过滤的目的就是防御SQL注入在内的常见攻击。这些过滤方式可以是位于web应用的代码层中,也可以通过第三方的外部实现,如Web应用防火墙(WAF)或入

9、侵防御系统(IPS)。当注入攻击碰到这些防御应用,若想进一步利用漏洞,则需要寻找一种能避开过滤器防护的高级方法以便恶意输入传递给易受攻击的代码。第五章 自动注入工具框架设计:根据项目的设计需求,以及Python编程语言的特点,对自动注入攻击工具整体框架进行分析和设计。并且分析功能模块中的重点和关键技术。第六章 SQL注入测试:自动注入攻击实例测试。第2章 SQL注入技术2.1 Web应用工作原理和架构简析不论是用何种脚本语言开发的Web应用,都有一个共同点:具有交互性并且大多是数据库驱动的。基于数据库驱动的Web应用一般都包含三层:a presentation tier(表示层,Web浏览器或

10、呈现引擎)、a logic tier(逻辑层,如C#、ASP、.NET、PHP、JSP等编程语言)和a storage tier(存储层,如Microsoft SQL Server、MySQL、Oracle等数据库)。Web浏览器(表示层,如Internet Explorer、Safari、Firefox等)向中间层(逻辑层)发送请求,中间层通过查询、解析数据库(存储层)来响应该请求。图2-1 简单的三层架构 Web三层架构解决方案没有扩展性,研究人员不断地对Web三层架构进行改进优化,在可维护性和可扩展性的基础上建立了一种新概念:n层应用开发模式。其中有一种就是Web四层架构解决方案,该方案

11、在Web服务器和数据库之间使用了一层中间件服务器(通常称为应用服务器)。下图2-2中,Web浏览器(表示层)向中间层(逻辑层)发送请求,后者一次调用由位于应用层的应用服务器所提供的API,应用层通过查询、更新数据库(存储层)来响应该请求。图2-2 四层架构2.2 识别SQL注入SQL注入就是程序员对程序中动态的SQL语句没有作严格的过滤或检测,导致黑客能在注入点提交非法的SQL语句,导致程序和服务器的信息被泄漏。由于SQL注入的入门门槛低,隐蔽性好,破坏性大,杀毒软件无法查杀,是当前最主流的入侵手段。SQL注入攻击的本质,就是服务器将用户传入的数据在数据库中当成了SQL代码执行。这里便有两个关

12、键因素:第一个是用户有权限输入数据;第二个是服务器应用数据执行了用户传入的数据。2.2.1 识别数据输入Web环境是一种C/S(客户端/服务器)架构。客户端使用浏览器向Web服务器发送请求并等待响应。Web服务器接收到请求后,通过查询、解析数据库,将响应发送回客户端。很明显,双方便必须使用一种协议作为双方的约定,这种传输协议就是HTTP。首先,必须识别远程Web应用所接收的所有数据输入。HTTP协议定义了可以发送给服务器的操作方式,这里只关注研究与SQL注入攻击相关的两种方法:GET和POST。GET请求:GET是向服务器发索取数据的一种请求,是一种请求服务器的HTTP方法。使用GET请求时,

13、信息是显示在URL中的。GET请求对用户是透明的,如下例,WEB服务器的GET请求如下所示:GET /general/vote/show/webst/list.php?VOTE_ID=131 HTTP/1.1User-Agent: Opera/9.80 (Windows NT 6.1; U; Edition IBIS; zh-cn) Presto/2.10.229 Version/11.62Host: *Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jp

14、eg, image/gif, image/x-xbitmap, */*;q=0.1Accept-Language: zh-CN,zh;q=0.9,en;q=0.8Accept-Encoding: gzip, deflateCookie: SID_4143=82b90aee; SID_99=bfb67d86; UI_COOKIE=0; LWr7_2132_ulastactivity=85ebvMTfOWVLvxgzzzV4uv0PkMG14SL7yUg9SVBP%2BzMNhDtpaSVL; PHPSESSID=073edfe7894acb322ba1061678e82090; lzstat_u

15、v=10735291292559574567|2879946Proxy-Connection: Keep-Alive该请求中与数据查询相关的参数在URL中,格式如下所示:list.php?VOTE_ID=131上述示例中包含一个参数:VOTE_ID。服务器应用将会把参数值带入数据库中解析执行,然后将响应结果返回给客户端。POST请求:POST请求是作为HTTP消息的实际内容发送给web服务器的HTTP方法。在浏览器中填写表单并点击Submit按钮时通常使用该方法。下面的例子是浏览器发送给远程WEB服务器的内容,请求如下所示:POST /general/vote/show/webst/pl_wr

16、ite.php?ITEM_ID=345 HTTP/1.1User-Agent: Opera/9.80 (Windows NT 6.1; U; Edition IBIS; zh-cn) Presto/2.10.229 Version/11.62Host: *Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1Accept-Language: zh-CN,zh;q=0.9,en;

17、q=0.8Accept-Encoding: gzip, deflateReferer: http:/*Cookie: SID_4143=82b90aee; SID_99=bfb67d86; UI_COOKIE=0; LWr7_2132_ulastactivity=85ebvMTfOWVLvxgzzzV4uv0PkMG14SL7yUg9SVBP%2BzMNhDtpaSVL; PHPSESSID=073edfe7894acb322ba1061678e82090; lzstat_uv=10735291292559574567|2879946Connection: Keep-AliveContent-

18、Length: 40Content-Type: application/x-content=POST+TEST&submit=+%CC%E1+%BD%BB+其他注入数据:除了GET或POST参数传输检索数据外,HTTP请求的其他内容也可能会触发SQL注入漏洞。Cookie就是个很典型的例子。Cookie由服务器发发送到用户端的浏览器,并会在用户端每次请求中都会回发给服务器。Cookie一般被用于辨别用户身份、进行session跟踪而储存在用户本地终端上的数据。由此可见,用户完全可以控制发送给服务器的Cookie内容,所以Cookie也作为一种有效的用户数据输入方式和易受注入影响的对象。如:GE

19、T HTTP/1.1Host: User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:19.0) Gecko/20100101 Firefox/19.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: en-US,en;q=0.5Accept-Encoding: gzip, deflateCookie: _utma=235504861.1045863906.1362721158.1363922147.136417887

20、7.17; _utmz=235504861.1363878397.13.3.utmcsr=|utmccn=(referral)|utmcmd=referral|utmcct=/app/procurement/bids/; s_nr=1364197401953-Repeat; s_vnum=1364799600337%26vn%3D19; s_vi=CSv1|289CC3EC851D1C92-400001326012B18CCE; fsr.r=d:90,i:d046012-55164494-d970-1460-e7619,e:1363330479331; elf_e=hack; elf_s=ab

21、; elf_h=86b9fa33b1b652a3c73ea82f5e6263beConnection: keep-alive该应用系统存在一个cookie注入漏洞,漏洞代码下图2-3,程序代码没有任何过滤就将用户传入的cookie参数带入到数据库中进行执行。用户只要利用抓包工具将传入的数据包截下来修改cookie字段的数据就可以将恶意命令传入到后台数据库进行执行。图2-3 存在漏洞的代码文件2.2.2 操作请求参数下面先通过介绍一个非常简单的例子来熟悉SQL注入漏洞。以我们学校http:/*http:/*List.php页面收到一个名为VOTE_ID的参数。现在开始开始手动修改VOTE_ID参

22、数的值,将其改为意外的数值。按照下列方式进行首次尝试:http:/*上例中使用不存在的类型名向服务器发出请求。服务器返回如下图2-4响应:图2-4 服务器响应结果1该警告是当用户尝试从空结果集中读取记录时,数据库返回的一个MYSQL数据库错误。该错误表明远程应用未能正确处理意外的数据。继续进行推理操作,现在向之前发送的值添加一个单引号(),发送下列请求:http:/*下图2-5是服务器的响应:图2-5 服务器响应结果2服务器返回下列错误:请联系管理员 错误#1064: You have an error in your SQL syntax; check the manual that cor

23、responds to your MySQL server version for the right syntax to use near at line 1SQL语句: SELECT END_DATE from VOTE_TITLE where VOTE_ID=attacker文件:D:/*root/general/vote/show/webst/list.php不难发现,有些应用在处理用户数据时会返意想不到的结果。WEB检测的异常并非都是由SQL注入漏洞引起的,还会受到很多其他因素的影响。这里还可以通过进行另一个测试来识别SQL Server和Oracle中的漏洞。向Web服务发送下面两

24、个请求:http:/*http:/*在MYSQL中,与其等价的请求为:http:/*http:/* 1如果两个请求结果相同,则很可能存在SQL注入漏洞。2.2.3 数据库响应测试SQL注入攻击漏洞时,可能会从WEB服务器收到不同的数据库错误响应,所以对于这些错误的意义需要熟悉和掌握。图2-6展示了产生SQL注入错误的过程和WEB服务器对错误进行处理得过程。图2-6 产生SQL注入错误的过程中的信息流产生SQL注入错误的过程中发生了以下事件:1. 用户端发送请求数据,尝试触发SQL注入漏洞。假设用户发送了一个带单引号的值。2. WEB服务器接收到用户端的请求数据,并向数据库服务器发送SQL查询。

25、本例中,在WEB服务器执行的SQL语句中包含了用户输入参数并且构造了一条SQL查询,该查询因末尾存在单引号而导致语法错误。3. 数据库服务器接收执行了格式不正确的SQL查询,并向WEB服务器返回一条错误消息。4. WEB服务器接收到的来自数据库的错误向用户发送HTML响应。下面列举常见的SQL错误。1) SQL Server错误在请求中插入一个单引号在参数中会产生数据库错误。对于SQL Server中,远程应用返回类似于下列内容的错误,图2-7所示:图2-7 SQL Server错误通过上面的例子,我们可以确定运行在数据库上的远程SQL语句与下面的内容相似:SELECT *FROM NewsW

26、HERE ArticleID=2650该Web应用未检测单引号,所以数据库服务器响应返回了一个错误。2) MYSQL错误下面介绍一下典型的mysql错误。MYSQL可以在很多架构和操作系统下执行,兼容性很好,常见的配置是在装有linux操作系统的apache web服务器上运行php,但它也可以出现在很多其他场合中。下列错误通常表明存在MYSQL注入漏洞:Warning:mysql_fetch_array(1):supplied argument is not a valid MySQL result resource in /var/ on line 92.2.4 自动寻找SQL注入对于SQ

27、L注入工具的开发,如何的适度的自动化SQL注入的请求是其中的关键。识别数据输入是可以自动化的内容,它涉及搜索WEB站点和寻找GET及POST请求。数据注入也可以自动完成,因为上一阶段已经获取了发送请求所需要的所有数据。若想自动寻找SQL注入漏洞,主要问题在于检测远程服务器响应中的异常。对于管理员来说,区别一个错误页面或其他类型的异常页面非常容易;但对于程序来说,要识别出服务器异常输出,有时会非常困难。某些情况下,应用可以很容易地检测到数据库发生了错误,如以下情形下:WEB应用服务器返回由数据库产生的SQL错误;WEB应用服务器返回HTTP500内部服务器无法执行错误;某些SQL盲注情况下。但对

28、于其他情况,应用系统将很难识别存在的漏洞,而且很容易出现遗漏。所以,自动发现SQL注入存在着一定的局限性,自定义的测试和手动测试也显得非常重要。2.3 SQL盲注很多时候,WEB服务器为了安全设置关闭了错误回显,但是这可以阻挡住SQL注入攻击吗?当发现一个SQL注入点,但应用只提供了一个自定义的通用的错误页面;或者虽然提供了正常的页面,但与期望的测试响应存在一些小的差异。基于这种情况下的SQL注入攻击测试,都属于SQL盲注。所谓“盲注”,就是在在注入攻击Web应用时,攻击语句被带入到后台数据库中执行,但是服务器查不会返回错误或者执行结果的回显的情况下进行的注入攻击。服务器没有了攻击者期望的错误

29、回显,对于攻击者来说没有了非常重要的SQL注入攻击“调试信息”,所以攻击者必须找到一个方法来从侧面验证注入的SQL语句是否得到成功执行。2.3.1 注入带判定的参数(Timing Attack) 当已经识别可能存在SQL注入漏洞,但又没有正常的回显的时候,要想进一步确认和检测漏洞,一般可以提交包含副作用的查询参数。比较老的技术是使用timing attack,计时攻击。2011年3月27日,一个叫TinKode4的黑客在著名的安全邮件列表Full Disclosure上公布了他入侵的细节。这次入侵事件,就是因为一个SQL盲注漏洞引起的。据黑客公布描述,当时这个漏洞是出现在下面这个页面,如图2-

30、8:图2-8 漏洞页面可以看到网址URL:index.html?id=1170,通过修改参数id后的数值,服务器将返回不同的查询的客户信息。这个漏洞中,id=这个参数链接就是一个很隐蔽的“SQL盲注”漏洞,攻击者通过精心构造id参数的URL,就可以进行SQL注入攻击。利用通常的SQL语句比如“and 1=2”在此链接下是无法看出异常的,因为应用服务器不会返回任何异常的数据。在这里,TinKode4利用“SQL盲注”的一个技巧:Timing Attack,用来确认漏洞是否存在。在MYSQL数据库中,有个函数:BENCHMARK(),可以用来测试函数性能。同时它含有两个参数:BENCHMARK(c

31、ount,expr)函数执行的结果,是将表达式expr执行count次。比如:mysql SELECT BENCHMARK(1000000,ENCODE(hello,dllk);+-+| BENCHMARK(1000000,ENCODE(hello,dllk) | 0 |+-+1 row in set (4.97 sec)就将ENCODE(hello,dllk)执行了1000000次,共用4.97秒。因此,攻击者就可以利用MYSQL数据库中的这个函数BENCHMARK(),在传入到后台服务器的参数中让同一个SQL函数在数据库中执行若干次,然后通过服务器执行该SQL语句的时间的长短变化,就可以用

32、来侧面判别出SQL注入攻击语句是否已经成功的执行。这个攻击利用技巧在盲注中被称为Timing Attack。在此次的攻击中,攻击者接下来就是利用Timing Attack攻击。比如构造的攻击参数id值如图2-9:图2-9 Timing Attack攻击语句1这段攻击Payload首先进行的是判断库名的第一个字母是否为小写的w,即CHAR(119)。如果判断结果为真,就会执行后面的BENCHMARK()函数,执行该函数就会造成较长的延时;如果判断结果为假,则该攻击语句很快就会被执行完毕,页面将很快得到加载。这样,攻击者就可以通过构造攻击Payload猜解遍历出所有的库名字母,直到将整个数据库名全

33、部猜解完成为止,然后进一步可以猜解遍历出数据表明、列明和数据内容,将可以将整个数据中的内容下载过来。同时,攻击者还可以通过以下Payload获取到更多有用信息,图2-10:图2-10 Timing Attack攻击语句2此外,攻击者可以通过利用Dump File的方法如图图2-11,来写入一个webshell木马:图2-11 DumpFile写如websehllTiming Attack是SQL盲注中的一种高级技巧。在各种不同的数据库中,都有与BENCHMARK()函数类似的东西。如MYSQL:BENCHMARK(1000000,MD(1) or SLEEP(5)PostgreSQL:PG_S

34、LEEP(5) or GENERATE_SERIES(1,1000000)MS SQL Server:WAITFOR DELAY 0:0:5如,在Microsoft SQL Server中,可使用如下SQL代码来产生一个8秒的暂停:WAITFOR DELAY 0:0:8同样,对于MYSQL数据库,攻击者也可以使用SLEEP()函数(该函数适用于MYSQL5.0.12及以后的版本)来进行Timing Attack。同时,攻击者还可以利用应用服务器的回显输出来进行判断。例如,若将注入下面的字符串: AND 1=2插入到一个搜索字段中,将产生与 OR 1=1不同的结果响应。2.3.2 Paramet

35、er Splitting and Balancing技术如果注入带判断的函数不起作用,可以尝试“parameter splitting and balancing”(参数拆分与平衡)技术。拆分是指拆分正常的参数输入,平衡则是指保证最终的查询与正常的输入是一致。其基本思想是:将正常的请求参数进行拆分,然后使用SQL语句关键字对它们进行修改,最终需保证与原数据不同,使得后台数据库服务器解析执行带入的参数时,与正常的参数请求一样的同时也带入了“非法”的请求。例如,在http:/*SELECT review_content,review_author FROM reviews WHERE id=5如果

36、使用2+3替换5,那么输入应用中的参数将不同于原始请求中的输入,但SQL数据执行在结果上是等价相同的:SELECT review_content,review_author FROM reviews WHERE id=2+3这种方式不仅仅只局限于数字值型。假设http:/*SELECT COUNT(id) FROM reviews WHERE review_aouthor = dllk可以使用特定的数据库运算符将dllk字符串拆分,向Web服务应用提供与dllk相对应的不同的参数输入。对于再oracle数据库的利用中,可以使用“|”运算符来链接两个字符串:SELECT COUNT(id) FR

37、OM reviews WHERE review_aouthor = dl|lk它与之前的第一个查询在最终执行的参数是等价的。下表2-1是带子查询占位符的拆分字符串参数:表2-1 带子查询占位符的拆分字符串第3章 SQL注入攻击技术研究3.1 识别数据库要成功进行SQL注入攻击,还有重要的一点就是需要探测出服务器正在使用的数据库系统DBMS。若是攻击者连数据库系统都无从判断,就不可能构造出有效的“恶意”参数来进行SQL注入,也就无法实施攻击。通常WEB架构技术可以使我们猜测验证出数据库系统。例如,ASP和.NET的WEB服务应用通常使用的事Microsoft SQL Server作为数据库系统,

38、而PHP应用则很可能使用MYSQL数据库。如果是用JAVA、JSP等编写的,那么很有可能使用的是Oracle数据库。在识别SQL注入漏洞所存在的数据库中,如果不是SQL盲注,通常情况下可以很快的判断出数据库系统。如果数据库响应返回出SQL注入的错误消息,一般都会在报错的响应中可以找到是何数据库系统的线索。如图3-1 SQL Server错误信息:图3-1 SQL Server错误信息根据报错信息可以很直接的就判断数据库类型为Microsoft SQL Server。这种方法就是添加一个单引号将使得构造的SQL语句参数带入到数据库服务器当作SQL语句来执行,这将产生一条语法错误而暴露出错误信息。

39、如图3-2 SQL Server错误信息:http:/*图3-2 SQL Server错误信息在错误消息中明确提到了“MySQL”,还附加了一些关于出错内容的有用细节。如下表3-1返回各种DBMS所对应的查询:表3-1 返回各种DBMS所对应的查询例如,对于SQL Server 2000 SP4来说,执行SELECTversion查询时,将得到如图3-3所示信息:图3-3 SQL Server 2000服务器返回信息如果应用服务器并不能直接的在响应中返回所想要的数据信息,则需要一种间接的方法来触发获得想要的信息。不同的数据库,在语法查询方式上有略微的不同,不同的数据库系统就会有不同的查询方式。

40、比如一个简单查询如下:SELECT somestring该查询语句对于大多数主流的数据库系统都是有效的,对于不同的数据库系统,将查询的字符串分成两个字串的SQL语句的时候还是存在有细微的差异的,就SQL Server、Mysql、Oracle来说,如下表3-2:表3-2 字符串分成两个字串的SQL语句假设Web应用中没有可以利用的SQL注入字符串参数,则可以使用之前数字参数类似的技术。这样的话就需要一条针对特定情况特定技术的SQL语句,使得在服务器经过执行SQL语句后计算后生成一个数字。在下表3-3所示列举的SQL语句中,在对应的数据库系统上执行对应的SQL语句后都会生成一个整数,而若在其他不

41、同的数据库下执行语句的话,就将会产生错误。表3-3 从数字函数推断DBMS版本3.2 注入语句获取数据UNION语句是数据库管理员经常使用函数之一。使用UNION的SQL语句,可以连接两条或多条SELECT语句的联合查询得到结果。基本语法如下所示:SELECT column-1,column-2,.,column-N FROM table-1UNIONSELECT column-1,column-2,.,column-N FROM table-2执行该查询后,返回结果得到的是由两个SELECT语句返回结果组成的表。通常在默认情况下,得到的返回结果中只会包含不同的数值。如果想在查询的结果中将重复

42、的值也显示出来,只需要稍微修改下语法即可:SELECT column-1,column-2,.,column-N FROM table-1UNION ALLSELECT column-1,column-2,.,column-N FROM table-2在SQL注入测试攻击中,数据库的UNION查询方法对于攻击来说作用很大:如果服务器可以正常返回第一个查询得到的数据,若想修改加入数据库UNION查询,便可以利用读取到攻击者想要读取的该数据库用户,然后就可以访问的其他的任何一张数据表。如,如果想要找到list.asp页面执行的查询的数据表所返回的列数,则可以按下列方式请求URL,直到不再返回错误位

43、置信息:http:/*http:/*http:/*获取列的另一种方法是使用ORDER BY语句,ORDER BY语句并不是通过注入另一个查询语句来获得查询结果。通过增大ORDER BY 子语句中代表列的数字就可以来识别查询中的列数,如下所示:http:/*http:/*http:/*.若在以上使用ORDER BY 9查询时收到第一个错误回显,就意味着查询的数据库中包含的数据有8列。当攻击识别出数据库的列数后,接下来就是选择数据中的其中一列或几列来继续攻击查询数据库中的数据了。因此,如果攻击者想提取一个数据库字符串值,就可以通过它来保存正在寻找的数据,以便找到一个字符串类型的列。攻击者可以用NULL来很容易的实现,只需要重复的使用字符串示例替换掉NULL即可。例如,如果原始的数据查询中包含4列数据,则可以做如下尝试获得字符串类型的列:http:/*

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号