ThinkPHP3.2.3_SQLi

news2024/7/6 19:43:08

文章目录

  • ThinkPHP3.2.3_SQLi
    • 0x00 测试代码
    • 0x02 paylaod
    • 0x03 调用分析
    • 0x04 漏洞成因
    • 0x05 总结

ThinkPHP3.2.3_SQLi

刚好有朋友在测一个目标是tp3.2.3框架的站遇到了一些问题

顺手跟一下流程复现一下吧。

0x00 测试代码

<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
    public function index(){
        $id = $_GET['id'];
        $Admin = D("admin");
        $data = $Admin->where(['Id' => $id])->limit('2')->select();
        var_dump($data);
    }
}

0x02 paylaod

?id[0]=exp&id[1]==1 UNION ALL SELECT 1,2,3

通过paylaod和很久以前的经验猜测,这个漏洞应该也是代码中检查exp的时候多加了个空格导致无效了,数组id应该会是绕过了某些地方如if(is_string($id)){xxxxx}这样的判断(我居然在用tp5的经验猜tp3的洞,nt),两个等号的存在肯定是因为要 取的值是=1 union xxxxx而不是1 union xxxx,代码不给字段名后面加=,必须得自带一个=拼接到字段名后面。

想象完毕,开始实践分析

0x03 调用分析

看paylaod的样子,自然想到最后漏洞点应该是分析处理where的方法。

  • 首先进入ThinkPHP\Library\Think\Model.class.php#1798

image-20220403172700369

因为传入的$where是个数组,前面的所有条件都不满足,就直接返回了…

limit方法不重要,这个洞又不是limit之后的注入,所以就走到测试代码中的select()方法了

  • ThinkPHP\Mode\Lite\Model.class.php#509

image-20220403173950040

注意,因为测试代码中并没有给select传参,所以函数体内的$options也是一个数组,而且是一个空数组。540-571的三个条件判断都不满足,然后就走到db->select()方法,看代码看多了就知道这个db的出现,就意味着接下来就要走到核心的数据库操作代码了。

  • 在ThinkPHP\Library\Think\Db\Driver.class.php#943

image-20220403174501934

开始进行SQL语句的生成

  • 在ThinkPHP\Library\Think\Db\Driver.class.php#965

image-20220403174545292

马上进入SQL语句的解析方法。

  • ThinkPHP\Library\Think\Db\Driver.class.php#975

image-20220403174903090

到了这里,别忘了我们刚开始提到的

image-20220403174938067

所以说,造成漏洞的起点,就从983行的parseWhere()方法开始了。。

0x04 漏洞成因

直接略过上图979-982行的一些解析方法,进入到parseWhere(),注意传入给parseWhere()的参数是$options['where']项的值,本文虽然没有关注这个$options变量,但是也要清楚知道它的where项的值就是测试代码中where()中传入的。也就是

image-20220403180019806

  • ThinkPHP\Library\Think\Db\Driver.class.php#490

image-20220403175615201

我们刚才就知道了,$where是一个数组,所以503行之前的作用就是给$operate设置为了 ' AND '这个默认的逻辑符。接着该504行开始正式解析$where数组了.

  • ThinkPHP\Library\Think\Db\Driver.class.php#504

image-20220403180430205

看看,where变量分成了key和value,那么key就是id(别忘了id是一个数组的名字哦),value是一个有两个元素的数组,分别为exp"=1 union select 1,2"。前面的if都不满足。走到536行,就到了进入最深处的时候了。

  • ThinkPHP\Library\Think\Db\Driver.class.php#547---->protected function parseWhereItem()

这里,是解析where传入数据的最核心的功能代码。如果parseWhereItem能返回一个含有恶意sql语句的字符串,那么基本上就能确定是一个SQLi。

image-20220403181227746

从549行开始,$val是一个数组。进入这个if块,$val[0]是字符串也没问题,然后给$exp设置为了$val[0]也就是exp。然后就到569行的elseif('exp' == $exp )满足条件,简单拼接上$val[1],也就是paylaod 中最关键的放置恶意sql语句的地方。最后的$whereStr即为(Id =1 union select 1,2)直接return了。

0x05 总结

