自动注入攻击工具的研发.docx
《自动注入攻击工具的研发.docx》由会员分享,可在线阅读,更多相关《自动注入攻击工具的研发.docx(30页珍藏版)》请在冰豆网上搜索。
自动注入攻击工具的研发
第1章绪论
项目背景及意义
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注入攻击扫描与检测工具的研究与开发具,具有非常重要的现实意义。
应用程序开发者或网站管理人员使用此工具对自已的网站进行安全检测,以达到减小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,deflate
Proxy-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,deflate
Connection:
Keep-Alive
Content-Length:
40
Content-Type:
application/x-www-form-urlencoded
content=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,deflate
Connection:
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'\''atline1
SQL语句:
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注入错误的过程中发生了以下事件:
1.用户端发送请求数据,尝试触发SQL注入漏洞。
假设用户发送了一个带单引号的值。
2.WEB服务器接收到用户端的请求数据,并向数据库服务器发送SQL查询。
本例中,在WEB服务器执行的SQL语句中包含了用户输入参数并且构造了一条SQL查询,该查询因末尾存在单引号而导致语法错误。
3.数据库服务器接收执行了格式不正确的SQL查询,并向WEB服务器返回一条错误消息。
4.WEB服务器接收到的来自数据库的错误向用户发送HTML响应。
下面列举常见的SQL错误。
1)SQLServer错误
在请求中插入一个单引号在参数中会产生数据库错误。
对于SQLServer中,远程应用返回类似于下列内容的错误,图2-7所示:
图2-7SQLServer错误
通过上面的例子,我们可以确定运行在数据库上的远程SQL语句与下面的内容相似:
SELECT*
FROMNews
WHEREArticleID='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日,一个叫TinKode[4]的黑客在着名的安全邮件列表FullDisclosure上公布了他入侵的细节。
这次入侵事件,就是因为一个SQL盲注漏洞引起的。
据黑客公布描述,当时这个漏洞是出现在下面这个页面,如图2-8:
图2-8漏洞页面
可以看到网址URL:
id=1170,通过修改参数id后的数值,服务器将返回不同的查询的客户信息。
这个漏洞中,id=这个参数链接就是一个很隐蔽的“SQL盲注”漏洞,攻击者通过精心构造id参数的URL,就可以进行SQL注入攻击。
利用通常的SQL语句比如“and1=2”在此链接下是无法看出异常的,因为应用服务器不会返回任何异常的数据。
在这里,TinKode[4]利用“SQL盲注”的一个技巧:
TimingAttack,用来确认漏洞是否存在。
在MYSQL数据库中,有个函数:
BENCHMARK(),可以用来测试函数性能。
同时它含有两个参数:
BENCHMARK(count,expr)
函数执行的结果,是将表达式expr执行count次。
比如:
mysql>SELECTBENCHMARK(1000000,ENCODE('hello','dllk));
+-------------------------------------------------------------------------------------+
|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写如websehll
TimingAttack是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带子查询占位符的拆分字