PHP下SQL注入攻击与防范

2019-06-11 11:15肖孝楠伍岳王雪梅
现代职业教育·高职高专 2019年3期
关键词:防范措施网络安全

肖孝楠 伍岳 王雪梅

[摘要]“没有网络安全就没有国家安全”,网络安全的核心是保护网络可共享资源的安全。SQL注入攻击是最常见的一种网络安全问题,被OWASP列为“十大Web应用系统安全威胁之首”。以DVWA渗透测试平台,以PHP+Mysql环境为例,介绍SQL注入攻击的过程和基本原理,最后给出安全防范措施,为防御SQL注入攻击提供一些方法和手段。虽以PHP环境为例,但对其他编程语言开发的Web程序也有借鉴意义。

[关键词]网络安全;Web安全;SQL注入;防范措施

[中图分类号]TP393

[文献标志码]A

[文章编号]2096-0603(2019)07-0036-02

在“互联网+”时代,越来越多的服务在网上完成,越来越多的系统是基于互联网的Web系统,而其中绝大多数系统需要后台数据库支持,数据库中数据的安全问题则成为重点关注的问题。SQL注入是最常见的一种数据库安全漏洞,被0WASP(开放式Web应用程序安全项目)列为“十大Web应用系统安全威胁之首”。

一、SQL注入基本原理

(一)SQL注入攻击的定义

结构化查询语言简称SQL语言,是一种专门用于关系型数据库的编程语言。SQL注入攻击主要有两种形式,一种是将恶意代码嵌入在正常的SQL语句中,传递到后台数据库服务器执行,这种攻击被称为“直接攻击”或“一阶SQL注入”。另一种是事先将恶意代码保存到数据库,在攻击者第二次请求时响应并攻击数据库,这种攻击称为“间接攻击”或“二阶SQL注入”。SQL注入具有如下的特性:

(1)广泛性:任何一个基于SQL语言的数据库都可能被攻击,很多开发人员在编写Web应用程序时未对从输入参数、Web表单、cookie等接受到的值进行规范性验证和检测,通常会出现SQL注入漏洞。

(2)隐蔽性:SQL注入语句一般都嵌人在普通的HTTP请求中,很难与正常语句区分开,所以当前许多防火墙都无法识别予以警告,而且SQL注入变种极多,攻击者可以调整攻击的参数,所以使用传统的方法防御SQL注入效果非常不理想。

(3)危害大:攻击者通过SQL注入获取到服务器的库名、表名、字段名,从而获取到整个服务器中的数据,对网站用户的数据安全有极大的威胁。攻击者也可以通过获取到的数据,得到后台管理员的密码,然后对网页页面进行恶意篡改。这样不仅对数据库信息安全造成严重威胁,对整个数据库系统安全也影响重大。

(4)操作方便:互联网上有很多SQL注入工具,简单易学,攻击过程简单,不需要专业知识也能自如运用。

(二)案例演示

下面使用DVWA(Damn Vulnerable W eb Application)演示SQL注入过程,系统环境为PHP+Mysql。

1.正常输入

我们先进行一次正常查询,在BH框中输入1,预期显示BH为1的用户信息,如图1所示。查看源码为:$querySQL=“select*from tab_user where bh={$bh}”,构造语句为:“select * from tab_userwherebh=1”。这是正常输入,输出的结果与预期相符。

2.获取查询结果列数

SQL语句中加入order by子句,可以检测查询结果中包含多少列。如图2所示,输入:“1 or3=3 order by 1 #”,此语句where查询条件中逻辑或一个3=3的恒等式,所以不管表中是否有BH为1的用户,都能够查询成功。继续输入“1 or 3=3 order by 2#”,“1or3=3orderby3#”,按照第一二列和第三列排序,语句执行正常,说明查询结果中至少包含三列;输入“1 or 3=3 order by 4#”,语句执行失败,说明结果列的数量只有三列。

3.获取当前数据库

输入“1 union select 2,2,database()#”,其中database()函数可以返回当前数据库名,输出结果如图3所示,可以看到当前数据库为“injection。

4.获取数据库中的表

输入:“1 union select 2,2,group_concat(table_name)frominformation_schema.tables where table_schema=database()#”,提交后屏幕上显示当前数据库中有两个表,表名为tab_user和test。

5.获取表中字段

