Nette框架未授权任意代码执行漏洞分析

漏洞介绍:

Nette Framework 是个强大,基于组件的事件驱动 PHP 框架,用来创建 web 应用。Nette Framework 是个现代化风格的 PHP 框架,主要用于国外网站开发,因此国内对该框架的研究比较少。 2020年10月,Nette框架被爆出存在未授权任意代码执行漏洞,可通过自有框架控制器MicroPresenter执行任意PHP方法。

环境复现:

通过查询发现该漏洞影响自2.0以来的几乎所有大版本,详细的范围如下

nette/application 3.0.6 (or 3.0.2.1, 3.1.0-RC2 or dev)

nette/application 2.4.16

nette/application 2.3.14

nette/application 2.2.10

nette/nette 2.1.13

nette/nette 2.0.19

通过composer安装受影响的3.0.0版本,执行composer create-project nette/web-project nette-blog 3.0.0@dev,安装完成后整体的目录结构如下:

其中app为应用程序的主目录,包含presenters控制类目录、config配置文件、router路由器类目录以及Booting.php应用启动文件。而vendor/nette目录下包含Nette的所有框架文件,www目录包含整个Web程序能够直接访问的文件,如静态资源、入口文件index.php等,同时在index.php中调用Booting中的boot方法引导启动。

Nette会创建Configurator类对象来对启动环境进行配置,如设置日志文件目录、临时文件目录、加载配置文件等。

后续会根据配置调用createContainer创建一个DI容器,并通过getByType方法实例化Nette框架主程序NetteApplicationApplication对象,最后调用了Application对象的run方法。

漏洞分析:

据网上披露的POC来进一步分析代码,从Application:run函数处打下断点,函数会调用createInitialRequest方法来初始化Request对象。

跟进到createInitialRequest方法,108行通过调用路由类的match方法来处理http请求,109行则是获取需要调用的控制器类,119行则是返回处理好的Request对象。

跟进match方法,发现路由器类的调用路径如下:

NetteApplicationRoutersRouteList->NetteRoutingRouteList->NetteApplicationRoutersRoute->NetteRoutingRoute::match,该方法主要将http请求处理后转换成数组。121行将网站请求路径中的基础路径删除赋值给$path,131行将$path按照presenter/action/id形式的正则进行匹配,并将匹配的部分分别标记为p0、p4、p13,148行则将匹配出的字符型key从 $this->aliases数组中取出对应的描述字段,其中p0对应为presenter,因此取出的控制器为$params[‘presenter’]=nette.micro。

继续跟进到173行,调用了$params[$name] = $meta[self::FILTER_IN]((string) $params[$name])处理$params,其中$meta[self::FILTER_IN]对应了path2presenter处理控制器部分,将nette.micro转成Nette:Micro。

 随后我们返回Application.php中的processRequest方法,这里我们主要关注控制器部分Nette:Micro如何被调用的,跟进114行到presenterFactory类的formatPresenterClass方法,调用路径为createPresenter->getPresenterClass->formatPresenterClass。

在该方法中,120行将$presenter用冒号分割,并对$mapping赋值为$this->mapping[‘Nette’]。

126行则将$mapping的第三个元素*Presenter中的*替换为Micro,并将$mapping的第一个元素和替换后的字符串相连,最终得到控制器为NetteModuleMicroPresenter。在Application.php的144-149行,程序调用了控制器NetteModuleMicroPresenter中的run函数,对应为nette/application/src/Application/MicroPresenter.php,69行获取传递进来的GET参数。

其中74行会检查callback参数传递进来的变量可否被当做函数调用,85行调用combineArgs方法获取回调函数中的默认参数名,并于GET请求传递过来的参数名比对,如果相同则保存在$res数组并返回到$params中。

返回到MicroPresenter.php的90行,这是一个典型的可变函数调用,在诸多PHP后门中比较常见,这里函数名$callback和参数$params都可控,可导致任意代码执行。以shell_exec方法为例,默认参数为cmd,构造对应的POC请求:

修复建议:

安装百度度御关WAF、高级威胁感知系统,以及智能安全一体化产品。

进行官方升级。

