基于sqlmap的被动SQL注入扫描技术研究与实现
2016-11-14李啸胡勇
李啸,胡勇
(四川大学电子信息学院,成都610065)
基于sqlmap的被动SQL注入扫描技术研究与实现
李啸,胡勇
(四川大学电子信息学院,成都610065)
在分析被动式SQL注入扫描的特点及优势的基础上,设计一种基于sqlmap实现的代理服务器式被动扫描方案。该方案能够捕获用户浏览器发出的正常请求数据包,并自动对用户提交的参数进行注入检测。方案除了能够扫描用户请求中GET、POST、COOKIE方式显性传输的参数之外,还能够提取用户数据包中的JSON、XML、伪静态URL中的隐性参数进行提取并检测,能够完成更深度的注入扫描。
SQL注入;sqlmap;被动扫描
0 引言
随着Web程序的广泛应用,Web安全需求变得日趋增大。在Web十大安全威胁中,SQL注入威胁依然占有非常高的地位[1]。通常SQL注入的扫描有两种方式,分为主动扫描[2]和被动扫描[3]。主动扫描通常利用爬虫程序爬取网站的每个页面,之后调用扫描程序对每个页面提交的参数进行SQL注入扫描,主流的扫描工具有AWVS、IBM的AppScan等。这种扫描方法优点是快速,缺点是难以应对目前复杂的客户端与服务器交互的环境,即扫描覆盖面窄,许多扫描工作仍然需要在扫描过后由人工手动扫描验证,特别是在扫描目标数量多的情况下,人员的工作量非常巨大。被动扫描的方式通常利用代理服务器监听客户端请求,解析客户端发送的请求数据包的结构,对数据包中的参数自动进行SQL注入扫描,实现这种类型扫描的工具主要有Gourdscan、SQLi-Hunter、burpsuite的sqli插件等[4]。这种方法优点是能够使得客户端浏览网页和扫描能够同时进行,及时捕获客户端请求,免去了测试人员重复提交数据包检测的环节,减少了人员工作量。本文利用代理服务器和sqlmap实现了SQL注入的被动扫描,不但能够针对常规的GET,POST,COOKIE,和http-header这类参数的SQL注入扫描,还能够识别并提取客户端提交的数据包中的JSON,XML,伪静态URL,对此类数据进行深度扫描。
1 SQL注入概述
SQL语言是 Access、MySQL、SQL Server、Oracle、IBM-DB2等数据库的操作语言。通过构造SQL语句能够对数据库进行查询、插入、删除、修改等操作,对于权限大的数据库,SQL语句还能够用来执行系统命令。在例如asp、php、aspx、jsp等编写的网页程序中,通常会将用户提交的参数与SQL语句结合实现对数据库的操作,并将结果呈现给当前操作的用户。这在方便用户的同时,也造成了潜在的安全风险。以php语言处理为例,假设有如下代码完成一个后台管理员的登录验证过程:
$username=$_POST[‘username'];
$password=$_POST[‘password'];
$sql=”select*from admin where username='”.$username.”'and password='”.$password.”'”;
$con->exec($sql);
上述代码可以看到,程序接收了用户以POST方式提交给服务器的参数“username”和“password”,程序未验证字符串的合法性便直接把它们的值代入SQL语句中处理。假如传入的“username”的值为“admin'or‘1' ='1'/*”,“password”任意提交,那么代入$sql字符串变量后,$sql变成了 “select*from admin where username='admin'or‘1'='1'/*and password=任意”。“/*”是SQL语句的注释符号,相当于数据库执行了“select *from admin where username='admin'or‘1'='1'”操作,导致where后的语句为真,整条语句查询到了结果,绕过了用户名和口令正确性验证。
由上述例子我们可以总结出,SQL注入是由于程序对用户提交参数进行严格过滤,从而直接将恶意参数代入到SQL语句中,执行恶意查询的过程。
SQL注入按照参数提交方式可以分为GET注入、POST注入、COOKIE注入、http-header注入四种形式。当前主流的SQL注入测试工具为sqlmap[5],该工具不仅能够实现对上述四种注入方式的常规参数扫描检测,而且能够对HTTP数据包中用户自定义标记的检测点提交SQL注入扫描,工具漏报率和误报率都非常低。下文将描述基于sqlmap的代理扫描工具设计。
2 基于sqlmap的被动SQL注入扫描工具设计
基于sqlmap被动扫描首先应了解sql注入被动扫描的流程。
相比于传统的网页爬取式的主动sql注入扫描过程,被动扫描的过程需要一个代理服务器被动监听用户正常浏览网页的数据包,通过修改数据包中的参数值并重放数据包的形式达到扫描sql注入漏洞的目的。总流程如图1所示。
图1基于sqlmap的被动扫描过程
图1中客户端请求的URI(统一资源标识符)为“/ a.php?id=1”,其中“id”为提交参数。代理服务器有两个作用,一个是将客户请求原封不动提交给网站服务器,将网站服务器返回的结果再反馈给客户端,即完成正常的代理请求。另一个是将客户请求的数据包提交给sqlmap服务器。sqlmap服务器收到代理服务器提交的数据包后,开始解析http数据包,并进行sql注入扫描。
在实际过程中,可以将浏览网页客户端、代理服务器、sqlmap服务器部署在同一台主机上。
(1)sqlmap服务器
sqlmap服务器是指sqlmap自身可以通过监听端口,接受用户HTTP访问的形式建立服务器程序。sqlmap服务器专门供用户调用自身提供的API[6],通过API来创建和执行扫描任务。在sqlmap文件包中,存在sqlmapapi.py文件,只需执行“sqlmap.py-s”即可创建sqlmap的API监听服务,该服务监听端口是8775。这样即搭建起了sqlmap服务器。通过HTTP的方式访问sqlmap所在的服务器IP和端口,即可返回数据。sqlmap的API接收以下几种指令,如表1所示。
表1 sqlmap API接收指令列表
如果在本机开启了sqlmap服务器并需要开始一个新的任务,则需要以HTTP方式请求“http://127.0.0.1:8775/task/new”,sqlmap服务器即创建了一个新的任务,并返回一个任务ID给浏览器。其他操作也同上述操作类似。
(2)代理服务器
前文叙述了代理服务器主要有两个作用,一是正常代理用户请求,另一个是向sqlmap服务器提交用户请求的HTTP数据包。然而,在完成这两项功能的同时,代理服务器还需要实时向用户提供可视化的操作界面,用来查看扫描进度,提前结束扫描过程等。因此,综合三项功能的代理服务器功能结构示意图如图2所示。
图2代理服务器功能结构图
图2中代理服务器有三个模块。接收数据/转发模块、与sqlmap API交互模块、可视化界面模块。
①接收数据/转发模块
接收数据/转发模块首先要接收用户向网页服务器提交的数据,然后提取HTTP请求部分的数据。之后分成两个部分,一是作为中继代理,继续向服务器做出请求。二是将解析的HTTP请求数据提交给sqlmap API模块。
②与sqlmap API交互模块
该模块负责接收转发模块提交的数据包,同时可以接收用户指令,并向sqlmap的API发送任务指令和用户浏览器请求数据包,实时操作sqlmap的扫描。在向API发送用户浏览器请求数据包时,需要搞清用户用户数据包中的参数是以哪种方式提交的,从而判断sqlmap是否能够直接扫描。
●GET方式提交
GET型http请求数据包一般形式如下
GET/index.php?id=1 HTTP 1.1
user-agent:mozillia(Internet Explorer 8)
……
这种形式。这种方式传入的参数为“?”之后的字符串,本例中为“id”。这种格式的数据包可整个发送给API,sqlmap能够自动识别其中参数并扫描。
一个是肥料生产企业,积极拥抱互联网和终端市场;一个是互联网服务平台,积极与厂家、农民实现上下游的衔接和对农民的技术指导与服务,使得产品、技术、服务进行有效结合,形成合力。这种合作模式,在我国当下的农村市场中极具生命力和活力。正如高祥照所言:“服务是农资行业永恒的主题。只不过随着农业新形势的发展,服务的内容和方式在发生变化。重新构架服务模式需要整个行业付出实践和努力。”
●COOKIE方式提交
用户浏览器客户端发出的请求通常会带有COOKIE。在HTTP数据包中的格式通常如下。
GET/index.php HTTP1.1
……
cookie:a=1&b=2
上例中COOKIE包含了两个参数——“a”和“b”。这种数据包整个传递给API,sqlmap也可以自动扫描COOKIE中的参数。
●POST方式提交
POST数据通常是用户填写表单等操作提交的数据。鉴于POST提交的复杂性,可分为三种,一般形式,JSON(一种轻量级的数据交换格式)形式,XML形式。一般的HTTP数据包的POST数据格式如下。
……
a=1&b=2
上例中POST数据有“a”和“b”两个参数及其数值。这种数据包直接提交给API自动扫描。
下面的例子是一个POST方式传递JSON的案例。
POST/index.php
……
j=[{b:1,c:2}]
本例中,POST数据包提交了参数“j”,但是j的值却是一个JSON格式的字符串。参数j传入服务器之后,服务器对j的值(JSON)解析,就解析出两个参数,b=1,c=2,再对b,c两个参数进行处理,跟原来的参数j并没有太大关系。这种JSON格式的数据包直接传入API之后,sqlmap并不会对JSON进行解析和扫描,而是只扫描参数j的值,不能达到检测效果。因此,API交互模块需要对JSON数据进行解析,并对解析后的参数值做sqlmap能够识别的监测点标记,标记后重新组成JSON数据,将标记过的数据包提交给sqlmap的API。
同样的,POST数据类型中含有XML格式的,也须将XMLl解析,将参数值做出标记后,然后将标记过的数据包传递给API。
在有些情况下,服务器会使用伪静态URL。例如某URL为“http://xxx.com/1-1.html”,看似是请求了html文件,但是服务器后台程序很可能将URL中的字符串“1-1”取出,作为参数传入SQL查询语句中。因此,需要利用正则表达式对URL中特定位置的字符串做出标记,提交API进行扫描检测。
③可视化界面
可视化界面利用HTML和JavaScript实现,后台调用php和MySQL程序处理用户操作。用户能够看到界面中直观的扫描数据,并向sqlmap API交互模块提交用户的操作指令。
(3)用户浏览网页
用户浏览器通常可以设置代理服务器。用户浏览器将代理服务器设置为图1中的代理服务器的IP地址和端口,即可与代理服务器进行连接。连接之后只要用户正常浏览网页中的各类页面,系统随即利用sqlmap对用户浏览提交的数据进行SQL注入扫描。
3 实验结果
为了检测本文实现的工具的扫描效果,本文的扫描工具与常用的被动SQL注入扫描工具进行了对比,分别检测了20个存在不同类型注入漏洞网站页面,其中有5个GET注入漏洞,3个COOKIE注入漏洞,6个POST注入漏洞,3个JSON/XML注入漏洞,5个伪静态URL注入漏洞。表2展示了本文设计的工具扫描结果和其他工具扫描结果对比。
表2 工具扫描结果对比
通过对比实验发现,文中的工具不但可以完整检测出常规的GET、POST、COOKIE注入漏洞,而且可以弥补现有工具的缺陷,完成更深层次的SQL注入扫描。
4 结语
随着SQL注入扫描的难度不断增加,注入点和注入方式变得更加隐秘,传统的主动扫描工具愈加难以发现SQL注入漏洞,因此,需要更精确的SQL注入扫描工具完成自动化测试。本文基于sqlmap的API调用与代理服务器结合的方式实现了SQL注入被动扫描工具,能够较好地检测出Web页面中的SQL注入漏洞。但是,检测过程中依然有一部分漏报,可见用户提交的数据包形式是复杂多样的,加上服务器安全防御程序的干扰,使得SQL注入检测环境非常复杂。因此,下一步工作是要广泛搜集数据包样本和WAF绕过策略,从而更广泛地获取用户提交参数特征,做更深入的扫描。
[1]OWASP T.Top 10-2013[J].The Ten Most Critical Web Application Security Risks,2013.
[2]尹虹.Web应用程序漏洞主动扫描器的研究与实现[D].国防科技大学,2005.
[3]邪恶十六进制.关于被动式扫描的碎碎念[EB/OL].http://www.evil0x.com/posts/12728.html?utm_source=tuicool&utm_medium=referral.
[4]陆由乙.sqli-proxy代理式SQLi注入检测脚本[EB/OL].http://www.secye.com/news/ruanjiangengxinzixun/8415.html.
[5]Qi,W.A.N.G.,B.A.I.Miao.Research about User the Tool of SqlMap GET Injection and Principle Analysising on Linux Platform,2013:022.
[6]owasp.Automated Audit using SQLMap[EB/OL].https://www.owasp.org/index.php/Automated_Audit_using_SQLMap.
SQL Injection;sqlmap;Passive Scan
Research and Implement of Passive Scan of SQL Injection Based on sqlmap
LI Xiao,HU Yong
(College of Electronic Information,Sichuan University,Chengdu 610065)
By analyzing the features and advantages of passive scan on SQL injection,puts forward a passive scan program,which based on sqlmap while using a proxy server.The program is able to catch the normal request data packet sent by user agent,extract parameters from those packets and automatically test against each parameter for SQL injection.Besides extracting and testing SQL injection against those parameters which are apparent in GET/POST/COOKIE strings,the program can also extract parameters which are not apparent in the packet such as JSON/XMO and rewrite URL and test against them,which can scan SQL injection more deeply than others.
1007-1423(2016)28-0038-05
10.3969/j.issn.1007-1423.2016.28.011
李啸(1990-),男,甘肃白银人,硕士,研究方向为信息安全胡勇(1973-),男,四川成都人,副教授,研究方向为信息安全
2016-08-09
2016-09-26