/ Web安全

从PHP框架社区现状看框架安全问题

0x01 框架热度数据

对于框架的热度我从搜索引擎/开源社区活跃度/全网使用量等几个维度进行了简单的调研。
php框架百度搜索热度
百度搜索趋势可以清晰的反应出国内各框架的热度,其中thinkphp在国内的搜索热度稳居第一,比其他框架高出很多,而laravel作为国际知名框架,在国内的搜索热度也不低。
php框架谷歌搜索趋势
框架的出现最早可以追溯到2006年之前,laravel作为后起之秀(2011年)却取得了巨大的成功,我觉得这不仅仅是框架设计非常优秀的原因,还和他的“广告词”脱不了关系,Larvel——The PHP Framework For Web Artisans。试问这个定位,作为Web开发者你敢不用?而其他的框架,对自己的定位相对Laravel而言就要庸俗很多,什么轻量啊简洁啊。为此Laravel荣登我的最会装逼框架排行榜第一名。
php框架开源社区贡献及Star
从github平台来看,CI作为一个由教育机构维护的框架在github上获得了较多的star数量,star数量各个框架间的比较并不是非常明显,而贡献者数量则差异非常大,社区非常活跃的Laravel其框架代码贡献量是最多的,而ThinkPHP则不足百人的贡献量,我觉得社区封闭是Thinphp框架安全性不如其他框架的一个重要原因。
php框架全网使用数据
全网数据从Fofa采集,数据不够准确,主要是根据web指纹进行的统计,部分框架由于指纹不明显因此没有进行统计,大致可以看出全网使用量最高的是Laravel,有34万,Thinkphp的使用量也不低有11.6万,其中8.9万是在中国。

0x02 框架安全数据

在对框架进行分析的过程中,我对几个主要框架的安全问题也进行了数据统计,并对各个框架出现的漏洞进行了分析,发现几个特点。框架出现较多的安全问题是注入,而注入出现问题的地方主要是框架自己实现的复杂查询方式过滤、处理不当导致。
php框架漏洞数据

在对具体框架出现的安全漏洞进行分析时,我发现ZendFramework是出现CVE漏洞最多的框架,由于Thinkphp没有CVE编号,根据我的不完全统计Thinkphp出现的安全问题是最多的,而这与Thinkphp背后由TopThink公司维护不无关系。
各php框架安全问题占比
对各个框架的安全漏洞进行分析,由于框架的使用范围广,因此框架出现的一些安全问题的风险评级也相对较高,很多情况下这些安全问题的可利用性并不是非常高,比如Thinkphp的insert注入,需要特定条件才能触发,在黑盒条件下漏洞利用难度高。

0x03 框架安全研究

0x0301 潜在的供应链攻击

在2017年出现了多起供应链攻击事件,如xshell/ccleaner。针对客户端应用的供应链攻击不易发现,存活时间长,而针对web框架的供应链攻击,由于其代码开源,安全审计人员众多,因此针对框架的供应链攻击难度更高,构造隐藏后门难度大,回报不如客户端应用高,但是根据目前框架安全现状以及历史出现的情况看,针对开源框架的供应链攻击是潜在可能出现的。

thinkphp官网造攻击

2013年,thinkphp官网由于源码泄露遭到攻击,攻击人员成功获取thinkphp官网下载服务器权限,可以任意修改官网所链接的下载文件,包括thinkphp全部版本的源码下载包。漏洞编号wooyun-2013-042182。而目前,这些站点经笔者测试仍然存在潜在的安全风险。

0x0302 利用框架代码构造无特征Webshell

目前由于存在大量的Webshell查杀方式,包括主机、流量两个层次,而主机Webshell检查又分为运行时和静态文件分析等方式。针对静态文件查杀Webshell的方式,如D盾等,主要依据危险函数进行查杀。通过利用原生代码中出现的可利用代码片段进行webshell隐藏可有效规避静态文件检查。以Thinkphp3.2举例。
利用框架代码构造无特征函数webshell
在Thinkphp框架源码中包含上图代码片段,其为一个Protected的成员函数。
利用框架代码构造无特征函数webshell

编写webshell,继承该类,并调用上述成员函数以达到Webshell执行命令函数的效果,规避了在Webshell中直接出现危险函数。

0x0303 代码审计

目前国内安全研究员主要针对Thinkphp的漏洞进行了大量的挖掘,近些年也报告了许多问题,主要涉及的审计层面包括有:

  1. 框架自身提供的功能安全性,如ORM操作
  2. 框架使用者使用不当导致的安全问题,如基于框架的二次开发CMS安全问题、Thinkphp Upload等。

0x04 结论

部分框架盲目的为开发者提供冗杂的功能,未从框架使用者的角度看待最主要的三个需求:便捷/安全/规范。框架即使使用了非常个性化的设计,如果学习成本低并且能提高代码编写效率,开发者会去接受并信奉这种约定,甚至会将这种约定作为一个优点从而得到推广。

0x05 补充

本文是2018.07.20组内分享的简单成文。