Nette框架未授权任意代码执行漏洞分析相关推荐

  1. CVE-2021-30461 - VoIPMonitor未授权远程代码执行漏洞

    VoIPMonitor未授权远程代码执行漏洞 0X001前言 0X002 漏洞影响 0X003 漏洞原理 0X004 漏洞复现 0X041 空间搜索寻找目标 0X042 测试代码执行 0X005 PO ...

  2. Gitea 1.4 未授权远程代码执行漏洞复现

    ​Gitea 1.4 未授权远程代码执行 一.漏洞描述 Gitea是从gogs衍生出的一个开源项目,是一个类似于Github.Gitlab的多用户Git仓库管理平台.其1.4.0版本中有一处逻辑错误, ...

  3. thinkphp日志泄漏漏洞_ThinkPHP框架被爆任意代码执行漏洞

    昨日ThinkPHP框架被爆出了一个php代码任意执行漏洞,黑客只需提交一段特殊的URL就可以在网站上执行恶意代码. ThinkPHP作为国内使用比较广泛的老牌PHP MVC框架,有不少创业公司或者项 ...

  4. thinkphp日志泄漏漏洞_ThinkPHP框架任意代码执行漏洞的利用及其修复方法

    ThinkPHP是国内著名的开源的PHP框架,是为了简化企业级应用开发和敏捷WEB应用开发而诞生的.最早诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,并且遵循Apache2 ...

  5. 绿盟科技网络安全威胁周报2017.22 关注Juniper Junos Space任意代码执行漏洞CVE-2017-2306...

    绿盟科技发布了本周安全通告,周报编号NSFOCUS-17-22,绿盟科技漏洞库本周新增13条,其中高危0条.本次周报建议大家关注 Juniper Networks Junos Space任意代码执行漏 ...

  6. HP officejet、PageWide打印机任意代码执行漏洞cve-2017-2741 Tenable发布漏洞检测插件...

    打印机无处不在.在企业,在家里,在学校,但你在做网络安全评估的时候是否考虑过他们?你上一次更新打印机固件是什么时候?您是否知道您的打印机有公共漏洞?Tenable安全公司进行了研究,并发布了漏洞检测  ...

  7. 基于qtc++设计文本编辑器的代码_文本编辑器Vim/Neovim被曝任意代码执行漏洞,Notepad:兄弟等你好久了...

    犹记前些日子,微软的记事本文本编辑器爆出了本地代码执行漏洞. Google Project Zero研究员Tavis Ormandy宣布在微软的记事本文本编辑器中发现代码执行漏洞. 可以看见,他在no ...

  8. Grafana 中存在严重的未授权任意文件读取漏洞,已遭利用

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 Grafana Labs 发布紧急安全更新,修复了影响该公司主产品 Grafana 仪表盘中的严重漏洞 (CVE-2021-43798),CVS ...

  9. 文本编辑器Vim/Neovim被曝任意代码执行漏洞,Notepad:兄弟等你好久了

    犹记前些日子,微软的记事本文本编辑器爆出了本地代码执行漏洞. Google Project Zero研究员Tavis Ormandy宣布在微软的记事本文本编辑器中发现代码执行漏洞. 可以看见,他在no ...

最新文章

  1. mysql会话级表_php – MySQL会话表方法
  2. 量子不可克隆 计算机,量子不可克隆证明及推理
  3. 使用vmware converter转物理机linux的问题
  4. 运维人员mysql如何访问_mysql 运维常见操作
  5. scut AccountServer 使用mysql
  6. 微信小程序|开发实战篇之七-steps进度条组件
  7. python3.6 配置COCO API出错解决方案
  8. Ubuntu上安装gcc
  9. matlab imagesc 白色,[转载]matlab 中imagesc的用法
  10. hsql转换oracle,Oracle To Hsql
  11. java怎么输出英文字母表_Java程序设计(八)----输出英文字母表、希腊字母表
  12. 红黑树区分 左旋 和 右旋
  13. Live-Charts在WPF中的使用
  14. 电脑端如何隐藏显示CAD图层内容
  15. 棒棒糖也能画成图—— ggplot2绘制棒棒糖图/哑铃图
  16. MYSQL-计算两个时间的时间差和工作日差
  17. 使用Java随机产生四位字母作为验证码
  18. Hadoop3.2.0 YARN资源配置
  19. PHP 加密、解密工具Zend Guard和ionCube
  20. TOJ 4354 HDU 4262 Juggler / 树状数组

热门文章

  1. Ubuntu下各种软件的安装和卸载
  2. 目标检测(CS230)
  3. 继承类的多态和实现接口的多态的区别
  4. 5分钟,关于Python 解包,你需要知道的一切
  5. python遗传算法_带有Python的AI –遗传算法
  6. 博弈——ICE公平组合游戏(简单整理结论)
  7. 完美定制你的QQ,把QQ里不要的文件通通删除!
  8. SFTP命令常用操作
  9. php扇形统计图怎么做,PHP实现绘制3D扇形统计图及图片缩放实例_php实例
  10. 开源操作系统期末知识总结