输入:“1 union select 2,2,group_concat(column_name)frominformation_schema.columns where table_name=‘tab_user #”,提交后在看到tab_user表包含的三列,分别为bh,name,password。

6.获取表中数据

输入:“1 union select 2,group_concat(BH,name),group_concat(password)from tab_user #”,即可以查詢出tab_user表中的用户名和密码这些重要数据,结果如图4所示。

二SQL注入防范措施

SQL注入攻击方式很多,在这个案例中我们使用简单的SQL注入攻击手段轻松获得数据库中未授权的信息,可见SQL注入攻击危害极大。如何防止或减轻SQL注入攻击?当然“防患于未然是最好的策略,下面从多个角度介绍一些SQL注入攻击的防范措施。

(一)数据库服务器端防范措施

1.数据库服务器做好加固,安装防火墙,及时打补丁,使用最低权限账号运行数据库。

2.修改一些数据库端默认配置,比如oracle数据库中数据库链能够被远程访问,应该将其从普通账户中移除。

3.删除系统安装时的默认账户,重新创建账户,根据应用定制账户,每个账户只授予最小权限。

4.隔离用户登录,将查询权限与增、删、改权限分别用不同的账户来实现,使每个登录权限仅仅具有其功能所必需的数据库访问权限。

5.撤销public权限,不使用“grant…to public”语句进行授权,精确授权。

6.删除危险的系统存储过程、函数,比如SQL SERVER中的xp_cmdshell、sp_configure 等。

7.使用数据库端编程,自定义存储过程或自定义函数,并且给某些用户只授予execute权限,前端程序只能通过调用存储过程或者函数来访问数据库。

8.对传入存储过程的参数进行有效性验证,避免数据成为SQL控制流的一部分。

9.口令等敏感数据不能直接存储在数据库中,最好是存储口令的加盐哈希。其他关键数据也都使用强加密技术进行存储。

10.避免明显的对象名。比如表中存密码的列名定义为password,pwd,pass等,这是个安全隐患。

(二)Web服务器端防范措施

1.安装Web应用防火墙,关闭不需要的端口和权限,设置安全目录保护重要文件。

2.使用独立的主机做服务器,避免与数据库服务器部署在同一台主机上。

3.提高Web日志详细程度,定期查看日志。

4.使用空的默认Web站点,查询请求未找到匹配值,则默认跳转到该站点。

(三)Web前端程序防范措施

1.验证每一个输入值,对用户请求的数据进行过滤。

2.封装输入校验类,对输入项校验通过后,再用于构造动态SQL语句。

3.使用预编译的SQL语句绑定变量,使攻击者无法改变SQL语句的结构。如:

$stmt=$conn?prepare(“INSERT INTO MyUsers(XM,id,adr)VALUES(?,?,?)”);

$stmt?bind_param(“qaz”,$id,$adr)。

4.使用参数化语句,避免在前端构造动态SQL。

5.检查数据类型。

6.隐藏不必要的错误信息。

7.输入的内容用其他控件产生,比如密码通过软键盘输入,动态写人页面。

三、结语

SQL注入是一种常见的攻击手段,危害极大。本文通过案例演示介绍SQL注入攻击的过程,并总结了常用的防范措施,有助于一定程度上减轻SQL注入的危害,具有一定的应用价值。

随着技术的发展,SQL注入的漏洞也在更新,SQL注入攻击技术也在发展,它的隐蔽性和攻击性更强。所以随着新技术的不断出现,SQL注入漏洞的研究也要不断深入。

参考文献:

[1]黄芳,苏桂莲.Web应用中SQL注入攻击与防范探析[J].软件导刊,2012,1(11):137-138.

[2]唐林.数据库SQL注入技术及其防护[J].湖北函授大学学报,2014(10):104-105.

[3]吴宗卓.SQL注入防御技术研究与实现[J]电子测试,2015(21):81-82.

猜你喜欢
防范措施网络安全
夏季开空调,怎样才能不生病?做好这些防范措施很重要
心脑血管内科护理安全隐患及防范措施探究
矿山机电运输中的隐患及防范措施探讨
邯郸市档案馆积极开展网络安全宣传教育
在护理血液透析过程中存在的危险因素及相应防范措施
全国多地联动2020年国家网络安全宣传周启动
新量子通信线路保障网络安全
全省教育行业网络安全培训班在武汉举办
保护个人信息安全,还看新法
中国网络安全产业联盟正式成立