PHP安全开发漫谈(一)

0x01 导读概述

应用系统的漏洞漏洞是网络安全问题的根源,而漏洞的产生往往是开发人员“不知不觉”导致的,如安全意识不强、工作疏忽以及安全防范技能有所欠缺等。近几年,随着全球信息化程度及互联网化程度的提高,越来越多的系统承载在Web之上,所以,如果能在Web系统的设计、开发之初去避免漏洞,就能有效的减少安全问题的产生,从而在一定程度上改善整个网络的安全状况。

全球80%的Web系统是使用PHP语言研发的,可见,从代码安全的角度做好PHP项目的意义重大。今天0xUn1on团队,从实际开发过程中积累的宝贵经验,总结PHP项目安全研发的方方面面,深度剖析安全问题的各种场景,让PHP开发人员了解安全原理与安全风险,让Web渗透测试人员从原理上了解漏洞产生的原因和解决措施,提高对安全原理与安全风险的认知。

PHP通常用来开发Web应用。对于Web应用来说,传统的Web网络层的防护手段,如防火墙、入侵检测系统、入侵防御系统等,无法阻止或检测到Web应用层的攻击。攻击者一旦发现Web漏洞就可以穿透网络层,直接对后面的业务层数据库、文件系统、服务器发起攻击,毁坏或窃取企业数据。

0x02 问题原因

我们从开发人员、用户、攻击者的关注点来理解安全问题产生的原因。

图片[1]-PHP安全开发漫谈(一)-星辰信安

图1 开发人员的关注点

图片[2]-PHP安全开发漫谈(一)-星辰信安

图2 用户的关注点

图片[3]-PHP安全开发漫谈(一)-星辰信安

图3 攻击者的关注点

开发人员、用户、攻击者的考虑和关注角度不同。单个系统的设计和开发人员是少数群体,甚至有一个人同时参与多个系统的开发,安全知识的范围有限,由于系统是公网上运行,与庞大的恶意攻击群体相比形成了攻防的严重不对等,如下图所示。

图片[4]-PHP安全开发漫谈(一)-星辰信安

图4 攻防对比悬殊

由于攻击者更多的是关注系统的弱点,只要攻击者找到了一个系统漏洞,整个系统就将遭到攻击或被攻击者利用去攻击其他系统。

0x03 安全原则

如何避免系统被攻击,如何减少漏洞的数量,以及如何修复漏洞,可以从以下几个方面入手。

不可信原则

对Web应用系统来讲,访问系统的用户几户都是不被信任的,他们当中隐藏着攻击者。开发人员应该时刻保持警惕,对所有用户的输入和输出进行检查。

1.检查所有的输入

合法的输入才可以进行流程,这样才能最大程序保证程序的安全。一般情况下,要检查输入内容包括URL、GET、POST、Cookie、Referer、User-Agent等。当用户提交数据时需要根据字段本身的性质进行检查,检查数据长度、范围、格式、类型是否正确。当发现非法数据时,应该立即阻断响应,而不是修复数据,防止发生二次污染或者遭到攻击。

为加强Web应用系统的安全性,应采用前后端数据检查相结合的方法来完成对用户输入数据的检查,避免只在前端通过客户端脚本完成数据检查,因为攻击者很容易绕过前端,如SQL注入攻击等。尽量规范用户输入的内容,除了过滤输入的非法数据外,严格禁止上传非法文件,防止仿生越权、命令执行等漏洞。

2.检查所有输出

保证输出数据的合法性,防止输出数据夹杂用户的自定义数据。防止输出数据被篡改的可能性。特别注意邮件内容输出、短信内容输出,因为这些输出容易被恶意攻击者利用为钓鱼攻击、非法广告宣传等;防止输出内容中夹杂用户可控的脚本数据,因为攻击者可以通过这些数据控制页面内容和窃取服务器及用户信息。

3.数据在传输过程中的安全

为了防止传递到服务端和从服务端回传的数据被监听截获以及被篡改,通常的做法是为数据添加时效性,或者将数据进行加密处理,采用合理的方式保证数据的安全传输。

最小化原则

开发人员在项目中要对用户的每一次访问、每一次数据操作都要进行身份认证。确认当前用户的真实身份后,讲用户的可见范围控制在允许的最小范围,并去访问用户的权限和数据。

1.权限最小化

