仇善梁
(江苏省扬州商务高等职业学校,江苏扬州 225000)
开发者视角下网站SQL注入漏洞及防范
仇善梁
(江苏省扬州商务高等职业学校,江苏扬州 225000)
通过对网站SQL注入漏洞的成因和常见类型进行分析,在代码编写层面提出六点防范措施,帮助开发者尽量从源头上杜绝此类安全漏洞,避免重复劳动,提高网站运行的安全性。
SQL注入;漏洞;攻击
随着计算机技术和网络技术的高速发展,信息化给人们的工作、生活和学习带来了极大的便利,与此同时,网络信息安全也成为信息社会的重要话题。网络信息安全包含很多领域,其中网站的安全是其重要内容之一。根据国家互联网应急中心发布的《2015年中国互联网网络安全报告》显示,2015年我国境内被篡改的网站数量为24 550个,其中政府网站有898个;被植入后门的网站数量为75 028个,其中政府网站有3 514个[1]。SQL注入漏洞是网站漏洞的重要形式之一,也是危害性比较大的漏洞之一,2015年某市人才网因存在SQL注入漏洞,导致240万条个人信息被泄露,这充分说明当前网站的信息安全形势比较严峻。
软件漏洞是指软件生命周期中涉及安全的设计错误、编码缺陷和运行故障等[2]。SQL语言是目前数据库使用的主流操作语言,SQL注入攻击也是最常见的Web攻击手段之一。所谓SQL注入漏洞,是指应用程序未对用户输入的内容进行充分的有效性和合法性验证,导致非法用户在URL查询字符串或表单提交的数据字段中插入特殊字符,从而可以动态构造出非法的SQL语句,在数据库正常执行后,实现SQL注入[3],从而达到窃取数据、绕过验证或破坏数据等目的。常见的SQL注入方式有重言式注入、错误逻辑式注入、破坏式注入、附加命令式注入等。
1.1 重言式注入
重言式通常称为永真式,这种方式通过和不等式配合使用,使SQL语句变成永真式或永假式,据此来判断请求的字段是否存在漏洞,实现绕过会话验证的注入方式。用户登录是开发网站程序最常用的功能模块,本文就以验证用户登录为例,虽然我们相信一般程序员不会使用这种写法,但这是SQL注入的典型演示案例:
上述语句下划线部分为用户输入内容,如果用户正常输入账号和密码,此语句没有问题,但是如果攻击者将账号和密码都输入'or''=',那么语句就变成:
很显然,如按上述语句执行,攻击者用单引号的方式即可改变SQL语句原来的逻辑结构,使用SQL内置关键词“or”,使原来的判断语句变成永远为真,这样可以绕过用户验证,成功获取相关权限。类似语句还有多种其他写法,甚至可以自己插入一个新用户,方便地绕过验证,进入系统。
1.2 错误逻辑式注入
此类注入是攻击者故意构造错误的SQL语句,系统执行后一般会报错,只要在IE选项设置里去掉“将显示友好HTTP错误信息”的勾选项,客户端浏览器一般会显示详细的报错信息,以便攻击者窥探想要得到的相关信息。我们通过SQL的convert函数来实现数据类型的转换,使系统强制将用户名转换成整数,导致系统报错。举例如下:
毫无疑问,在上述SQL语句的执行过程中,只要用户名不是数字格式,执行后肯定会报错,如果系统没有对相关错误信息进行有效地处理或屏蔽,系统就会如实地显示相关错误信息。攻击者手中一般都有常规对照表,针对不同数据库类型收录了不同的关键词和命令方式等,即可以通过不断改变注入操作,窥探想要得到的信息。
1.3 破坏式注入
此类注入是通过附加命令实现数据破坏或数据窃取,导致网站系统拒绝服务等,举例如下:
执行上述语句后,select语句执行后没有数据受影响,而由于单引号被“--”注释了,直接执行了drop语句,即可删除整个用户表,因此这种注入方式的危害性非常大。依照drop语句的执行方法,还可以执行其他类似SQL语句。
1.4 附加命令式注入
若手动提交http://www.xxx.com/readnews.aspx? id=668 and(select count(*)from admintable)>=0,如果仍然正常显示原来页面,则说明数据库中存在admintable表,继续修改count(*)部分内容,可以进一步判断数据表中的字段情况。
最后面的单引号同样被屏蔽,select语句执行后,insert语句就直接新增了一个管理员用户,那么后果可想而知了。实施SQL注入的方法还有很多,它们都是利用了开发者没有对用户输入内容进行严格过滤和限制这一共同特征。
SQL注入漏洞与网站开发人员的开发习惯和安全意识有着十分密切的关系,SQL注入漏洞的本质是程序员对用户输入的内容验证不足而导致的,要解决此漏洞问题,还得围绕验证用户输入和提交的内容,从几个方面综合考虑,统筹应对。下文案例代码以ASP.NET为例。
2.1 严格过滤
强化对用户输入内容的验证,过滤非法字符,是防范SQL注入的主要工作。国内外研究的主要措施是编码或过滤,一般建议在安全问题上遵循最小化原则,直接进行过滤,可将敏感字符集保存在web.config网站配置文件中,具体如下:
获取用户提交的数据后使用循环语句逐个与特殊符号进行比对,如果发现则进行replace()处理,当然也可以替换为相关转义字符。因web.config配置文件遵循xml编码格式,其本质就是txt文件,在网站发布后仍然可以方便地修改,便于后期及时更新维护。
图1 部分特殊符号说明表
图1仅列出了部分危险系数比较高的特殊符号,实际上还有更多需要注意的符号。在项目开发中,开发人员可以编写专门的工具类(如Tools类),使用正则表达式设计一些专门匹配方法,如匹配手机号码,匹配数值范围内的数字,匹配长度范围内的字母和数字等。只要平时注意收集与整理,可在不同项目中重复使用,提高开发效率。
2.2 参数化查询
要防范SQL注入攻击,首先必须对用户提交的数据进行过滤,该步骤一般能过滤掉大部分攻击,但由于字符集的覆盖性关系,所以也不是万能的;其次是要改变传统拼接SQL的写法,使用参数化查询,我们还以经典的登录案例进行说明,具体如下:
上述是SQL拼接写法,也是SQL注入攻击的重要目标,具体攻击方法上文已作讨论,而参数化查询被视为防范注入攻击的有效手段,写法如下:
上述写法之所以能有效屏蔽攻击,是因为在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部分来处理,而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中含有指令,也不会被数据库运行。
此外,有人误以为存储过程也是防范SQL注入的重要手段,可是需要特别声明的是,存储过程本身并不能防范SQL注入,即如果存储过程使用动态SQL语句,它也有可能被SQL注入[4]。因此,存储过程中的写法也必须是参数化的,不能出现字符串拼接。
2.3 二次验证
动态网页都离不开客户端与服务器端的数据交互,实现这种正向交互一般是使用表单。为了提高提交的安全性与成功率,开发者往往都很重视在前台使用JavaScript进行数据合法性的验证,即通过验证后方可提交,否则不允许提交。正因为这样,往往导致一些开发者忽略了后台的再次验证,因为正常的访问者与攻击者的访问方式可能存在如下差别,如图2所示。
图2 不同用户表单提交验证流程图
正常用户在通过客户端的JS验证后完成表单提交,否则提示错误,不能提交;而攻击者可以利用技术手段自行模拟提交,如果没有后台的二次验证,将直接接触到数据库,这是非常危险的。因此,当数据通过严格的前台验证后,必须在后台进行二次验证,过滤后方可写入数据库,切勿完全相信前台获取过来的数据。
2.4 出错控制
常规注入方式是攻击者故意掺入恶意字符或构造出畸形的SQL语句,造成数据提交后系统报错,然后从这些错误信息中获取攻击者想要得知的信息。而程序开发百密一疏,难免在运行中有意外情况发生,所以如何有效屏蔽出错信息也是防范SQL注入的重要内容。首先,在程序编码过程中,针对一些如查询搜索、数据提交等重要节点,除了进行合法性过滤外,还要善于使用异常处理语句;其次,ASP.NET的web.config网站配置文件还自带了针对全站的出错控制方法,代码如下:
通过此功能,可以详细定义不同出错方式跳转至不同的自定义页面,defaultRedirect属性指向出错转向页面,mode属性有三个值,分别是On、Off和RemoteOnly。顾名思议,On是打开,即如果出错显示报错页面;Off是关闭,即如果出错显示详细信息;RemoteOnly是远程打开,本地关闭,即如果出错远程访问者显示报错页面,本地用户显示详细信息,以方便调试。Error节点是自定义具体错误类型的跳转页面,但是建议网站开发者在发布时进行笼统处理,因为把错误类型定义得太细,虽然对开发调试有帮助,但是发布后,对攻击者可能更有帮助。
2.5 特殊保护
通常Web系统注册用户只能访问前台,管理后台是不对外开放的,而SQL注入攻击的最终目的多是寻找管理员登录页面实施攻击,因此管理员登录等重要页面是重点保护对象。具体保护方法可以借鉴防火墙思路,对访问这些特殊页面的IP地址进行匹配过滤,如果匹配通过即可访问,否则直接跳转至报错页面或首页,代码具体如下:
上述代码首先读取网站配置文件,列出允许的IP地址白名单列表,然后通过自定义类的get_ip()方法获取访问者的IP,与之进行匹配,如果访问者的IP包含在允许列表内则可以访问,否则直接跳转至事先定义的页面,达到过滤保护的目的。如果是拥有固定IP的单位只需要授权一个IP即可,如果是自动获取IP的单位则需要授权多个IP和修改匹配段,但不管是哪种方式,如此过滤还是比开放式访问安全得多。
2.6 自我检测
软件开发难免存在某些BUG,网站开发也是如此。根据知己知彼、百战不殆的理念,建议开发者在网站开发完成后,选取2~3款SQL注入漏洞检测工具进行自我检测,如发现问题,及时进行修正。网络上SQL注入漏洞检测工具有很多,如:SSQLInjection、BSQL Hacker、The Mole和Pangolin等,具体可根据相关介绍自行选择。
因SQL注入漏洞的危害性非常大,所以它也是网络攻击者的重要攻击方式之一。在了解SQL注入漏洞的成因和基本类型后,开发者应注意养成良好的开发习惯加以防范。此外,根据开发技术和开发模型的更新,也可能出现一些新的注入形式和防范方式,需要我们不断加强学习和研究,共同致力于营造更加安全的网络环境。
[1]国家计算机网络应急技术处理协调中心.2015年中国互联网网络安全报告[R].北京:国家互联网应急中心,2015.
[2]吴世忠,郭涛,董国伟,等.软件漏洞分析技术进展[J].清华大学学报:自然科学版,2012(10).
[3]隋亮.基于渗透测试的SQL注入漏洞检测与防范[D].上海:东华大学,2014(5):20.
[4]王云,郭外萍,陈承欢.WEB项目中的SQL注入问题研究与防范方法[J].计算机工程与设计,2010(5).
Vulnerability and Prevention of SQL Injection in Website from the Perspective of Developer
QIU Shan-liang
(Yangzhou Commerce Higher Vocational School,Jiangsu Yangzhou 225000,China)
By analyzing the causes and common types of SQL injection vulnerabilities,this paper puts forward six precautions at the level of code writing to help developers avoid safe vulnerabilities and work duplications so as to improve the security of website operation.
SQL injection;Vulnerability;Attack
TP393.08
A
1673-2022(2016)04-0052-04
2016-10-06
仇善梁(1983-),男,江苏射阳人,讲师,硕士,主要研究方向为教育信息化和WEB应用开发。