虽然是跟完了,但是如果能想一想这开发者为什么会这样写的话,会让我们对程序的代码逻辑更加亲切,也是一种提高审计能力的方法。我想:给where处理写一个解析数组的功能,肯定是为了迎合多个条件的where的情况,但是这里因为测试代码中只传入了一个条件所以没办法从这个漏洞跟一遍它的完整功能,但是看对 e x p 进行的相关操作,开发者的原意应该是可以让“输入”去控制 w h e r e 条件中的判断逻辑符,比如 ‘ > , < , ! = , l i k e , n o t l i k e ‘ ,然后用之前提到的 ‘ exp进行的相关操作,开发者的原意应该是可以让“输入”去控制where条件中的判断逻辑符,比如`>, <, !=, like, notlike`,然后用之前提到的` exp进行的相关操作,开发者的原意应该是可以让输入去控制where条件中的判断逻辑符,比如>,<,!=,like,notlike,然后用之前提到的operate这个参数来拼接每一个判断式子,完整的效果应该类似于where Id=1 AND name like ‘admin’ AND age != ‘14’ `这个伢子。

而挖掘这个漏洞的人,应该就是从最后这个函数起步,关注$whereStr的处理过程,发现了一处简单拼接就return的语句,然后确定$val变量的来源,找怎么样能让$val是一个数组,往上分析即可。

PS:这个洞很简单。这么多篇幅有点不值。

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

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

相关文章

启岁新程|跨越2022,2023一起追光而行!

和气渐入东风&#xff0c;岁杪将迎春临&#xff0c; 时间的车轮即将驶离2022开往2023&#xff0c; 回首来时路&#xff0c;我们收获满满&#xff0c; 展望新征程&#xff0c;我们斗志昂扬...... 2022注定是不平凡的一年&#xff0c; 在这一年里&#xff0c; 我们与行业同行…

深度学习:07 CNN经典模型总结(LeNet-5、AlexNet、VGG、GoogLeNet、ResNet)

目录 CNN经典网络模型 LeNet-5 AlexNet VGG GoogLeNet (Inception) ResNet 如何选择网络 CNN经典网络模型 以下介绍了LeNet-5、AlexNet、VGG、GoogLeNet、ResNet等&#xff0c;它们通常用于图像的数据处理&#xff0c;那么卷积神经网络是否应用于自然语言分类任务呢&am…

.net可视化表单设计工具

在很多软件系统中&#xff0c;表单开发都是很重要的一个部分。在表单开发中&#xff0c;往往会遇到重复开发的问题&#xff0c;例如在页面搭建系统中&#xff0c;除了组件本身的逻辑&#xff0c;配置组件数据的表单通常也需要开发人员重复手动开发。这就导致开发人员不仅要维护…

VS1053音频解码器介绍

VS1053音频解码器简介 VS1053b是单片Ogg Vorbis/MP3/AAC/WMA/MIDI音频解码器&#xff0c;及IMA ADPCM 编码器和用户加载的Ogg Vorbis编码器。它包含了一个高性能、有专利的低功耗DSP处理器内核VS_DSP、工作数据存储器、供用户应用程序和任何固化解码器一起运行的16 KiB 指令RAM…

小程序:后台交互-首页

目录 一&#xff0c;数据库准备 二&#xff0c;后台准备 pom.xml 配置数据源 mybatis-generator 整合mybatis 三&#xff0c;准备前端首页的数据 Promise 封装request 会议展示 四&#xff0c;通过wxs将首页动态数据优化 一&#xff0c;数据库准备 二&#xff0c;后…

docker的镜像存放地址

今天突然想到一个问题&#xff0c;docker的镜像到底存在哪的&#xff0c;一直没太注意&#xff0c;稍微记录下 1、先查看下本地有哪些images docker images 2、找到docker的数据目录 /var/lib/docker 可以看到有好多的目录 盲猜一波大概也能猜到 containers 是当前运行的容器…

React-Router6路由相关一(路由的基本使用、重定向、NavLink·、路由表、嵌套路由)(七)

系列文章目录 第一章&#xff1a;React基础知识&#xff08;React基本使用、JSX语法、React模块化与组件化&#xff09;&#xff08;一&#xff09; 第二章&#xff1a;React基础知识&#xff08;组件实例三大核心属性state、props、refs&#xff09;&#xff08;二&#xff0…

Android OpenGL ES 学习(十二) - MediaCodec + OpenGL 解析H264视频+滤镜

OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学习(三) – 绘制平面图形 Android OpenGL ES 学习(四) – 正交投影 Android OpenGL ES 学习(五) – 渐变色 Android OpenGL ES 学习(六) – 使用…

宝妈可以做什么副业比较好?盘点七种适合宝妈的在家工作

现在有很多全职宝妈在家带孩子的&#xff0c;除了带孩子以外呢&#xff0c;还有很多的空闲时间&#xff0c;所以找一份自由的兼职工作是如今很多宝妈的想法。不仅可以给家里增加收入&#xff0c;支付日常开支&#xff0c;减轻老公的压力&#xff0c;还可以让自己学点新的赚钱知…