仅限于用户能访问的页面,不能让用户跳出网络系统的限制,访问到别人的数据,或者直接查看数据库,甚至控制服务器。只授予用户必要的权限,避免过渡授权,可以有效地降低系统、网络、应用、数据库被非法访问的概率。

服务器目录的权限要做出限定,比如,存放上传文件的目录,都不应该有执行权限,防止用户通过执行程序获取服务器权限等。

2.暴露最小化

Web应用系统需要与外部数据源进行频繁通信,主要的外部数据源是客户端浏览器和数据库。如果你正确地跟踪数据,就可以确定哪些数据会暴露。公共网络是最主要的暴露源之一,要防止数据被暴露在Web应用系统上。

数据暴露不一定就意味着安全风险,但是要尽可能最小化暴露。例如,一个用户进入支付系统,在向你的服务器传输他的支付数据时,要防止在传输过程中被窃取,你应该用安全套接层(Secure Sockets Layer,SSL)进行保护。如果你要在一个确认页面上显示他的支付信息,由于该支付信息是由服务端发向他的客户端的,因此同样要用SSL去保护它。SSL可以降低风险,但比较好的方案是只显示支付信息的最后部分数字或信息来达到降低风险的目的。

简单就是美

PHP流行的原因是上手容易,简单易懂。我们看下图几个关键要素形成的项目金字塔图。

图片[5]-PHP安全开发漫谈(一)-星辰信安

图5 项目金字塔

功能正常、保障系统可用、业务流程完整,是对一个系统的基本要求。如果一个系统可读性特别差,维护难度高,很容易引起功能异常,项目交付时间会不断被拉长,即使暂停交付,隐藏的问题在后期也会不断暴露出来,影响用户正常使用。

1.易读易维护

做一个项目,在保证它能正常满足需求的情况下,易读易维护是第一位,而复杂不仅会滋生错误,而且很容易导致安全漏洞,使得业务功能、系统安全、性能优化无从下手。研发过程中,代码上使用清晰的流程结构,保持逻辑清晰,可以在一定程度上避免安全问题的发生。

2.系统安全有保障

在项目易读易维护、基本功能正常的前提下,再来考虑系统的安全性,对系统进行加固。安全漏洞的存在,轻则功能异常,重则系统崩溃,更有甚者导致数据全部泄露,给用户和企业造成无法挽回的损失。

3.性能扩展性强

一个完美的项目,离不开可靠的性能和良好的扩展性。性能与扩展性依赖于项目的易读易维护性,反之,系统性能优化和扩展将无法进行。随着系统业务量和功能的不断增加,原有的性能和扩展性差的项目将被废弃,企业将不得不重新进行规划和投入更高的研发成本。

组件安全

为了使Web应用系统功能更为强大,可以使用组件,组件在带来强大功能的同时也会带来安全隐患。对于内置组件的使用,应当有明确的使用范围;对于自己注册的组件,必须认真考虑组件的效率和是否有漏洞;对于第三方组件,要明确来源,检测是否有后门程序。

如PHP本身的图片处理功能比较弱,通常通过借助第三方组件ImageMagick来加强PHP的图像处理能力。由于功能强大、性能较好,并且对很多语言有拓展支持,因为在程序开发中ImageMagick被广泛使用,比如生成用户头像,编辑图片等。

2016年5月,ImageMagick被爆出命令执行漏洞,虽然危害不是太大,但是由于大量的Web程序使用了其拓展功能。导致这些本地命令执行漏洞在Web环境里可以被远程触发,变成了危害巨大的远程命令执行。

对于此类威胁,开发人员应该时刻关注官方发布的最新补丁,及时升级所用的应用软件,以免恶意攻击者有可乘之机。

0x04 小结

耽误各位师傅一点时间,小浪用了一点篇幅总结了PHP目前的安全状况,呼吁开发人员在开发过程中重视安全问题。

这篇文章主要探讨了PHP项目安全问题在大环境下所面临的严峻挑战。在攻防严重不对等的今天,不能只依赖基础安全设备和框架来避免所有的安全威胁,每个开发人员都应具备安全研发能力,从根本上解决安全问题,避免产生安全问题。同时,我也通过对项目安全开发的要求,无论是开发过程中还是生产环境中都要遵守安全原则。

温馨提示:一切未经授权的渗透测试行为均为违法行为。
© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享