ThinkPHP 之 SQLI审计分析(三)

news2024/9/24 5:32:38

说明

该文章来源于徒弟lu2ker转载至此处,更多文章可参考:https://github.com/lu2ker/

文章目录

  • 说明
      • 0x00 测试代码做了什么
      • 0x01 分析调用链
      • 0x03 总结

Time:9-23

影响版本:ThinkPHP=5.1.22

Payload:

/public/index.php/index/index?orderby[id`|updatexml(1,concat(0x7,user(),0x7e),1)%23]=1

这是一篇由已知漏洞寻找利用过程的文章,跟着**参考链接**学习分析。以下是收获记录。

感谢七月火的高质量文章。


0x00 测试代码做了什么

<?php
namespace app\index\controller;

class Index
{
    public function index()
    {
        $orderby = request()->get('orderby');
        $result = db('users')->where(['username' => 'mochazz'])->order($orderby)->find();
        var_dump($result);
    }
}

以GET方式从orderby中获取参数值,查询users表中username=mochazz,再用order方法添加排序语句最后find获取结果。

request类是在thinkphp/library/think/Request.php中定义的,其get方法:

在这里插入图片描述

并没有什么比较关键的东西,之前在研究(username/a)a是什么意思时,对getinput方法的调用处理流程也分析过,最终的过滤代码是在thinkphp/library/think/Request.php1408行filterValue函数,但是由于仅仅是一个框架,并没有添加自定义的过滤器进行过滤。所以这边基本上是传入什么值就获取什么值。未来如果没有特殊情况就不用分析测试代码的作用了。

0x01 分析调用链

  • where()方法

emm,这个版本的parseWhereExp方法与之前分析过的5.0.10版本的不太一样,所以还是学习一下吧。

在这里插入图片描述

1474-1477行像是修了个小BUG的样子,之所以会这么想是因为getOptions方法是这么写的:

在这里插入图片描述

总的来说感觉大概是防止为空时出错吧。不重要。

但有了5.0.10版本分析的经验,知道parseWhereExp方法中主要看的是if-else语句块。这段代码如下:

在这里插入图片描述

因为$field是一个数组($field就是测试代码中where中的参数值)所以直接跳到1495行看起,进入parseArrayWhereItems方法。并且,在parseArrayWhereItems处理完后就会直接return了。

在这里插入图片描述

1564行if条件满足,foreach拆分usernamemochazz,之后会进入1571行的else中对$where数组进行赋值,这里三元运算因为mochazz不是数组,所以第二个元素最终为’=',然后到1580行的if,也是简单的取值赋值操作。

where方法分析完毕,好像也没什么不同。区别在于5.0.10中没有看parseArrayWhereItems方法,这次补上了。下断点看一下处理后的最终结果:

在这里插入图片描述

  • order()方法,本次的主角

thinkphp/library/think/db/Query.php1823-1864行,因为测试代码给定参数的特殊性,程序不会进入部分代码,也为了舍去不必要的篇幅,直接来到1853行开始看起:

在这里插入图片描述

1854行,既然whereoptions中是个数组,那么orderoptions也应是个数组,很合理。

1857行,判断为数组,之后也是用array_merge进行简单的赋值操作。还是下断点看看执行完的情况:

在这里插入图片描述

自始至终没有任何有效的过滤存在意味着whereorder值都是可控的。但是具体怎么触发漏洞还是没有个清晰的逻辑,往后看find的执行流程吧。

。。。

实际上,也没什么看头,基本上是在解析$this->options中的值,然后在3041行调用另一处的find方法,而后执行的代码与前几次分析SQLI漏洞的流程基本一致。em先下个断点看一下SQL语句构造完成后是什么:
最终在thinkphp/library/think/db/Connection.phpfind方法的826行生成的SQL语句。

在这里插入图片描述

明显可以看到是通过反引号闭合id前一个反引号导致的注入攻击。

既然是order by之后的注入,那么漏洞点一定和select方法中调用的parseOrder这个方法有关系:

有了以往的经验,知道具体代码都在thinkphp/library/think/db/Builder.php中,来到847行parseOrder

在这里插入图片描述

阅读855-871行,暂时不看程序不会进入的代码直接来到最后一个else,863-869都没有什么特殊的地方,870会把$sort置为空,871行parseKey方法很关键,跟进。

在这里插入图片描述

它的作用是获取key的值。但是下断点步进发现,调用的实际上不是Builder.php中的parseKey而是Mysql.php中的parseKey,是因为自始至终Mysql都是extends于Builder的,前面一直在Builder中分析代码是因为Mysql中没有写相应的函数,自然就向父类查找了,但是与以往不同的是,parseKey是在Mysql中定义好的。(涨记性,有经验了也得根据实际情况来。)

来到实际执行的parseKey

thinkphp/library/think/db/builder/Mysql.php113行

在这里插入图片描述

在这里插入图片描述

已知的payload并不满足123行的if,直接会到143行处的if,因为$strict是写死的true,这个if必然会进入,然后执行的操作是往$key的两边直接拼接加反引号,这个时候想到payload的形式,毫无疑问漏洞点就在这里。

最后,将return的$key拼接上$sort,再在parseOrder中的875行拼接前缀ORDER BY,SQL注入就构造好了。

0x03 总结

这次分析并没有那么细,也没有想太多,只是根据payload和测试代码的流程过了一遍。并不是严格意义上的白盒审计,很多程序没有进入的代码并没有认真去分析,不知道其他代码做了什么就很可能还存在漏洞点。还是一样的感觉:目前所学习的代码审计就是一个跳过某段代码和进入某段代码的过程,也就是所谓的“链”。至于绕过过滤这些,感觉不是代码审计的重点,只能算是一种奇巧的思路吧。

加油。

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

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

相关文章

万物皆可集成系列:低代码对接微信小程序

近年来&#xff0c;微信小程序的开发如火如荼&#xff0c;很多移动端应用为了更方便被大家所使用的&#xff0c;都步入了小程序的行列 那么对于低代码平台开发的移动端应用是否可以和小程序集成呢&#xff1f;这里我以微信小程序为例。为大家介绍如何在 首先&#xff0c;众所…

ELF格式学习

ELF格式学习 一、简介 ELF的英文全称是Executable and Linking Format&#xff0c;最初是由UNIX系统实验室开发、发布的ABI(Application Binary Interface)接口的一部分&#xff0c;也是Linux的主要可执行文件格式。 ELF文件种类&#xff1a; 可执行文件&#xff08;.out&a…

内核解读之内存管理(1)CPU体系架构UMA和NUMA

文章目录1. SMP&#xff08;UMA&#xff09; 体系架构2. NUMA 体系架构3. NUMA 结构基本概念内存和cpu有着密不可分的联系&#xff0c;学习内存管理&#xff0c;先了解下cpu的架构。1. SMP&#xff08;UMA&#xff09; 体系架构 CPU 计算平台体系架构分为 SMP 体系架构和 NUMA…

【Kotlin】函数 ② ( Unit 函数 | TODO 函数抛出异常返回 Nothing 类型 | 反引号函数名 )

文章目录一、Unit 函数二、TODO 函数抛出异常返回 Nothing 类型三、反引号函数名一、Unit 函数 Java 语言 中 没有返回值的函数 其 返回类型 是 void ; Kotlin 语言 中 没有返回值的函数 其返回类型是 Unit , 该函数又称为 Unit 函数 ; Kotlin 语言中 推出 Unit 类型概念 , 是…

电子产品拆解分析-暖手宝

①电子产品拆解分析-暖手宝一、功能介绍二、拆解电路分析以及器件作用1、暖手宝整体电路2、锂电池充电升压电路根据数据手册以及电路实物绘画原理图3、控制PTC加热垫换挡电路根据实物绘画原理图4、主控MUC电路三、各模块对应的原理图一、功能介绍 ①按键三档调温暖手&#xff1…

如何站在开发者的角度理解框架的设计思想?

感谢支持 我已经在CSDN发布了100多篇原创文章&#xff0c;如果你读过我的文章&#xff0c;欢迎点击下方的链接&#xff0c;帮我五星评价一下&#xff0c;谢谢。 很简单&#xff0c;点击下图&#xff0c;像截图一样五星评价一下就可以了&#xff1a; 有问必答 最近有好多读者…

Vue(六)

1. 列表渲染&#xff08;接五&#xff09; 1.1 Vue监测数据的原理—数组 修改数组&#xff1a;最后追加元素&#xff1a;push&#xff1b;删除最后一个元素&#xff1a;pop&#xff1b;删除第一个元素&#xff1a;shift&#xff1b;在最前面加一个&#xff1a;unshift;在指定位…

shell之函数和数组练习案例

目录函数和数组练习案例1、编写函数&#xff0c;实现打印绿色OK和红色FAILED判断是否有参数&#xff0c;存在为Ok&#xff0c;不存在为FAILED2、编写函数&#xff0c;实现判断是否无位置参数&#xff0c;如无参数&#xff0c;提示错误3、编写函数实现两个数字做为参数&#xff…

ArcGIS基础实验操作100例--实验46按要素融合多边形

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验46 按要素融合多边形 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&…

ctf中linux内核态的漏洞挖掘与利用系列1

说明 该系列文章主要是从ctf比赛入手&#xff0c;针对linux内核上的漏洞分析、挖掘与利用做讲解&#xff0c;本篇文章主要介绍内核漏洞利用所需的前置知识以及准备工作。 linux内核态与用户态的区别 以 Intel CPU 为例&#xff0c;按照权限级别划分&#xff0c;Intel把 CPU指…

8.JS笔记-函数

1.函数 函数是封装了一段可以被重复执行调用的代码块。目的是让大量代码重复使用 封装&#xff1a;将一个或多个功能通过函数的方式进行封装&#xff0c;对外只提供一个简单的函数接口&#xff08;将主板、CPU等封到主机里&#xff09; 2.函数使用 2.1 声明函数 function 函…

DHCP自动分配IP命令配置

由路由器R3充当服务器给PC3和PC4分配IP地址&#xff1a; [r3] dhcp enable-----开启DHCP服务器 [r3] ip pool ? STRING<1-64> Pool name [r3] ip pool aaa-----创建地址池&#xff08;aaa是地址池的名字&#xff09; [r3-ip-pool-aaa]network 192.168.4.0 mask 24-----…

【C进阶】C语言终话,了解计算机的程序环境和预处理过程

目录 &#x1f3c2;前言&#x1f3c2;&#xff1a; &#x1f3c7;一、详解编译与链接&#x1f3c7;&#xff1a; 1.程序的翻译环境与执行环境&#xff1a; 2.翻译环境&#xff1a; 3.翻译阶段&#xff1a; ①.编译&#xff1a; ②.链接&#xff1a; 4.运行环境&#xff1a; …

Java 并发编程 (一)Semaphore和Exchanger的使用

Semaphore和Exchanger的使用 Semaphore 功能介绍 Semaphore 主要作用就是限制线程并发数量。 Semaphore 的构造函数中permits 可以控制最大并发数。每个线程可以acquire指定数量的 permit 。但是acquire n个 则需要释放n个。防止被阻塞 public class MySemaphore {// permits…

【python】鞭炮快乐响,春联贴门上,祝福送到你身旁

前言 大家早好、午好、晚好吖 ❤ ~ 现在贴春联已成风俗&#xff0c;红色的对联贴在大门上&#xff0c;房子顿时生辉。 正如诗云&#xff1a;“喜气临门红色妍&#xff0c;家家户户贴春联&#xff1b;旧年辞别迎新岁&#xff0c;时序车轮总向前。” 今天&#xff0c;我们就用p…

静态路由的拓展配置

静态路由的拓展配置&#xff1a; 1、负载均衡 当路由器访问同一个目标具有多条开销相似的路径&#xff08;经过路由器的数量&#xff09;时&#xff0c;可以让流量拆分后沿多条路径同时传输&#xff0c;可以达到叠加带宽的效果。&#xff08;当开销不相似时做负载均衡&#xff…

数据可视化系列-03AIPL消费者行为全链路可视化模型实践

文章目录4.AIPL消费者行为全链路可视化模型实践4.1、用户画像用户画像产生的原因用户画像概述用户画像构成原则第一类用户画像 User Persona第二类用户画像User Profile4.2、标签体系标签体系简介标签分类贴标签的方式标签的优化用户画像标签和权重4.3、用户画像大数据应用4.4、…

USB基础

一 USB 芯片组成 同以太网类似&#xff0c;USB芯片也分为Controller部分(主机控制器/设备控制器)和PHY部分(收发器) 两大部分组成。 Controller部分 主要实现USB的协议和控制&#xff0c;内部逻辑主要有 MAC层&#xff0c;CSR层&#xff0c;FIFO层等。 MAC层实现安装USB协议…

一文看懂 Redis 主从同步的原理

Redis 主从同步的基本原理有三种&#xff0c;分别是&#xff1a;全量复制&#xff0c;基于长链接的命令传播&#xff0c;增量复制。 接下来分别说说这三种主从间同步的原理。 全量复制 当我们启动多个 Redis 实例的时候&#xff0c;它们相互之间就可以通过 replicaof&#x…

新人转行IC该怎么选择岗位?(内附各岗位学习视频)

最近看到不少同学在后台提问&#xff1a;新人转行IC该怎么选择岗位&#xff1f;其实转行本身就是一件大事&#xff0c;转行之前一定要做好调研&#xff0c;选择适合自己的岗位&#xff0c;这样才能规划好职业生涯。 IC行业这几个岗位是最常见的&#xff1a;数IC前端设计工程师…