深入研究PHP程序开发中存在的漏洞
2016-05-30胡华海王新宇
胡华海 王新宇
摘 要:PHP作为当前最流行的动态网页的设计语言之一,并且在网络环境中很多PHP语言开发出的脚本语言都是开源的,但PHP语言和其他语言一样也存在些漏洞,接下来我将从代码分析的角度来分析PHP中存在的一些安全漏洞。
关键词:PHP;XSS攻击;SQL注入
在涉及apache服务器系统安全问题方面我们不在深入分析,我们主要是来介绍PHP中存的漏洞问题及解决方案。PHP存在的漏洞比较多,我们不一一列出,在这里我们主要找了一些代表性的案例,每种漏洞都有相应的解决方法,接下来我将对目前常见的以下几种漏洞提出自已的一些解决方案。
一、PHP程序开发中存在的漏洞
ecshop最新版本存储XSS至后台。
这个漏洞是利用定单处理页面:flow.php的填写收货人地址页面没有对邮件进行有效的过滤,导致管理员在后台的订单页。
比如我们在邮件框中输入:
" onmouseover="$import('http://www.gongJiDeJS.com/test.js','js')" "
其它内容填好,虽然在在init.php文件中会进行一个addslashes但写入数据库后内容就恢复输入的内容了。
这种漏洞虽然在客户端用了JS判断邮件合法性但客户端JS可以关闭,所发在开发时不要太相信客户端的JS判断。JS只是一个增加客户体验,不能完全相信提交过来的数据。尤其是攻击者,他们会想提交各种攻击串来达到目的。
程序在使用这些数据时也不能只通过addslashes来添加转义。要严格判断提交数据的合法性,如邮件必须判断为正确的格式,显示的文本要判断是否有script标签或其它的引入文件标签防止加载攻击JS代码丢失客户或管理员的COOKIE。包含html标签的都转换为HTML特殊符号转义等。尽量不要直接使用。
(一)ecshop最新版本SQL注入+存储XSS=任意管理员登录。
这个漏洞是利用站外广告统计处理页面:affiche.php的from参数传入SQL,直接写入数据库ecs_adsense中在后台管理员进入 报表统计 -> 站外投放JS 菜单时该页面又没有对这个参数进行过滤便使用到第二个SQL中很容易形成了“二次注入”。
同第一个类似,可以方便的获取管理员的COOKIE,如果这个时候你知道了该系统的表前缀,还可以进行SQL注入获取管理员的密码。
当然还有其它可用的SQL来注入,获取想要的内容,比如系统配置数据等。这种漏洞完全是程序没有对提交的数据进行过滤,虽然的客户端没有什么影响,但管理员进入后台时,打开对应的页面就会执行攻击者想要的操作,如果攻击者能及时得到管理员的COOKIE就可以进入后台管理,达到攻击的目的。来源地址中说解决方案是 addslashes, 输出时过滤 虽然解决了问题但不完善,应该从输入时就过滤,去掉不合法的地址。
(二)ecshop最新版本一处用户权限越权。
这个漏洞是利用了页面中的隐藏表单元素。强制修改里面的值来破坏数据库里的记录。
ecshop里的用户可以修改自己的配送地址,但存在着address_id隐藏域,只要动修改下里面的值进行循环就可以清空或修改所有其它用戶的配送地址。
主要的是修改配送地址的程序没有做用户判断,而直接用了配送ID筛选,使用的程序是:
/includes/lib_transaction.php 516行,save_consignee方法
if ($consignee['address_id'] > 0)
{
/* 修改地址 */
$res = $GLOBALS['db']->autoExecute($GLOBALS['ecs']->table('user_address'), $consignee, 'UPDATE', 'address_id = ' . $consignee['address_id']); //看,没判断user_id吧?
}
虽然这个漏洞不能获取管理员的数据,但是可以破坏用户的配送地址。极其不安全。这个漏洞利用的是SQL查表筛选条件不足,在修改配送地址时没有以用户ID加配送ID进行筛选,只用到了配送ID,如果我们修改配送ID那就可以直接修改其它不属于该用户的配送数据,一断循环那就会影响整个配送表的数据,因此在查表时一定要做好筛选,尤其是接受提交数据进行筛选,能进行用户ID的一定要加上去,避免类似漏洞发生,同样要对这个提交过来的筛选内容进行过滤,能为数字一定要强制转换下等。
二、结语
这里所能说明的是大部分PHP程序漏洞是没有对用户提交来的数据进行验证导致的,所以对客户提交的所有数据进行适当的验证转换是网站安全的基本,如果是数值的一定要强制转换为对应的数值类型,如果是字符串的一定要加addslashes处理下,邮箱一定要进行匹配验证,如果要做二次查询SQL时并且使用到用户提交过来的数据(字符串类的)一定要再加一次addslashes才能进入SQL中,否则容易产生二次注入,如果要显示客户提交过来的文本类数据要进行htmlentities转换HTML实体字符,解决掉XSS攻击的可能,如果特殊情况不能去掉HTML实体字符,那必须处理好JS的引入操作,查找出一些script、标签和一些JS事件。
参考文献:
[1] 陈益材,等.PHP+MySQL+Dreamweaver 动态网站建设从入门到精通(附多媒体语音教学光盘).环博文化组.机械工业出版社.2012,6.
[2] 杨宇.PHP典型模块与项目实战大全[M].清华大学出版社,2012,1.
[3] 陈湘扬,陈国益. PHP5+MySQL网页系统开发设计[M].北京:电子工业出版社,2007,5.
[4] 宋正荣.基于PHP-MVC的Struts标签的实现[D].铜陵学院报,2005,4.