热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ThinkPHP之SQLI审计分析(三)

说明该文章来源于徒弟lu2ker转载至此处,更多文章可参考:https:github.comlu2ker文章目录说明0x00测试代码做了什么0x01分


说明

该文章来源于徒弟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 测试代码做了什么


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

加油。







推荐阅读
  • 解决Unreal Engine中UMG按钮长时间按住自动释放的问题
    本文探讨了在Unreal Engine中使用UMG按钮时,长时间按住按钮会导致自动释放的问题,并提供了详细的解决方案。 ... [详细]
  • C#实现文件的压缩与解压
    2019独角兽企业重金招聘Python工程师标准一、准备工作1、下载ICSharpCode.SharpZipLib.dll文件2、项目中引用这个dll二、文件压缩与解压共用类 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 在ElasticStack日志监控系统中,Logstash编码插件自5.0版本起进行了重大改进。插件被独立拆分为gem包,每个插件可以单独进行更新和维护,无需依赖Logstash的整体升级。这不仅提高了系统的灵活性和可维护性,还简化了插件的管理和部署过程。本文将详细介绍这些编码插件的功能、配置方法,并通过实际生产环境中的应用案例,展示其在日志处理和监控中的高效性和可靠性。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 本文将继续探讨 JavaScript 函数式编程的高级技巧及其实际应用。通过一个具体的寻路算法示例,我们将深入分析如何利用函数式编程的思想解决复杂问题。示例中,节点之间的连线代表路径,连线上的数字表示两点间的距离。我们将详细讲解如何通过递归和高阶函数等技术实现高效的寻路算法。 ... [详细]
  • 作为软件工程专业的学生,我深知课堂上教师讲解速度之快,很多时候需要课后自行消化和巩固。因此,撰写这篇Java Web开发入门教程,旨在帮助初学者更好地理解和掌握基础知识。通过详细记录学习过程,希望能为更多像我一样在基础方面还有待提升的学员提供有益的参考。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 如何使用 `org.apache.tomcat.websocket.server.WsServerContainer.findMapping()` 方法及其代码示例解析 ... [详细]
  • 本文详细介绍了定时器输入捕捉技术的原理及其应用。通过配置定时器通道的引脚模式为输入模式,并设置相应的捕获触发条件,可以实现对外部信号的精确捕捉。该技术在实时控制系统中具有广泛的应用,如电机控制、频率测量等场景。文中还提供了具体的配置步骤和示例代码,帮助读者更好地理解和应用这一技术。 ... [详细]
  • QT框架中事件循环机制及事件分发类详解
    在QT框架中,QCoreApplication类作为事件循环的核心组件,为应用程序提供了基础的事件处理机制。该类继承自QObject,负责管理和调度各种事件,确保程序能够响应用户操作和其他系统事件。通过事件循环,QCoreApplication实现了高效的事件分发和处理,使得应用程序能够保持流畅的运行状态。此外,QCoreApplication还提供了多种方法和信号槽机制,方便开发者进行事件的定制和扩展。 ... [详细]
  • 在探讨Hibernate框架的高级特性时,缓存机制和懒加载策略是提升数据操作效率的关键要素。缓存策略能够显著减少数据库访问次数,从而提高应用性能,特别是在处理频繁访问的数据时。Hibernate提供了多层次的缓存支持,包括一级缓存和二级缓存,以满足不同场景下的需求。懒加载策略则通过按需加载关联对象,进一步优化了资源利用和响应时间。本文将深入分析这些机制的实现原理及其最佳实践。 ... [详细]
author-avatar
情感顾问世界
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有