雷蕾
摘 要:随着科技的进步,计算机技术发展迅速,愈来愈多的系统、平台、软件在存储相应数据之时使用数据库,使用数据库便会用到SQL语言,文章分析说明了什么是SQL注入,SQL注入的特点原理,讨论了常见的一些SQL注入方法,根据不同的方法给出防范SQL注入相应的技术措施。
关键词:SQL注入的分类;SQL注入攻击;SQL注入防范;
1. SQL注入产生的原因
SQL注入攻击是因为编程人员在编写 SQL语句时,不能正确地写出 SQL语句,也不能对特定的字符进行筛选,从而使客户端能够在全局变量 POST和 GET的基础上,实现对 SQL的远程访问。SQL注入语言是属于拼接式的语言,尤其其查询条件字符串也可以拼接而成,注入者违反程序设计者的初衷,拼接了合法的和非法的查询条件,形成含有 SQL 注入的 SQL 语句[1]。
2. SQL注入攻击原理
很多系统、平台、软件使用数据库来存储数据信息,而SQL语句命令是连接前端web端和后端数据库之间的一个接口,都需要使用SQL语句来查询数据的存储情况、位置等,从而返回用户需要查找的信息。因为开发人员的编程水平参差不齐,在程序设计中没有对某些字符进行正确性的审查和筛选,从而使攻击者在 URL连接、表单域中输入SQL指令,从而发现了数据库中的敏感信息,从而形成 SQL注入攻击。
3. SQL注入攻击实例
(1)我们首先需要寻找注入点,先在url参数后添加单引号观察回显,加单引号会导致SQL语句执行错误,当前页面可能会报错或者出现查询内容不回显的情况比较经典的“1=1”、“1=2”测试法。
(2)若是已经需找到了注入点,http://xxx.xxx.xxx/yes?id=xx后面追加“and 1=1并访问该网址即http://xxx.xxx.xxx/yes?id=xx and 1=1应该与访问原地址得到的结果相同。在http://xxx.xxx.xxx/abcd.asp?p=xx后面追加“and 1=2并访问该网址即http://xxx.xxx.xxx/abcd.asp?p=xx and l=2应该与访问原地址得到的结果不同,且提示数据库错误。这就说明网址存在SQL注入漏洞。
(3)通过在url后构造一些特殊的SQL语句在数据库中查找我们所需要知道的信息,如表名、用户名、列名、数据库名、密码等信息。
4. SQL注入的分类
(1)数字型注入:当输入的参数为整型时,如id、年龄等,如果存在注入漏洞,则可以认为是数字型注入。对于Java、C#这类强类型语言,如果试图把一个字符串转换为int类型,则会抛出异常,无法继续执行。所以,强类型的语言很少存在数字型注入漏洞,绝大多数存在于弱类型语言。
(2)字符型注入:如果是参数是字符串时被称作字型。数字型和字型注入的最大不同是:数字型不要求单引号封闭,而通常采用单引号封闭。
(3)报错注入:报错注入使用的是在数据库的错误信息会返回显示在网页上,我们需要构造一些语句使得数据库产生报错信息返回至网页上。
(4)布尔盲注:布尔型盲注就是在页面没有错误显示时进行注入攻击,我们需要对语句进行构造且让页面呈现出两种不同的状态,分别是TRUE和FALSE,可以根据这两种状态判断我们输入语句是否查询成功。
(5)时间盲注:时间盲注也叫做延时注入,在既没有回显显示数据库反馈的内容,又没有显示报错信息,也没有布尔型状态时,我们可以选择延时注入。这里需要用到一个 MySQL 的 sleep(n)函数,功能是休眠 n 秒,sleep()函数执行是有条件的,必须保障 SQL 语句执行结果存在数据记录,才会停止指定的秒数,如果 SQL 语句查询结果为空,那么 sleep函数不会停止[1]。
(6)宽字节注入:宽字节注入准确来说不是注入手法,它是一种较为特殊的注入情况,在我们测试?Id=1’时会发现单引号并没有被带入进去,而是被转义处理了,转义后的单引号不再具有作用,变成了输入的内容,要想成功注入就需要对这个转义进行处理。
5. SQL注入的方法
在系统开发后期需要进行SQL注入攻击测试。SQL注入攻击测试通常分为手工测试和自动测试。下面分别介绍一下這两种测试方法[2]:
(1)手动测试
手动测试SQL注入是确定数据库中是否存在SQL漏洞的一种常见方式。测试人员可以通过检查返回的错误信息和尝试猜测数据库的结构来查看漏洞。手工测试比较直观,但由于分析返回的错误信息和尝试猜测数据库的结构比较繁琐且需要的时间和精力较多,而且并不是所有的SQL注入漏洞都能够被发现。
(2)自动测试
如果是大型或者复杂的系统,人工测试无法确保能够检测出 SQL注入点或是是否存在SQL注入;这时,我们可以以“黑客”方式,利用这些工具,对相应的系统进行 SQL注入,从而发现从外部可以攻破的漏洞,因此可以修改程式的参数和程式码,这样被称作是自动化检测。自动化检测是使用一些工具的,例如最常用到的SQLmap,它是可以自动检测并且可以利用SQL注入漏洞直接获取数据库的相关信息,包括访问底层文件系统、数据库指纹识别等。
6. 对SQL注入的防范
尽管对系统安全费尽心思,装补丁、安防火墙、装杀毒软件,但防火墙与杀毒软件对注入是没办法防范的,因为注入入侵跟普通的页面访问没什么区别[3]。主要的SQL注入防范方法有:
(1)分级管理
权限等级管理,权限管理严格,一般用户不得给予建立、删除、修改等相关权限,仅由管理员拥有增删改查的权限。
(2)二次过滤
为了保证数据的安全,SQL注入要对输入和提交的变量进行转换、过滤和筛选,以避免SQL注入,尤其是单引号、双引号等字符,然后,依据程序的功能和用户的输入进行二次筛选,保证了系统的安全。
(3)参数传值
编程人员在编写 SQL时,不能直接向 SQL中写入变量,而要将相关的变量设定为参数。这样就可以阻止 SQL的插入。在此基础上,对输入的信息进行筛选,筛选出不可靠的信息。或使用参数传值的方法来传输输入变量,从而最大限度地防止 SQL注入的入侵。
7.总结
SQL注入攻击作为当前Web应用安全热点之一,从1998 年第一次出现至今,已有10年发展历史,被广为利用并持续发展[4]。要想有效的防护SQL注入攻击,需要采用系统、综合的方式来解决,需要每个人一起共同努力。
参考文献
[1] 翟宝峰. SQL注入攻击的分析与防范[J]. 辽宁工业大学学报(自然科学版),2021,41(3):141-143,147. DOI:10.15916/j.issn1674-3261.2021.03.001.
[2] 徐鑫涛. 浅析SQL注入攻击[J]. 中国科技信息,2007(1):97,99. DOI:10.3969/j.issn.1001-8972.2007.01.048.
[3] 迟国栋,钱英军,姚丽丽. SQL注入攻击与防范[J]. 世纪桥,2007(3):72-73. DOI:10.3969/j.issn.1001-0475.2007.03.032.