PbootCMS 3.0.4 SQL注入

1.漏洞复现

PbootCMS 3.0.4,下载仓库 · 星梦/PbootCMS - Gitee.com

复现

漏洞页面:http://127.0.0.1/?search 或 http://127.0.0.1/?keyword

POST请求:1=select 1

2.正向分析

从可见功能点正向分析

index.php

...
// 引用内核启动文件
require dirname(__FILE__) . '/core/start.php';

/core/start.php

...
// 启动内核
core\basic\Kernel::run();

/core/basic/Kernel.php

加密了,之后调用 IndexController类 的 _empty方法

...
*  翱云科技版权所有,未经许可擅自破解本文件将依法追究法律责任。
...

/apps/home/controller/IndexController.php

在 _empty方法 的开头添加:

// 空拦截器, 实现文章路由转发
public function _empty()
{var_dump(debug_backtrace());

访问主页,可以知道是 Kernel.php 调用的

array(4) {[0]=>array(7) {["file"]=>string(108) "D:\environment\phpstudy_pro\WWW\PbootCMS-V3.0.4\core\basic\Kernel.php(10) : eval()'d code(1) : eval()'d code"["line"]=>int(2)

通过对 search 或 keyword 进行 GET请求 都可以调用 SearchController类 的 index方法

// 空拦截器, 实现文章路由转发
public function _empty()
{  ...// 路由switch ($param[0]) {case 'search':case 'keyword':$search = new SearchController();$search->index();break;

/apps/home/controller/SearchController.php

调用了 ParserController类 的 parserSearchLabel方法

class SearchController extends Controller
{...public function __construct(){$this->parser = new ParserController();...}...public function index(){...$content = $this->parser->parserSearchLabel($content); // 搜索结果标签

ParserController类

/apps/home/controller/ParserController.php

class ParserController extends Controller
{...public function __construct(){$this->model = new ParserModel();}...// 解析内容搜索结果标签public function parserSearchLabel($content){...// 数据接收if ($_POST) {$receive = $_POST;} else {$receive = $_GET;}foreach ($receive as $key => $value) {if (! ! $value = request($key, 'vars')) {...$where3[$key] = $value;...}}// 去除特殊键值unset($where3['keyword']);...$data = $this->model->getLists($scode, $num, $order, $where1, $where2, $where3, $fuzzy, $start, $lfield, $lg);

页面中的搜索框是对 keyword 进行 GET请求 的,但是如果用 keyword 请求,变量会被销毁

所以要自己进行 POST请求(1=select 1),请求会被 request函数 处理后赋值给 $where3,然后处理 SQL语句

/core/function/helper.php

request函数

function request($name, $type = null, $require = false, $vartext = null, $default = null)
{if (isset($_POST[$name])) {$d_source = 'post';} else {$d_source = 'get';}$condition = array('d_source' => $d_source,'d_type' => $type,'d_require' => $require,$name => $vartext,'d_default' => $default);return filter($name, $condition);
}

设置了一个数组,然后通过 filter函数 进行过滤

array(5) {["d_source"]=>string(4) "post"["d_type"]=>string(4) "vars"["d_require"]=>bool(false)[1]=>NULL["d_default"]=>NULL
}

filter函数

function filter($varname, $condition)
{...$vartext = $varname;...// 数据源if (array_key_exists('d_source', $condition)) {switch ($condition['d_source']) {case 'post':$data = @$_POST[$varname];break;...// 数据类型检测if (array_key_exists('d_type', $condition)) {switch ($condition['d_type']) {...case 'vars':if (! preg_match('/^[\x{4e00}-\x{9fa5}\w\-\.,\s]+$/u', $data)) {$err = '只能包含中文、字母、数字、横线、点、逗号、空格!';}break;...// 返回收据return escape_string($data);
}

就是,并且data 只能包含中文、字母、数字、横线、点、逗号、空格,然后通过 escape_string函数 进行过滤

/core/function/handle.php

escape_string函数

Copy

// 获取转义数据,支持字符串、数组、对象
function escape_string($string)
{...$string = htmlspecialchars(trim($string), ENT_QUOTES, 'UTF-8');$string = addslashes($string);...return $string;
}

对 select 1 用 htmlspecialchars函数 和 addslashes函数 进行了转义

ParserModel类

/apps/home/model/ParserModel.php

getLists方法

数据过滤完之后通过 ParserModel类 的 getLists方法 处理 SQL语句

// 列表内容,带分页,不区分语言,兼容跨语言
public function getLists($scode, $num, $order, $filter = array(), $tags = array(), $select = array(), $fuzzy = true, $start = 1, $lfield = null, $lg = null)
{...return parent::table('ay_content a')->field($fields)...->where($select, 'AND', 'AND', $fuzzy)...;
}

就在select数组 中,通过 where方法 进行了 SQL语句 拼接操作

Model类

/core/basic/Model.php

where方法

在 return 上面添加,看看最终的 SQL语句 是什么:

final public function where($where, $inConnect = 'AND', $outConnect = 'AND', $fuzzy = false)
{...var_dump($this->sql['where']);return $this;
}

看到注入的 SQL语句 拼接到了最后

string(143) "WHERE(a.scode in ('5','6','7') OR a.subscode='5') AND(a.status=1 AND d.type=2 AND a.date<'2023-05-05 14:09:11' AND a.acode='cn' ) AND(select 1)"

本文为免杀三期学员笔记:https://www.cnblogs.com/Night-Tac/articles/17372836.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习中,batchsize的大小对训练结果有什么影响,如何正确使用

一、影响&#xff1a; Batch size在深度学习训练中起着非常重要的作用&#xff0c;它对训练速度、模型性能、以及模型的泛化能力都有影响。以下是一些主要的影响&#xff1a; 训练速度&#xff1a;较大的batch size可以更充分地利用硬件并行性&#xff0c;从而加快单个epoch的…

4G智慧电力物联网:建设高效智能,引领电力行业革新!

随着4G与物联网技术的快速发展为电力行业提供了更高效、可靠、智能化的解决方案。本文中智联物联将为大家分享智慧电力系统中的一些关键的物联网技术和通讯设备&#xff0c;如工业4G路由器、分布式发电站、数据采集传输、远程监控管理以及变电站监测。 光伏发电站是电力行业中重…

【NI USRP】哪些 USRP 设备支持全双工,哪些支持半双工?

译者 东枫电子科技 设备构成 NI USRPEttus USRPUSRP-2900B200USRP-2901B210USRP-2920N210 WBXUSRP-2921N210 XCVR 2450USRP-2922N210 SBXUSRP-2930N210 WBX GPSDOUSRP-2932N210 SBX GPSDOUSRP-2940RX310 WBX (x2)USRP-2942RX310 SBX (x2)USRP-2943RX310 CBX (x2)U…

万级数据优化EasyExcel+mybatis流式查询导出封装

文章目录 前言.千万级数据优化一. 直接上流式查询封装工具代码二. 传统分页导出查询三. 流式查询概念游标查询 前言.千万级数据优化 我们不妨先给大家讲一个概念&#xff0c;利用此概念我们正好给大家介绍一个数据库优化的小技巧&#xff1a; 需求如下&#xff1a;将一个地市表…

在kaggle中用GPU使用CGAN生成指定mnist手写数字

文章目录 1项目介绍2参考文章3代码的实现过程及对代码的详细解析独热编码定义生成器定义判别器打印我们的引导信息模型训练迭代过程中生成的图片损失函数的变化 4总结5 模型相关的文件 1项目介绍 在GAN的基础上进行有条件的引导生成图片cgan 2参考文章 GAN实战之Pytorch 使用…

Go 自学:切片slices

以下代码展示了两种建立slice的方法。 我们可以使用sort函数给slice排序。 package mainimport ("fmt""sort" )func main() {var fruitList []string{"Apple", "Tomato", "Peach"}fmt.Printf("Type of fruitlist is…

Django基础6——数据模型关系

文章目录 一、基本了解二、一对一关系三、一对多关系3.1 增删改查3.2 案例&#xff1a;应用详情页3.2 案例&#xff1a;新建应用页 四、多对多关系4.1 增删改查4.2 案例&#xff1a;应用详情页4.3 案例&#xff1a;部署应用页 一、基本了解 常见数据模型关系&#xff1a; 一对一…

好用的网页制作工具就是这6个,快点来看!

对于网页设计师来说&#xff0c;好用的网页设计工具是非常重要的&#xff0c;今天本文收集了6个好用的网页设计工具供设计师自由挑选使用。在这6个好用的网页设计工具的帮助下&#xff0c;设计师将获得更高的工作效率和更精致的网页设计效果&#xff0c;接下来&#xff0c;就一…

【Java alibabahutool】JSON、Map、实体对象间的相互转换

首先要知道三者的互转关系&#xff0c;可以先将JSON理解成是String类型。这篇博文主要是记录阿里巴巴的JSONObject的两个方法。toJSONString()以及parseObject()方法。顺便巩固Map与实体对象的转换技巧。 引入依赖 <!-- 阿里巴巴 JSON转换 以下二选一即可 没有去细研究两者…

Centos 7.6 安装mongodb

以下是在CentOS 7.6上安装MongoDB的步骤&#xff1a; 打开终端并以root用户身份登录系统。 创建一个新的MongoDB存储库文件 /etc/yum.repos.d/mongodb-org-4.4.repo 并编辑它。 sudo vi /etc/yum.repos.d/mongodb-org-4.4.repo在编辑器中&#xff0c;添加下面的内容到文件中并…

什么是字体图标(Icon Font)?如何在网页中使用字体图标?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 字体图标&#xff08;Icon Font&#xff09;⭐ 如何在网页中使用字体图标⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&a…

基于MATLAB/Simulink的三相并网逆变器dq阻抗建模及扫频仿真

目录 整体系统介绍理论模型MATLAB实现 基于Simulink的阻抗扫频仿真整体思路注意事项流程框图 其他 本文主要介绍三相并网逆变器dq阻抗建模的相关知识&#xff0c;和大家分享一下怎么使用MATLAB/Simulink来进行理论模型的搭建以及如何通过扫频获取阻抗模型&#xff0c;一方面是给…

Node基础--npm相关内容

下面,我们一起来看看Node中的至关重要的一个知识点-----npm 1.npm概述 npm(Node Package Manager),CommonJS包规范是理论,npm是其中一种实践。 对于Node而言,NPM帮助其完成了第三方模块的发布、安装和依赖等。借助npm,Node与第三方模块之间形成了很好的一个 生态系统。(类…

Netty简易聊天室

文章目录 本文目的参考说明环境说明maven依赖日志配置单元测试 功能介绍开发步骤 本文目的 通过一个简易的聊天室案例&#xff0c;讲述Netty的基本使用。同时分享案例代码。项目中用到了log4j2&#xff0c;junit5&#xff0c;同时分享这些基础组件的使用。项目中用到了awt&…

Rust踩雷笔记(5)——刷点链表的题(涉及智能指针Box,持续更新)

目录 leetcode 2 两数相加——模式匹配单链表Box 只能说Rust链表题的画风和C完全不一样&#xff0c;作为新手一时间还不太适应&#xff0c;于是单独为链表、智能指针开一篇&#xff0c;主要记录leetcode相关题型的答案以及注意事项。 leetcode 2 两数相加——模式匹配单链表Bo…

小程序开发之登录授权

小程序开发登录授权流程 看懂这张图登录授权就没问题了&#xff08;哈哈哈哈哈&#xff09; 说明&#xff1a; 调用 wx.login() 获取 临时登录凭证code &#xff0c;并回传到开发者服务器。 调用 auth.code2Session 接口&#xff0c;换取 用户唯一标识 OpenID 和 会话密钥 sess…

【C++】Cmake使用教程(看这一篇就够了)

文章目录 引言一 环境搭建二 简单入门2.1 项目结构2.2 示例源码2.3 运行查看 三 编译多个源文件3.1 在同一个目录下有多个源文件3.1.1 简单版本3.1.1.1 项目结构3.1.1.2 示例代码3.1.1.3 运行查看 3.1.2 进阶版本3.1.2.1 项目结构3.1.2.2 示例源码3.1.2.3 运行查看 3.2 在不同目…

TabView 初始化与自定义 TabBar 属性相关

SWift TabView 与 UIKit 中的 UITabBarController 如出一辙.在 TabView 组件中配置对应的图片和标题; 其中,Tag 用来设置不同 TabView 可动态设置当前可见 Tab;另也有一些常用的属性与 UIKit 中的类似,具体可以按需参考 api 中属性进行单独修改定制; 在 iOS 15.0 之后还可设置角…

系列十一、AOP

一、概述 1.1、官网 AOP的中文名称是面向切面编程或者面向方面编程&#xff0c;利用AOP可以对业务逻辑的各个部分进行隔离&#xff0c;从而使得业务逻辑各部分之间的耦合度降低&#xff0c;提高程序的可重用性&#xff0c;同时提高了开发的效率。 1.2、通俗描述 不通过…

[JDK8环境下的HashMap类应用及源码分析] capacity实验

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄、CSDN博客专家 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 系列文章目录 [Java基础] StringBuffer 和 StringBuilder 类应用及源码分析 [Java基础] 数组应用…