陈 悦 蔡满春 李璟莹
(中国人民公安大学网络安全保卫学院 北京 102600)
随着Web应用技术的不断成熟,动态网站以其丰富的内容和强大的功能在人们的生活中备受亲睐,各大高校院系、公司企业、政府部门、事业单位等都构建起了自己的动态网站。但由于网站开发人员缺乏安全保护意识,这些网站的安全措施并不是很完善,因此给该类网站造成了很多的安全威胁。从之前的CSDN社区用户信息泄露,到携程网信息安全门事件,再到2015年上半年多省市卫生社保系统出现大量高危漏洞,导致数千万社保用户敏感信息泄露的安全事件,都表明互联网的安全问题愈发严峻,其中SQL注入就是一种日益增长安全威胁。尤其互联网+时代到来,物联网、云计算和大数据应用不断深入,攻击者利用 SQL注入点对网站发起攻击后可以操作网站后台的数据库,拖库攻击导致数据库存储的用户敏感信息泄露,修改甚至破坏数据库内容和结构,对用户生命财产安全造成严重侵害。
攻击者通过构建特定长度、类型的字符串动态SQL语句来执行数据库操作,将容易触发SQL异常的代码写入SQL查询语句中,造成SQL所支持数据库异常,然后使用一系列的技术手段实现数据库拖库。
(1)“加引号”法
单引号作为SQL数据库中的转义字符,其使用不当会造成查询异常。攻击者通常在URL的尾部插入一个单独的引号,造成SQL语句异常而令数据库抛出一个错误信息。例如图1所示。
图1 “加引号”法
(2)逻辑语句判断法
“加引号”法直接了当,操作也很方便,但有经验的网站编写者通常对其进行过滤。这样用单引号就无法检测到注入点,此时可以使用逻辑语句判断检测是否存在SQL注入点。常用的逻辑语句有‘and 1=1’、‘and 1=2’等。
在网页原地址后加入‘and 1=1’语句后,网页会正常显示;在网页原地址后加入‘and 1=2’语句后,网页会显示异常。例如图2所示。
图2 逻辑语句判断法
相比于其他工具,sq1map不仅能利用已经发现的漏洞进行SQL注入,还能通过基于启发式的检测来寻找漏洞。它还能获得不同数据库的指纹信息,并且通过带外连接从数据库中抓取数据,访问底层文件系统和在操作系统上执行命令。
当我们利用之前提到的方法找到一个网站的 SQL注入点后,接下来我们将使用一些命令进行SQL注入攻击,来提取网站的数据库内容信息。sq1map的拖库步骤如下:
第一步:建立连接并列出数据库,如图3所示:
图3 建立连接并列出数据库
发现该网站数据库共有2个。如图4所示:
图4 发现该网站数据库个数
这里我们只需要注意第一个数据库就行了,因为information_schema是MySQL默认的数据库,它包含了MySQL系统用的所有字典信息,以及数据库系统中所有对象信息和进程访问、状态信息。而我们需要的网站数据信息保存在第一个数据库中。
第二步:列出目标数据库的表,如图5所示:
图5 列出目标数据库的表
我们发现该数据库中共有13个表,其中表名为admininfo的表引起了我们的兴趣,因为这张表中可能存放了数据库的用户名和密码。如图6所示。
图6 存放了数据库的用户名和密码
第三步:列出指定表的列,如图7所示:
图7 列出指定表的列
这里我们得到了存放用户信息的passwd和usernamed列信息,如图8所示:
图8 存放用户信息的passwd和usernamed列信息
第四步:导出passwd和username的内容信息,导出结果如图9、10所示:
图9 导出passwd的内容信息
图10 导出username的内容信息
我们发现这个数据库的用户名为 admin,但密码字段经过加密算法加密,得到的是密码的HASH值。这里我们不对如何解密做介绍。
通过上述方法,我们成功地利用 sq1map对网站进行 SQL注入攻击,并得到了网站的数据库信息。
绝大多数的SQL漏洞是由于Web开发者在开发代码时没有彻底理解Web与其数据库之间的交互关系而产生的。下面给出一些常见的预防措施:
(1)使用参数化语句
在构造SQL指令时,采用参数来代替需要写入的数值。在语句传输过程中,数据库不会对参数进行处理,而是在完成解析编译后,才对参数进行操作。就算参数中含有恶意的语句,数据库也能正常查询。所以,相比起动态SQL,参数化语句更加安全。
(2)验证输入
恶意攻击者往往会通过网站的报错信息来确定服务器、数据库的平台信息等。因此,我们需要检查用户定义的参数并加以过滤,验证输入参数的长度、类型等信息;使用白名单测试用户输入,只接收数据库期望的已知的良好输入。
(3)应用安全策略
例如安装Web应用防火墙来检测及预防SQL注入,并且通过加固数据库来确保数据库安全;对重要的数据库对象实施访问控制,同时对敏感用户数据信息进行加密。
另外,我们在上述方案基础上提出了两点新的预防措施:(1)使用存储程序代替SQL语句
我们可以将SQL语句从Web应用程序上脱离出来,并把它编写到一个由我们自己定义的存储程序上,该存储程序位于数据库服务器端。通过调用定义的存储程序来代替用户输入字符串构建的SQL语句。
(2)建立异常检测评分机制
对SELECT、DELETE等关键的数据库查询语句进行数值评分,通过计算每个语句的异常值并与设定的异常值做比较,一旦这个语句的异常值超过设定的最大异常值,那么这个查询语句被视为是异常的,并触发警报。
网站被SQL注入攻击后,管理者应当要尽快关闭站点,以免受到二次攻击;调查可疑的SQL注入攻击,分析数字化痕迹,识别攻击活动;通过取证确定攻击者在系统上执行的操作,检查并理解攻击者恶意查询逻辑,掌握其攻击企图;联系相关的技术人员,对漏洞进行修补,并做好数据恢复工作,将损失减少至最小。
SQL注入形式是对互联网上的数据库进行拖库攻击的主要方式,本文基于sq1map工具对目标网站实现了SQL注入攻击,获得了其数据库内容。并且,通过对SQL注入攻击的分析,总结相关研究成果,提出了用存储程序代替SQL语句及建立异常检测评分机制的新型防范概念。本文对网站进行SQL注入攻击的方式是基于网页错误信息报告的,未对盲SQL注入做详细介绍。今后对盲SQL注入攻击进行分析将是进一步研究的内容。
[1]徐陋,姚国祥.SQL注入攻击全面预防办法及其应用[J].现场总线技术应用.200例.2005.
[2]张耀辉.CSDN“拖库”事件后对密码保护的反思[J].长沙通信职业技术学院学报.2012.
[3]孙义,胡雨霁,黄皓.基于序列比对的 SQL注入攻击检测方法[J].计算机应用研究.2010.
[4]彭赓,范明钰.基于改进网络爬虫技术的SQL注入漏洞检测[J].计算机应用研究.2010.
[5]雷燕瑞.基于SQL注入的Web应用程序安全性研究[J].信息安全与技术.2014.
[6]黄少勇.SQL注入攻击和防范措施[J].计算机安全.2012.