SQL盲注攻击与防范
2018-09-10李鸿鹄王喆翟继强
李鸿鹄 王喆 翟继强
摘要:分析DVWA中存在SQL盲注漏洞的源码,旨在能够通过对现有攻击方式的验证下,提出对应的防御措施,为开发人员提供参考。采用基于时间的盲注方法,并借助python脚本对存在漏洞的页面进行了仿真测试,成功利用该漏洞显示出数据库版本信息。现阶段对于存在数据库操作的代码,应重视其安全性,针对安全和开发的平衡,经过相应的需求分析后,采取对应的防御措施。
关键词:SQL注入攻击;SQL盲注攻击;数据库;防御
中图分类号:TP391.4文献标志码:A文章编号:1008-1739(2018)05-68-4
Blind SQL Injection Attack and Defense
LI Honghu, WANG Zhe, ZHAI Jiqiang(College of Computer Science and Technology, Harbin University of Science and Technology, Harbin Heilongjiang 150000, China)
0引言
Web发展的每一个阶段都肩负着不同的使命,应对着不同的挑战。Web1.0时代主要注重的是内容的展示,在安全方面的挑战也仅仅是如何做好防止Webshell的上传工作。随着Web技术的发展与成熟,安全问题也成为其所要面对的巨大挑战之一[1],SQL注入攻击对于Web应用而言,无论是从其攻击的深度还是广度来看,都是一种危害性极大的攻击方式。
SQL注入攻击通过提交特殊值与数据库进行非法交互,当代码不够健壮的时候,攻击者可以通过相应的SQL语句,任意对数据库内容进行增删改查,如果服务器权限设置不合理,就可以直接读取主机文件。本文通过源码分析和运用python脚本,阐述了SQL盲注注入[2]攻击原理、详细操作和防范方法。
1 SQL盲注原理
对于上一个代码段来看,第二段代码中多了一个@符号,这个符号的作用是将作用的php代码产生的错误信息忽略掉,也就是说即使出现了错误,也不把错误信息显示出来,从而无法获取到服务器的错误信息,增加了攻击的难度。
2 SQL盲注注入流程
2.1基于逻辑的判断
通过闭合参数边界和添加逻辑判断,查看页面是否正常显示。
如果2次页面返回结果不相同,则可能存在SQL注入漏洞。
2.2基于时间的判断
基于时间的判断是通过提交包含数据库时延函数的代码,让数据库在指定时间后返回结果,通过观察前端页面的加载速度,来判断是否存在SQL注入。
在User ID处提交1and (select*from(select(sleep(20)))a)--,提交后如果页面返回出现20 s左右延迟,则说明可能存在SQL注入漏洞,需进一步进行测试。
3基于时间的SQL盲注测试脚本编写
3.3腳本分析
测试脚本只是简单地对SQL盲注进行了简单的自动化测试,返回了数据库的版本信息。基于时间的脚本,主要是通过数据库的时延函数,使用like关键字,对构造的payload与查询信息进行对比,如果为真,则调用时延函数,数据库延迟相应的时间才会返回结果,进而导致服务器返回响应会出现时间延迟情况;如果不为真,则服务器响应会立即返回。通过服务器返回响应是否存在延迟现象,判断构造的payload是否正确。
通过对查询内容的更改,可逐步获取相应的内容,如把version()部分换成user(),可查询到当前数据库的用户信息。如果需要测试具体内容,请更改cookies值和SQL检测语句,可以得到具体的表和字段信息。
4 SQL盲注防范
4.1 WAF防火墙
Web应用防护系统[3](Web Application Firewall,WAF)工作在应用层,对来自Web应用程序客户端的各种请求进行内容检测和验证,确保其安全性与合法性,对非法的请求予以实时阻断。WAF的实现通常由配置、协议解析、规则、动作和错误处理5个模块组成。通过提供代理服务、特征识别、算法识别及模式匹配等方式来进行Web防护。
4.2参数化查询
在使用参数化查询[4]的情况下,数据库在完成对SQL指令的预编译后,才会传入参数值,因此就算参数中含有恶意的指令,因为语法分析和预编译已经完成,所以客户端提交的参数内容不会被视为SQL指令的一部分,通过该方式可有效地防御SQL注入。经验证,对由客户端提交的id值进行了参数化处理的情况下,SQL注入攻击无效。
4.3对重要信息进行加密
尽管SQL注入防御技术在逐步地发展,且已经有成熟的防范措施,对于程序员参差不齐的编程能力,难免Web应用程序可能存在SQL注入漏洞。针对这种情况,可以对数据库中重要的信息内容进行加密,可采用DES﹑RSA、AES及MD5等加密算法,进行数据的加密,即使Web应用程序存在SQL注入问题,攻击者在获取数据库内容的前提下,也无法猜解其相应的明文内容。
4.4对提交参数进行检查
SQL注入发生的主要原因是程序编写者对于用户的输入没有进行验证,未曾考虑其Web程序安全性问题,可以通过设置前端显示所在字段的长度属性,限制用户的输入长度,也可在后端对用户的输入参数中的敏感字符[5]进行转义或者过滤,对于已经确定参数类型的输入参数,可限制其输入的类型,如输入参数为整型,则当用户输入参数为非整型的时候,不允许用户访问。用户的输入验证,可在一定程度上减少SQL注入攻击的发生,但存在一定的局限性,可能存在规则被绕过的可能性。
4.5屏蔽错误信息
SQL注入攻击可利用服务端回显的错误信息,再结合数据库相应的报错特点,通过报错型注入方式,获取数据库相应内容,若数据库权限设置不当,当服务端报错返回其绝对路径后,可通过相应的SQL语句,将一句话写入到网站所在服务器,这样会导致其服务器彻底沦陷。通过屏蔽其页面和数据库报错信息,可以从一定程度上杜绝攻击者通过错误回显来进行SQL注入,但不能从根本上防止SQL注入发生。
5结束语
SQL注入是目前针对于数据库攻击的主要方式,该方式通过恶意构造SQL语句,并嵌入到相应的注入点,通过该方式来获取相应的数据库数据,大多数的存在SQL注入的Web应用程序,主要是程序员对传入参数进行了动态的拼接,导致攻击者可以构造其想要执行的SQL语句,进而发生数据泄露问题。本文通过讲述SQL盲注原理、攻击方式、注入流程和相应python脚本的编写,提出相应的SQL注入防御策略,为SQL注入攻击的安全防护工作提供有效的解决思路。
參考文献
[1]韩宸望,林晖,黄川.基于SQL语法树的SQL注入过滤方法研究[J].网络与信息安全学报,2016,2(11):70-77.
[2]赵宇飞,熊刚,贺龙涛,等.面向网络环境的SQL注入行为检测方法[J].通信学报,2016,37(2):89-98.
[3]刘志光.Web应用防火墙技术分析[J].情报探索,2014(3): 103-105.
[4]李鑫,张维纬,隋子畅,等.新型SQL注入及其防御技术研究与分析[J].信息网络安全,2016(2):66-73.
[5]张慧琳,丁羽,张利华,等.基于敏感字符的SQL注入攻击防御方法[J].计算机研究与发展,2016,53(10):2262-2276.
[6]刘岳,盛杰,尹成语.Web应用中SQL注入攻击与防御策略研究[J].网络安全技术与应用,2017(4):109-111.