web安全之sql注入综述
摘要
sql注入攻击是一种典型的web安全威胁。产生于开发人员的操作不当而被恶意利用,其攻击方式复杂多样,操作难度较低而危害性大 。我们应该增强安全防护意识,优化web程序应用代码做好防御,减少此类攻击的出现。
关键词
sql注入;攻击方式;安全意识;防御;
01
背景介绍
随着信息技术的飞速发展,互联网给人们带来了极多便利,网络中的信息瞬息万变,流动性极强,于是信息共享不再是幻想。然而,人们在享受便利的同时却忽略了其中的隐患,sql注入由此诞生,数据和信息的安全受到了威胁。作为一种常见、高效且技术要求不高的攻击手段,它常被黑客用来非法盗取数据库中的信息、获取系统管理权限,造成极大损失和危害。为了维护信息的安全和网络的环境,对sql注入及其防范措施的研究显得十分必要。本文简要列举、分析了一些案例,归纳了部分攻击类型与技巧,并总结出其攻击特点,提出防御方法,最后通过小实验模拟了sql注入过程。
02
综述
2.1
相关事例及其原因
案例1:2013年12月12日,发现如家开房记录可以随意查看并且可以sql注入sa权限。原因是其中一个网络服务网站对用户提交的数据没有进行身份验证,导致可以查询任意会员的开房记录,并且对请求数据未处理,造成sql注入。最终厂商关闭此分站。[1]
案例2:2015年10月18日,发现中国联通中小学安防系统存在无需登录DBA权限的通用型SQL注入漏洞,具体为在登录框存在post注入。最终厂商交由第三方合作机构处理修复。[2]
案例3:2014年10月21日,发现某大型酒店安全管理系统存在内网漫游的通杀高危ROOT权限sql注射SHELL。此漏洞属于某公司对酒店、企业的网络管家安全安全管理系统,影响范围大。这个漏洞存在于酒店内网,管理系统的登陆页面中user-agent未做处理,存在注射。利用sqlmap,得知可进行root权限注射,使用的数据库类型为mysql,随后通过查表获取后台管理密码,进入后台获取海量开房记录,用户隐私遭到泄露,甚至可获取酒店内网敏感配置信息。[3]
案例4:2014年,美国海军的web应用“Smart Web Move”遭到黑客组织的sql注入攻击,造成美国海军数据库超过22万服役人员的个人信息被泄露。此后,美国海军动用了超过50万美元来弥补此次的数据泄密事故。
基本原理:Web程序应用未对用户的输入进行合法性验证,攻击者可以构造嵌有Sql命令语句的数据并提交到服务器的数据库,与原代码拼接过后成为可执行命令,从而越权获取数据达到攻击目的。
产生原因:sql注入漏洞大多是因为编程人员安全编程知识缺乏或者是缺乏安全编程经验,在编写代码时不规范、不完善,不能合理配置服务器数据库、对api接口操作不当或是对用户提交数据缺少有效验证和过滤机制。[8]
2.2
攻击类型与技巧
2.2.1 注释符攻击
通过在用户输入的数据末尾插入注释符,过滤掉查询条件从而越权获取数据。
如:在用户输入末尾添加’%23’或’#’,其中%23代表’#’,将后面的单引号注释掉,即可成功执行sql语句。另外也可以添加“--“来注释,绕过单引号。
2.2.2 猜表攻击
找到有注入点的网站后,在网站链接末尾添加 and exists(select*from user) ,若显示正常,则说明存在表名 user 。接下来猜解列名,在链接末尾添加 and exists(select password from user) ,若显示正常,则存在列 password 。之后可以猜测字段长度[ and(select top 1 len (user) from user)>1 ,若正常,则字段长度大于1,依次加1,直到返回错误提示,则字段长度为当前数值]、字段内容[ and(select top 1 asc (mid(user,1,1)) from user)>97 ,若出错,则第一条记录的第一个字符的ASCII码为97,即a,以此类推,可以得到所有字段内容]。
2.2.3 错误信息回显攻击
通过提交错误的sql语句,得到网站返回的错误信息,能够获知使用的数据库类型、服务器配置等信息从而进行有针对性的攻击。如select username from users where id=1 and password=’’ and pin = convert(int,(select last name from sysobjects where xtype='u')),从元数据表 sysobjects 中查询用户表 xtype='u',并转换为一个整数,系统会因为非法的类型转换而抛出错误,根据错误信息可确定数据库类型为 SQL Server。[8]
2.2.4盲注攻击
有些数据库的错误回显可能会被开发人员关闭或者是过滤,但是攻击者还是可以通过构造语句来收集信息,找到注入点从而进行进一步攻击。如:在末尾添加 and 1=1,执行的sql语句为 select * from table where id=1 and 1=1 ,and前后语句均为真,执行查询,返回test中表table中id=1的信息;而在末尾添加 and 1=2,执行的sql语句为 select * from table where id=1 and 1=2 ,and后1=2语句为假,执行后页面出现不正常显示,说明网站没有对参数进行检测验证而将其当成语句来执行,由此可以确认存在注入点。
2.2.5 联合查询攻击
使用union进行联合查询,通过输入响应猜出sql语句结构,通过构造与其结构相似的语句使用union串联起来执行,从而获得其他信息。如sql语句 select * from table where id=-1 union select *from table ,由于union前id=-1的数据不存在,于是执行后面的语句,得到当前数据库的中的数据。另外也可以通过union和其他语句拼接,来进行数据删除等操作。
2.2.6 复合语句攻击
使用“;”,在前一语句执行结束后执行注入点后续语句,可以对数据进行删除、更新、查询、插入等操作。如:通过对语句select username from users where user_id=’101’的id进行构造,使得id=’101’;drop table users #,由此得到语句select username from users where user_id=’101’;drop table users #,该语句执行完前一部分的查询语句后还会进行删除表users操作,对数据造成巨大破坏。
2.2.7 编码绕过攻击
有的网站会对输入的内容进行验证和拦截,禁止输入如‘ / 等特殊符号,这时可以输入它们的Unicode编码或是base64编码尝试绕过检测。
2.3
攻击特点
2.3.1 操作难度低
目前互联网上存在多种集成工具,对于攻击者的专业知识水平要求不高,只需要会熟练操作这些工具就可以对一些网站进行攻击。
2.3.2 隐蔽性强
sql注入攻击实质上是用户输入的数据被攻击者而已构造并在数据库正常执行,防火墙对其没有任何限制。因为是基于自身代码的执行,所以基本不会触发警报,对于网站维护者来说即使存在此类入侵也较难发现。
2.3.3 广泛性
目前有大量是web应用程序是部署有数据库软件的,只要是基于sql标准语言的数据库软件如果缺乏有效的防护均有被攻击的较大可能。[10]
2.3.4 危害性强
一旦数据可被入侵,攻击者可以轻而易举的得到数据库中的数据并对数据进行操作,造成严重的信息泄露安全事故。更严重的还可能被攻击者植入木马,看着服务器或客户端等,从而进行其他方面的攻击,造成更加严重的损失。
2.4
防御方法
2.4.1 不信任
不信任用户输入的任何变量,对用户进行限制。如使用白名单、给可能的输入建立映射表,只接受符合规范的输入,对内容进行过滤;使用成熟的输入验证策略,严格检查参数的数据类型、限制输入长度,拒绝非法输入;将某些特殊字符进行转义,确保接收的数据中不包含危险代码。
2.4.2 数据库加密
使用可靠的加密算法将要存储的数据进行加密,并在数据库中使用密文保存而不是保存明文。即使数据库不幸遭到入侵攻击,也不会发生严重的数据泄露。
2.4.3 分离
将数据和代码分离,自动强制执行数据和代码分离的结构化机制。
2.4.4 限制权限
遵循最小权限原则,只给用户以能完成工作、满足需求的最小权限。如数据库中某些表在正常使用过程中并不会被查询,则关闭用户对此表进行访问的权限。
2.4.5 参数化输入
使用sql语句预编译,由于sql语句已经被分析、编译,于是用户输入的内容全部都会被当成一个参数,不会被理解拼接为一条sql语句,从而防止sql注入。如使用Node.js 中 mysqljs 库的 query 方法,用‘?’占位参数。
2.4.6 日志处理
定期查看数据库日志,查看是否有非正常的sql语句执行情况。尽量关闭数据库原始错误日志的回显,防止,防止出现错误时暴露数据库的相关信息被攻击者利用。[7]
2.4.7 第三方保护
使用防火墙过滤可疑ip的请求。
2.4.8 提高安全意识
加强安全编程的意识,在编写代码的过程中使用安全函数和方法,投入使用后,留心日志中的异常记录。
03
利用sqlmap自动化渗透测试工具对dvwa进行sql注入
3.1
配置
测试平台:DVWA
(Damn Vulnerable Web App)
所需环境:php运行环境,python 2.6/2.7/3.x
测试工具:sqlmap
具体步骤:
①php运行环境的搭建:登录官方网站:https://m.xp.cn/ 下载相应安装包解压后安装即可,
②测试平台dvwa的搭建:登陆官方网站:http://www.dvwa.co.uk/ 下载项目包,解压提取到phpstudy安装路径下的WWW文件夹中,随后进入解压后的文件夹DVWA-master的config中,打开 config.inc.php文件将$_DVWA['db_user']和$_DVWA['db_password']的值都修改为’root’;打开phpstudy一键启动WNMP,在浏览器url中输入:http://127.0.0.1/DVWA-master/ 并登入,使用账号:admin,密码:password登录,在Setup/ResetDB板块中点击Create / Reset Database按钮,完成数据库部署。
③python运行环境搭建:登陆官方网站:https://www.python.org/ 下载python2.6/2.7/3.x版本的安装包,点击安装后根据指引安装即可。
④sqlmap自动化渗透测试工具部署:登陆官方网站:http://sqlmap.org/ ,点击下载压缩包,解压后即可使用。
3.2
试验步骤
3.2.1 寻找注入点
图 1 dvwa平台注入模块
Graph 1 dvwa platform injection module
输入1发现有数据回显,在sqlmap.py所在的目录下打开cmd,复制目标位置url:“http://127.0.0.1/DVWA/master-vulnerabilities/sqli/?id=1&Submit=Submit&user_token=fb32a580e221c0014a940ca2450e798a#”
F12打开调试工具查看:
cookie:“security=impossible; security=low; PHPSESSID=c8qh4blq4hf9eqdf1sp34kd84a”;
在cmd中输入命令行:
“sqlmap.py -u "http://127.0.0.1/DVWA-master/vulnerabilities/sqli/index.php?id=1&Submit=Submit&user_token=4806de1447332cec28e0c35b56fc2ad1#" --cookie="security=impossible;security=low; PHPSESSID=c8qh4blq4hf9eqdf1sp34kd84a" --batch”后,按Enter执行;
得到结果:服务器配置信息以及id存在可以sql注入的参数。
图 2 找到注入点示例
Graph 2 Example of finding injection point
3.2.2 寻找目标数据库
在cmd中输入命令行:
“sqlmap.py-u"http://127.0.0.1/DVWA-master/vulnerabilities/sqli/index.php/?id=1&Submit=Submit&user_token=4806de1447332cec28e0c35b56fc2ad1#" --cookie="security=impossible; security=low; PHPSESSID=c8qh4blq4hf9eqdf1sp34kd84a" --dbs”后,按Enter执行;
得到结果:所有数据库的库名,看到名为dvwa的库名即为所要查看到数据库名。
图 3 获取到数据库列表示例
Graph 3 Example of getting to the database list
3.2.3 查看目标数据库所有表
在cmd中输入命令行:
“sqlmap.py-u"http://127.0.0.1/DVWA-master/vulnerabilities/sqli/index.php?id=1&Submit=Submit&user_token=4806de1447332cec28e0c35b56fc2ad1#" --cookie="security=impossible; security=low; PHPSESSID=c8qh4blq4hf9eqdf1sp34kd84a" -D dvwa --tables”后,按Enter执行;
得到结果:目标数据库的所有表:guestbook,users。
图 4 获取到数据表列表示例
Graph 4 Example of getting a list of data tables
3.2.4 查看目标数据库数据表的所有列
对于目标数据库中的表:guestbook,users,其中的users表显然是我们要寻找的目标数据表;
在cmd中输入命令行:
“sqlmap.py-u"http://127.0.0.1/DVWA-master/vulnerabilities/sqli/index.php?id=1&Submit=Submit&user_token=4806de1447332cec28e0c35b56fc2ad1#"--cookie="security=impossible;security=low; PHPSESSID=c8qh4blq4hf9eqdf1sp34kd84a"-D dvwa -T users --columns”后,按Enter执行;
得到结果:表user的所有列名,由此得知数据表中数据的基本情况。
图 5 获取到数据表列名示例
Graph 5 Example of getting the column name of the data table
3.2.5 查看目标数据库数据表的全部数据
得知了数据库名、目标表名、表中的所有列名,就可以把数据表中的数据全都查出来了;
在cmd中输入命令行:
“sqlmap.py-u"http://127.0.0.1/DVWA-master/vulnerabilities/sqli/index.php?id=1&Submit=Submit&user_token=4806de1447332cec28e0c35b56fc2ad1#" --cookie="security=impossible; security=low; PHPSESSID=c8qh4blq4hf9eqdf1sp34kd84a" -D dvwa -T users -C user_id,user,password,avatar,failed_login,first_name,last_name --dump”后,按Enter执行;
得到结果:数据库dvwa中数据表users的全部数据。
图 6 获取到数据表数据示例
Graph 6 Example of getting the data of the data table
3.3
试验结果
本实验通过自动化渗透测试工具对dvwa平台安全等级设置为low时进行sql注入,顺利得到了数据库中的数据而且基本上毫不费力。可以看到,对于安全等级很低的网站,即使不是专业人员,只要能够使用sqlmap这一款工具也可以轻易地获取到数据库中的数据。由此进一步加深我们对于sql注入攻击的认识,在设计网站时更多的关注到数据安全问题,一旦漏洞被利用后果不堪设想。
04
总结
sql注入攻击广泛存在于网络世界中,而且隐蔽性极高,引起的危害与后果也十分严重,不仅数据被泄露,甚至还会被挂马、得到系统的管理权限。所幸只要编程人员在编写代码时注意细节,使用安全的方法和函数就能避免一般的sql注入攻击,然而很多漏洞都是由于代码编写不规范而产生的。因此,提高编程人员的安全意识是非常必要的,只要做好足够的防范措施,就能避免很多不必要的损失。
参考文献
[1]https://www.uedbox.com/post/34650/
[2]https://www.uedbox.com/post/16764/
[3]https://www.uedbox.com/post/28462/
[4]https://www.ssfiction.com/archives/
93551
[5]http://jnu.shiyanbar.com/course/
12191/vid/946
[6]http://jnu.shiyanbar.com/course/
12191/vid/26
[7]李明.Web应用SQL注入漏洞分析及防御研究[J].
福建电脑,2020,36(05):25-27.
Li Q, Feng D G, Zhang L W, et al.
[8]黄小丹.SQL注入漏洞检测技术综述[J].
现代计算机,2020(10):51-58.
[9]刘建亮,乔兴华.SQL注入攻击与防范之研究[J].
科学技术创新,2020(08):24-25.
[10]代威,黄金杰,刘畅.典型内部网络SQL注入攻击
与防范[J].网络安全技术与应用,2020(02):16-18.
[11]段寿建.基于PHP+MySQL的用户登录系统SQL
注入实例及防范[J].现代计算机,2019(34):71-74.
[12]吴翰清.2004.白帽子讲web安全.
北京:电子工业出版社.432pp
19网安
文本编辑:刘蕙琦 余墅
排版:陈炯中
审核:吕善翔