范义山
【摘 要】SQL注入漏洞对网站的安全构成严重威胁,然而SQL注入漏洞又具有较高的普遍性。因此查找SQL注入漏洞并了解其入侵方式,及时堵塞网站安全漏洞,是我们网站管理员必须要掌握的。本文以一款SQL注入工具入侵原理入手,讲解了其入侵步骤,并给出了防范措施。
【关键词】SQL注入;入侵;漏洞;防范
0 引言
SQL注入攻击指的是攻击者通过构建特殊的输入作为参数传入Web应用程序(一般通过网页地址栏或留言板等具有提交功能的栏目输入),应用程序接收后错误的将攻击者的输入作为原始SQL查询语句的一部分执行,导致改变了程序原始的SQL查询逻辑,额外的执行了攻击者构造的SQL查询语句。攻击者根据程序返回的结果,获得想得知的某些数据(譬如后台管理账户、密码),进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使信息泄露。
SQL注入攻击是黑客对网站进行攻击、渗透的常用手段,其风险性极高,并且因为SQL注入入侵跟普通的WEB页面访问没什么区别,所以防火墙与杀毒软件对SQL注入是没办法防范的。由于程序员的水平及经验参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,导致存在SQL注入漏洞的网站相当普遍。如何从根本上进行SQL注入防御,降低SQL注入风险具有极其重要的现实意义。
1 啊D注入工具入侵原理
所谓知己知彼,百战百胜。要想有效防御SQL注入攻击,就要了解其攻击原理。本文通过对一款黑客常用注入工具——啊D注入工具工作原理的讲解,来分析SQL注入的防范措施。
啊D注入工具的攻击方法实际上就是逐步测试、逐步猜解,猜解网站数据库中的后台管理员表名、字段名、字段值,进而获取到网站的管理员账号、密码,在其它工具获取网站后台登录地址的前提下,登录网站后台,获取网站控制权,甚至整个服务器的管理权限。
有了这个攻击工具,使得入侵存在SQL注入漏洞的网站成了小儿科的游戏,那些既不懂编程又不懂SQL、年纪小小的青年常常得以在一天之内入侵十多个网站。
2 啊D注入工具攻击步骤
2.1 啊D注入工具入侵的第一步是寻找注入点
怎样才算注入点呢?其实就是一类URL,就是网站的一些链接,在后面人为的添加一些SQL语句、单引号等之后,这些人为添加的语句可以最终被提交到数据库执行,并将结果在浏览器端显示出来,这样的URL就是网站的注入点。黑客通过执行后不同的返回结果,来猜解数据库的表名、字段名、字段值,进而入侵网站。
那么啊D注入工具是怎么寻找注入点的呢?实际上和手工注入一样,就是通过在一些网站链接地址后输入一些非法字符串,根据返回的结果判断网站是否可以进行注入。最常用的就是单引号测试法和1=2测试法。
单引号测试法就是在最后面加上单引号,如果结果返回“microsoft jet database engine 错误80040e14”之类的错误信息,就表示单引号被连接到SQL语句中执行了,就说明在该链接地址后面添加SQL语句可以被提交到数据库执行,就表示该链接地址存在SQL注入漏洞。
1=2测试法就是在网站链接地址后输入1=2,返回的结果如果是:BOF或EOF中有一个是“真”,或者当前的记录已被删除,所需的操作要求一个当前的记录,或者原来正常显示的网页没有显示出来,就表示1=2被连接到SQL语句中执行了,就说明在该链接地址后面添加SQL语句可以被提交到数据库执行,就表示该链接地址存在SQL注入漏洞。
2.2 猜解表名
假如http://localhost/article.aspx?id=124是一个注入点,要用它来猜解表名。怎么提交?
http://localhost/article.aspx?id=124 and exists(select count(*) from admin)
然后看页面返回了,返回正常就表示该表存在,否则就不存在了。啊D工具就是这样猜解的,它的软件数据库里面有很多提前添加好的表名。然后猜解的时候就是挨个试了。
2.3 猜解字段名
有了表名,下一步就是猜解字段了。需要用到这样的语句:http://localhost/article.aspx?id=124 and exists(select username from admin)
也就是将count(*)换成了字段名。将设置列表中的字段挨个进去匹配。页面返回正常就表示字段存在,否则就不存在。
2.4 猜解字段长度
字段有了,下一步就是猜解字段值了,先猜解字段长度。
http://localhost/article.aspx?id=124 and (select top 1 len(username) from admin)>0
http://localhost/article.aspx?id=124 and (select top 1 len(username) from admin)>5
http://localhost/article.aspx?id=124 and (select top 1 len(username) from admin)>6
|直到准确判断出长度为止。其中的len()函数负责计算username中第一条记录的长度。
2.5 猜解字段值
知道了长度,下一步就是准确猜解每一位的值。
and(select top 1 asc(mid(username,1,1))from admin)>97
and(select top 1 asc(mid(username,1,1))from admin)>98
and(select top 1 asc(mid(username,1,1))from admin)>99
and(select top 1 asc(mid(username,1,1))from admin)=100
解析一下这个语句的含义。就是一些函数的使用技巧, asc() 负责查询某个字符的ascii码值,mid(addr,start,len)这个函数负责选取某个字符串中从start开始len位的字符。本语句就是取出字符串的第一个字符了。当然第二个字符:
and(select top 1 asc(mid(username,2,1))from admin)>99就是这样算的了,取出每一位的结果之后,转换为对应的字符就是用户名或者密码了。
这就是为什么猜解表名、字段的时候,都是一条一条的出结果,而猜解字段值的时候,是一个字符一个字符的出结果了。
3 SQL注入攻击的防御办法
知道了黑客入侵的原理,也就知道怎么对应的做好防护了。从阿D注入工具入侵的步骤来看,主要就是通过提交非法SQL语句,根据不同的返回信息来确定猜测的表名、字段名、字段值是否正确,通过不断的穷举,最终猜解到准确的表名、字段名、字段值。所以防御的办法就是阻断猜解过程,一是不让非法SQL语句提交、执行,二是不让出错信息在浏览器端显示出来。下面详细叙述:
1)对用户在地址栏的输入、传入的Request函数等进行校验,通过正则表达式,对单引号、SQL语句等进行判断和过滤,阻止非法SQL语句的执行,防止SQL注入。
2)修改web服务器参数设置。SQL注入入侵是根据web服务错误提示信息来获取信息进行入侵的。可以把web服务器设置成不管出什么样的错误,只给出一种错误提示信息,即http 500错误,攻击者就没办法从提示信息中获取有用信息进行入侵了,注入工具也没有办法了。这个方法即简单又有效,缺点就是代码出错时,会给程序的调试带来很大的不便。不过,服务器毕竟不是测试代码的地方,应坚持安全稳定第一,事实上许多服务器的出错信息都是如此设置。
另外,利用检测工具和手工检测方法,对网站进行检测,一旦发现存在漏洞,就对被注入的地址进行参数过滤和检查。
【参考文献】
[1]方伟,方欣,一个通用防止SQL注入系统的设计与实现[J].湖南理工学院学报:自然科学版,2012,12:25(4).
[2]杨省伟,杨浩杰.SQL注入数据库攻击与防御技术研究[J].长沙大学学报,2013,9:27(5).
[3]吴金秀.SQL注入攻击与防御[J].陕西交通职业技术学院学报,2012(4).
[责任编辑:王伟平]