APP下载

关于呼伦贝尔地区PHP网站安全漏洞的分析和研究

2016-01-25

呼伦贝尔学院学报 2016年1期
关键词:学号字符串安全漏洞

王 欣

(呼伦贝尔学院网络中心 内蒙古 海拉尔区 021008)

一、引言

随着互联网的深入发展,各企事业单位的门户网站已经成为了对外宣传和提供信息服务的窗口。PHP因为其功能强大、入门学习简单、代码执行效率高等优点,成为了Web应用开发的流行语言。由于广泛使用,且没有像针对ASP网站那么多的入侵工具,所以网站开发者对PHP的后台并不重视,大部分设计者在编写网站代码时,对页面变量的过滤仅仅参照于 ASP,但这些变量大多数都不安全。所以利用PHP安全漏洞对Web网站进行攻击的行为也越来越多,这给Web应用的安全带来了严重的威胁。

呼伦贝尔地区据不完全统计有网站980余个,其中以PHP代码编写的网站数量约占30%。作者长期以来一直关注着本地区的 Web网站安全状况,近期对区域内的PHP网站进行了一次安全漏洞扫描,根据扫描结果来进行分析,很多网站存在语义 URL、跨站请求伪造、跨站脚本、SQL注入、文件上传等安全漏洞。本文将对呼伦贝尔地区PHP网站普遍存在的语义URL和SQL注入安全漏洞进行分析,并找出解决安全漏洞的方法。

二、语义URL安全漏洞的攻击与防范

语义 URL攻击是利用URL特性进行的一种攻击。URL是定位Internet资源的重要手段,在很多的应用中,常常可以见到利用 URL 来将参数传递到另一个程序。如果用户出于某种目的而改变其中某些参数的值,这就产生了语义 URL 攻击。

有关语义 URL 攻击的一个典型例子是 Web应用中的密码找回系统。在实际应用中,很多用户登录表单的旁边常有一个“忘记密码”的链接,当用户忘记密码时,可以点此链接进入到密码找回系统界面。 密码找回系统通过询问用户特定的问题并根据用户的答案来判断当前用户是否是找回自己的密码,如果是,则系统将提供一个表单让用户输入一个Email地址,以便系统将密码发送到此 Email 地址所在的邮箱。接受Email 地址的表单HTML代码假设如下所示:

此表单含有一个隐藏域,用于存储要找回密码的用户名。从上面的表单 HTML代码可以看出,当用户按下“提交”按钮时,浏览器地址栏将出现以下信息:http://…/resetpass.php?user=Cheng&email=cmhman@yahoo.com.cn

用户若对 Web 知识有所了解,其便会注意到上述 URL 是带参数的。如果将上述 URL 中的user 参数的值改为其他人的用户名,邮箱地址不变,那么该用户就可以重置并获得他人的密码。

上述密码找回系统中的语义 URL 攻击,其发生的根本原因在于 resetpass.php 没有对 URL 中提交的 user 参数值进行验证,使得攻击者有机可乘,非法重置并窃取他人密码。为了防范上述密码找回系统中的语义 URL 攻击,必须对用户身份(即 user 参数值)进行确认,采用 Session 跟踪是一个比较好的方法,代码如下:

在上述代码中,$_SESSION['verified']是在用户正确回答了问题后产生的,用它来和表单隐藏域中的参数值进行比较,便可知道此用户是否是合法找回密码的当前用户而不是攻击者。

三、SQL注入攻击的产生原因和防范措施

Web 应用程序未对用户输入进行严格验证和过滤, 致使攻击者可以注入各种特殊字符串、SQL命令等,是导致网站受到 SQL 注入攻击的根本原因。下面用一个实例来具体说明未对用户输入进行验证是如何产生 SQL 注入攻击的。假设某高校教务管理系统有一个学生成绩查询页面,学号是查询学生成绩的关键字之一。一般情况下,学生的学号都是由数字组成的字符串,在查询时,只要输入合法的学生学号,就可以获得该学号所对应学生的各门课成绩。如果该教务管理系统在查询学生成绩时,采用的是通过输入参数动态构造SQL 语句并提交数据库执行的方法,那么,程序的实现代码有可能为:

如果查询者输入的是合法的学号(如 123456 7890),那么提交给MySQL 数据库(此处假定该教务系统后台使用的是 MySQL 数据库,其他数据库的原理相同)执行的 SQL 语句最终为:select* from Grade where Sno='1234567890'

该语句是一个能够返回学生成绩的正常 SQL语句,自然不会出现什么问题。但是,若查询者不输入合法的学号,而是输入如下参数:1234567890';

delete from Grade where Sno='1234567890'--,则最终提交给MySQL数据库执行的 SQL 语句为:

从上述提交给数据库执行的SQL语句可以看出,学号为 1234567890 的学生的成绩将被删除。由此可以看出,如果对用户的输入盲目信任而不加严格验证的话,是可能发生SQL注入攻击的。SQL 注入攻击产生的根本原因是系统开发人员在开发Web应用系统时未对用户的输入进行严格的验证。因此,针对 SQL用户输入的验证,下面是行之有效的一些具体措施:

(一)使用参数化查询