Linux编辑器-vim

一、vim的基本概念 我们讲解vim的三种模式(其实有好多模式&#xff0c;目前掌握这3种即可),分别是命令模式&#xff08;command mode&#xff09;、插入模式&#xff08;Insert mode&#xff09;和底行模式&#xff08;last line mode&#xff09;&#xff0c;各模式的功能区分…

OpenCV4入门到进阶

OpenCV4入门到进阶 第1章 介绍与学习指南 第2章 OpenCV开发环境搭建 第3章 图像&视频的加载与展示 第4章 OpenCV必知必会基础 第5章 OpenCV实现图形的绘制 第6章 OpenCV的算术与位运算 第7章 图像基本变换 第8章 OpenCV中的滤波器 第9章 OpenCV中的形态学 第10章 目标识别…

Redis事务以及缓存雪崩,缓存穿透,缓存击穿简介及解决策略

事物的基本操作 *开启事务 multi *作用 设定事物的开启位置,此指令执行后,后续的所有指令均加入到事物中 *执行事物 exec *作用 设定事物的结束位置,同时执行事物,与multi成对出现,成对使用 注意:加入事物的命令暂时进入到任务队列中,并没有立即执行,只有执行exec命令才开始执行…

商业与新消费:从2022到2023

【潮汐商业评论/原创】 “暴风雨结束后&#xff0c;你不会记得自己是怎样活下来的&#xff0c;你甚至不确定暴风雨真的结束了。但有一件事是确定的&#xff1a;当你穿过暴风雨&#xff0c;你就不再是原来那个人。”——村上春树转眼间&#xff0c;时间的齿轮已经从2022滑向了20…

开发中常用、实用命令记录总结

开发中常用、实用命令记录总结前言Linux修改Linux主机名称设置Linux虚拟内存Linux的网络和IO测试Linux查看内存、CPU占用最多的程序防火墙Firewall命令系统管理systemctl命令Centos的yum源设置Windos进程、端口、网络连接快速调出Cmdtext文本文件妙用任务计划Docker青龙面板忘记…

tomcat组件-Server

目录 概述 tomcat 启动 大致流程 Server StandardServer 利用8005端口关闭tomcat 总结 概述 了解一个程序&#xff0c;一定要知道他是干什么的&#xff0c;以及内部架构如何支撑这么干的&#xff0c;以及牵扯的到的概念、模式等知识点的解析(这里只介绍组件)。 Tomcat是…

软件测试 | 简历中应该如何描述才能体现出软技能的实力 ?

很多同学写简历的时候&#xff0c;真的是非常纠结的。技术能力怎么写&#xff1f;工作经历怎么写&#xff1f;项目经验怎么写&#xff1f;其中以拥有多个项目经验的同学和没有项目经验的学生最为纠结。前者是项目经验太多了&#xff0c;工作多年&#xff0c;每个项目经验要是都…

2023年全国最新消防设施操作员模拟试题题库及答案

百分百题库提供消防设施操作员考试试题、消防设施操作员考试预测题、消防设施操作员考试真题、消防设施操作员证考试题库等,提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 15.&#xff08;&#xff09;是平时不能满足水灭火设施所需的工作压力和流量…

以太网交换基础

以太网协议 以太网是当今现有局域网&#xff08;Local Area Network&#xff0c;LAN&#xff09;采用的最通用的通信协议标准。 以太网是建立在CSDA/CD&#xff08;Carrier Sense Multiple Access/Collision Detection,载波监听多路访问&#xff09; 冲突域 解决机制&#xff1…

ChatGPT 都在用的身份认证产品,你了解多少?

近期&#xff0c;人工智能研究公司 OpenAI 正式推出 ChatGPT&#xff0c;这是一种基于对话的人工智能聊天机器人模型&#xff0c;它能够理解自然语言并以自然语言的方式做出回应。上线不到一周&#xff0c;用户数已经突破 100 万大关。 上线仅 5 天用户数就突破百万大关&#…

educoder头歌数据结构 查找 第1关:实现折半查找

本文已收录于专栏 &#x1f332;《educoder数据结构与算法_大耳朵宋宋的博客-CSDN博客》&#x1f332; 任务描述 本关要求通过补全函数BSL_FindKey来实现在已排序的顺序表中查找关键码值为key的结点并返回该结点的编号。 相关知识 折半查找通常是针对顺序存储的线性表&…