1SQL自动注入攻击工具框架的研究与实现张建平(1)李洪敏(1)黄晓芳(2)卢敏(1)(1)中国工程物理研究院总体工程研究所(四川绵阳919信箱428分箱621900)(2)西南科技大学计算机学院摘要:针对SQL注入攻击极强的破坏性和隐蔽性及目前SQL注入攻击检测手段单一化,不能做网站全面自动分析的弱点,研究SQL注入攻击的关键技术,并在此基础之上,构建SQL注入的自动化检测及攻击利用框架。关键词:SQL注入攻击;二阶SQL注入;自动检测中图分类号:TP393文献标识码:ATheResearchandImplementofAFrameworktoDetectSQLInjectionAttackAutomaticallyZhanjianping1Lihongmin1Huangxiaofang2Lumin1(1.InstituteofSystemEngineering,CAEP,Mianyang621900,China;2.ComputerCollege,SWUST,Mianyang621010,China)Abstract:AimingattheextremelystrongdestructiveandconcealmentfromtheSQLinjectionattackandtheweaknessoftheexiguousdetectionmeansforitsinabilitytocomprehensivelyandautomaticallyanalyzetheweaknessofwebsites,thispaperproposesamethodtoautomaticallydetecttheSQLinjectionattackbasedonstudyingonthekeytechnologyofSQLinjection.Keywords:SQLInjectionAttack,Second-orderSQLInjection,Automaticallydetection1.引言随着Web应用的发展越来越成熟,应用的各项技术发展得也越来越复杂。它们涵盖了从外部动态展示和内部工作网到以WEB协议方式传递数据的多种应用(如文档管理系统等)。这些系统的实用性及其存储数据、处理内容的机密性和敏感性都很高。据OWASP[1](开放式web应用程序安全项目)每隔三年更新一次的“十大安全隐患列表”,在近几次公布的总结Web应用程序最可能、最常见、最危险的十大安全隐患中,SQL注入攻击一直排列靠前。SQL注入攻击是一种非常有效且破坏性很大的渗透手段,通过利用数据库的外部接口把恶意代码插入到SQL语言中使数据库服务器解析并执行,以达到入侵目标数据库及至整个操作系统的目的。由于SQL注入是从正常的Web平台入口进行请求访问,和请求正常的Web页面没有什么区别,所以目前市面上除了专门的Web防御防火墙外,大部分防火墙都不会对这类SQL注入攻击进行监控和发出警报,若网站管理员没有经常查看IIS日志的经验和习惯,有可能被入侵很长一段时间后都没有任何发觉。因此,本文针对目前SQL注入攻击检测手段单一化,不能做网站全面自动分析的弱点,主要研究SQL注入攻击的关键技术,在此基础之上,构建SQL注入的自动化检测及攻击利用框架。22.SQL注入攻击技术研究为了防止SQL注入攻击,通常会在web应用的代码层中或通过第三方的外部实现,如Web应用防火墙(WAF)或入侵防御系统(IPS)中采用关键字过滤的方式,如select|delete|update|count|等;以及代码层级别的过滤器,使用的方法包括编码、消除敏感字符等等各种方法,用来过滤掉畸形的数据串。但是,目前对这种过滤机制也有相应的SQL注入攻击技术绕过该机制,常见方法有:大小写变换、使用编码的方式、构造畸形数据包的方式、使用空字节绕过过滤机制、构造超长数据包的方式等[2]。常见的SQL注入在单个HTTP请求和响应中的流程如下所示:(1)攻击者HTTP请求中插入了精心构造的参数;(2)应用服务器处理输入的参数,参数经过了拼接导致SQL查询被执行;(3)应用服务器有可能会对攻击者请求的参数返回输出结果。而二阶SQL注入攻击是另外一种高级攻击手法,该方法攻击过程如下所示:(1)攻击者HTTP请求中插入了精心构造的参数;(2)应用服务器存储该输入的参数准备处理;(3)攻击者进行第二次HTTP请求,同时插入了精心构造的参数;(4)应用服务器将处理第二次请求,应用服务器将会检索已存储的参数并处理,因此导致了SQL查询被执行;(5)应用服务器有可能会对第二次请求的参数响应返回输出结果。二阶SQL注入属于一种更细微的漏洞,通常更难被检查到[3]。下面举例说明,假设一个通讯簿的应用,在应用系统中,用户可以保存朋友的联系信息。用户在创建一个联系人时,用户可以输入姓名、Email和地址等信息。应用系统使用INSERT语句为该联系人创建新的数据库记录,并将输入中的引号双重编码以防止SQL注入攻击。流程图如图1所示:图1通讯簿的添加记录流程图而当用户修改已存在的联系人时,应用系统将会先使用SELECT检索该联系人的信息,并保存到内存中;然后使用用户提供的新信息更新相关数据,并在此对该输入中的引号进行重新编码,而用户没有更新的数据项将在内存中将保持不变;最后使用UPDATE语句将内存中的数据回写到数据中。这个过程的流程图如图2所示如下:3图2通讯薄应用更新数据流程图假设上例中引号双重编码可以有效的防止常规的SQL注入。但是,这样的情况下应用系统仍然易受到二阶SQL注入攻击。若攻击者想利用该漏洞,首先需要使用某个字段中的攻击payload创建一个联系人。现假设数据库系统是MicrosoftSQLServer,使用下列语句创建一个联系人;a'+@version+'a输入中的引号被双重编码,最终INSERT语句会如下所示:INSERTINTOwebContactsVALUES('a''+@@version+''a','test@test.org',...)联系人的姓名安全的保存到数据库中了。接下来更新创建联系人,只需要提供一个新值即可。应用首先检索已存在联系人的信息:SELECT*RROMwebUserswherecontactid=123检索出来的信息保存在内存中。应用系统使用新提供的数据值替换内存中的值,并将引号双重编码。然后执行UPDATE语句,将信息保存到数据库中:UPDATEwebUsersSETname='a'+@@version+'a',address='mianyangtest',...WHEREcontactid=123到上面这个语句后,攻击以成功执行并修改了应用的查询。当查看更新过的联系人的细节信息时,显示出来的是:Name:aMicrosoftSQLServer....Copyright(c)....(Build2600:)aAddress:mianyangtest通讯薄应用系统成功的执行了攻击者构造的SQL语句,这就证明该应用存在SQL注入攻击漏洞,并且可被攻击利用。3.自动注入攻击工具框架设计3.1设计思路本文根据SQL注入漏洞的利用过程,构建SQL注入的自动化检测及注入攻击利用框架,能够自动扫描识别两种以上类型的SQL注入攻击;能够利用SQL注入漏洞,进行数据库攻击,如猜测帐号、口令等;至少具有对四种类型的数据库进行进行攻击检测,能够对数据库的结构信息进行猜解,能对数据库进行数据操作;能够利用SQL注入执行系统命令,能对有一定权限的目标进行文件操作和提权操作;能一定程度上自定义注入攻击以绕过简单防注入机制。43.2自动注入攻击工具框架总体设计本系统分为三个主体部分:自动抓取目标Web网站链接;检测是否存在SQL注入漏洞;进行SQL注入攻击。自动注入攻击工具框架总体架构图如图3所示:图3自动注入攻击工具框架总体架构图3.3关键技术需要识别Web应用程序是否具有SQL注入漏洞,首先必须得要找出目标Web应用程序的网站链接,并且识别该链接是否为可控制输入数据。只有有了这个基础,才有可能是产生可控的数据交互。3.3.1遍历链接然后通过遍历发送HTTP请求以及特殊数据来触发和进一步验证,通过服务器处理发送的数据所产生的反应来一步步的判断SQL注入。对于识别和抓取目标Web系统的链接,设计有两条思路,一为通过Web爬虫实现对于Web系统进行链接爬行和抓取,然后判断是否存在SQL注入;一为通过搜索引擎收录的目标Web链接,将之抓取过来进行注入分析。若想对于目标进行链接爬取,首先需要解析URL,通过Python的urlparse模块可以很轻松的分解URL并重新组装。当解析了URL链接后,更重要的是分析页面的内容,因为页面中的内容有可能还包含着该Web网站的其他链接,这样通过一层层的爬取,就能将Web站点中的页面基本爬取完毕。当解析了URL链接后,更重要的是分析页面的内容,因为页面中的内容有可能还包含着该Web网站的其他链接,这样通过一层层的爬取,就能将Web站点中的页面基本爬取完毕。5首先,定义一个HTMLParser的新的类,使用覆盖handle_starttag()的方法来显示所有链接中的href标签属性,然后创建好一个实例用来返回HTMLParser的对象,这样,就可以使用urllib.urlopen(url)打开并读取HTML文档中的内容了。对于HTML文件中包含的链接内容,可以使用read()函数读取将数据传递给HTMLParser对象,HTMLParser的feed函数可以接收到数据,这样就可以抓取到页面内的链接了。利用爬虫技术来对Web目标的链接进行抓取确实不失为一个好方法,但很多时候,由于服务器安全设置或者是防火墙的设置,并不允许同一台服务器的与目标服务器建立大量的连接请求。很多时候网络爬虫的效率和效果并不是很好。这时就可以利用搜索引擎搜索的关键字来定位与目标相关的Web链接,然后直接将抓取的链接进行SQL注入检测。3.3.2提取Cookie信息虽然利用爬虫技术来对Web目标的链接进行抓取确实不失为一个好方法,但很多时候,由于服务器安全设置或者是防火墙的设置,并不允许同一台服务器的与目标服务器建立大量的连接请求。同时,很多时候网络爬虫的效率和效果并不是很好,因此本项目还采用从页面中提取cookies信息的方法,可以使用cookielib模块中的LWPCookieJar()函数创建一个cookiejar来实现。LWPCookieJar()函数可以返回一个从硬盘加载和存储的Cookie的对象。然后使用urllib2模块的build_opener([handler,...])函数创建opener对象来处理cookies。然后使用urlopen(Request)函数来打开HTML文件,HTML文件中的Cookie就会被存放在LWPCookieJar对象中,之后,使用save(filename)函数就获取到Cookie了。3.3.3SQL注入检测过程以Mysql数据库为示例,检测流程如图4所示:图4SQL注入检测流程存活测试,通过发送数据包GET或POST的方式根据服务器的响应来判断目标Web是否存活。对于网页的稳定性测试,因为只有动态的网页才会有数据的交互,对于纯粹的html页面是没有直接的数据库交互的,所有可以通过多次访问来确定服务器响应的网页的md5值是否完全匹配。也可以直接通过寻找关键字来确定是否是动态网页。通过GET/POST方式请求来发送非法或者意外的数据请求来进行SQL注入攻击检测。其中,SQL注入攻击模块,使用Python的urllib,urllib2,cookielib库的模块发送GET/POST请求对于注入功能语句进行遍历访问。如下图5为POST请求发送数据代码示例:6图5POST请求发送数据示例3.4实现及测试效果在输入有SQL注入的URL页面,如图6所示:图6输入具有SQL注入的页面在基本设置里可以先点击选择参数,参数控制界面如下图7所示,可以选择列举出数据库类型、操作系统、