攻击者进行SQL注入攻击的常用手段一般是在系统接受用户输入的地方注入非法SQL指令并使数据库系统执行,采用传统方法动态构造 SQL语句的 Web系统常受此问题困扰。采用参数化的查询手段可以在很大程度上对SQL注入攻击进行有效避免。参数化查询方法与传统的动态构造SQL语句有很大的不同。参数化查询不会将用户的输入作为SQL命令来执行,原因是:采取参数化查询方法,数据库系统在执行SQL语句时,会编译事先设计好的SQL指令,然后再套用用户的输入参数,之后才由数据库执行。这样一来,即便攻击者输入的不是合法参数而是恶意SQL命令,其也不会得到执行,而只能作为参数处理,因为此时SQL语句中的命令部分已经编译完毕,不会对用户输入的恶意 SQL命令再进行编译了。通过这样的机制,绝大部分的SQL注入攻击都可以得到有效的防范。下面以MySQL数据库为例,看看参数化查询的一种具体实现方法:

使用参数化查询方法,可能会对程序的维护及某些功能的实现带来不便,但是,这与不使用参数化查询,系统可能遭受SQL注入攻击相比,些许的不便还是值得的,毕竟作为一个面对各种类型客户的Web系统来说,安全是十分重要的。

(二)对输入数据进行验证

从SQL注入攻击产生的原因可知,对用户输入进行严格验证,也是行之有效的防范SQL注入攻击的手段。对用户输入进行验证的方法有很多种,要根据具体情况进行选择。总的说来,有如下一些方法:

1.对用户输入数据的类型进行验证

在Web应用程序中,变量的类型大致可以分为三种:数字型、日期时间型、字符串型。因此,用户输入的数据类型一般情况下也不外乎以上三种。对要求数字型和日期时间型的用户输入进行验证是比较方便的,因为开发Web应用程序的各种脚本语言几乎都有相应的函数可以用来对这两种变量值的类型进行判断。比如,在PHP中,验证用户的输入是否为数字型可以使用函数 is_integer()、is_double(),前者用于验证用户输入是否为整数,后者用于验证用户输入是否为浮点数;验证用户的输入是否为有效的日期时间,可以使用函数checkdate()。对于前面在 SQL 注入产生原因的分析中所举的例子,因为学号一般来说是由数字组成的字符串,因此,对输入学号的验证可以采用函数 is_integer()来进行,如果判断下来,用户输入的是一个整数,那么就可以认为其输入的是合法学号。

如果 Web 应用程序要求用户输入的不是数字类型参数,也不是日期时间类型参数,而是可能由各种字符组成的一般字符串,那就不能采用判断数据类型的方法来验证用户的输入了,而这种情况恰恰又是 Web 应用中最常见的。下面研究当输入为一般字符串时的验证方法。

2.利用正则表达式对用户的输入进行验证

在一般情况下,对于大多数Web应用程序来说,用户的输入不管是在外在形式还是在内在属性上,都是有一定规律可循的,比如,如果在用户注册及登录时要求输入邮箱信息,由于邮箱具有特定的格式:用户名@域名,我们就可以构造一个正则表达式对用户的输入进行验证。使用正则表达式除可以对用户的输入进行验证之外, 还可以规范化用户的输入,而规范化用户的输入对于防范未知的 SQL 注入攻击形式是及其有效的。

3.对用户输入的长度进行验证

众多的实践表明,对用户输入长度进行验证对于防范SQL注入攻击特别是对于编解码字符串形式的SQL注入攻击是十分有效的。利用正则表达式规范化用户的输入不能防范编解码形式的SQL注入攻击,例如:若正则表达式规定用户在输入字符串中不能包含单引号,但用户如果将单引号进行编码后输入,然后再解码还原为单引号的本来形式,正则表达式就检测不出来了。除了单引号外,对于其他的字符也可以用编解码的形式逃过正则表达式的检测。但是,输入字符通过编码以后,输入的长度会增加,如果程序对用户输入的长度进行了规定,那么编码后的字符串就不会被系统所接受,从而有效地防范了编解码形式的SQL注入攻击。

(三)对数据库及PHP配置文件进行合理设置

对于一个已经存在并正在使用的PHP网站来说,如果在原先的开发过程中没有注意进行 SQL注入攻击方面的防范,自然是十分危险的。但是,为了防范SQL注入攻击而全面修改Web应用程序代码,也显得不太现实,付出的代价是难以承受的。在这种情况下,为了最大可能防范SQL注入攻击,可以对数据库及PHP配置文件进行适当设置。在数据库方面的设置主要有禁止远程连接数据库、删除多余用户、目录访问权限限制、数据库服务器权限控制、禁止多语句查询等。PHP 配置文件的设置主要是打开 magic_quotes_gpc 选项和关闭错误信息的显示, magic_quotes_gpc 选项打开以后,系统将对向数据库提交的 SQL 查询进行转义,从而在相当程度上减少了 SQL 注入攻击的发生。系统错误信息显示关闭以后,程序运行出现错误时,就不会在客户端浏览器显示出具体的错误信息,这样可以防止攻击者进行错误查询攻击来获得数据库敏感信息。

四、结束语

通过对语义URL和SQL注入漏洞的分析,最终得出了解决这两项PHP网站主要安全漏洞的方法。只要PHP网站开发人员和网站管理员提高网络安全意识,在开发和管理网站的过程中采取适当的措施,大部分PHP安全漏洞还是可以防范的。

猜你喜欢

学号字符串安全漏洞
基于文本挖掘的语词典研究
基于模糊测试技术的软件安全漏洞挖掘方法研究
我们来打牌
智能设备安全漏洞知多少
安全漏洞太大亚马逊、沃尔玛和Target紧急下架这种玩具
尝试亲历的过程,感受探究的快乐
安全漏洞检测技术在计算机软件中的应用
学生学号的妙用
最简单的排序算法(续)
与56号说再见