Thinkphp5X设计缺陷导致泄漏数据库账户密码

0x00 框架运行环境 ThinkPHP是一个免费开源的,快速、简单的面向对象的轻量级PHP开发框架,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设…

0x00框架操作环境 ThinkPHP是一个免费的,开源的,快速简单的面向对象的轻量级PHP开发框架,用于敏捷Web应用程序开发和简化的企业应用程序开发。自成立以来,ThinkPHP一直秉承简约和实用的原则,同时保持卓越的性能和简单的代码,同时也注重易用性。 PDO查询可以阻止大多数传递攻击,框架所需的php版本为5.4;这可以防止php在5.3.6下出现导致SQL注入漏洞的PDO本地查询。 0x01漏洞分析和利用方案 此漏洞的最关键点是需要打开调试模式,并且最新版本的Tp正式版5.0.9仍然在调试模式下打开。

  下载5.0.9完整版的最新版本

  根据官方文档,在本地安装成功后创建新模型。

然后在索引控制器下创建一个测试方法。

引入变量$ ids的方式是一个数组。这里我们来看看官方输入功能。 Thinkphp 5.0引入了一个新的辅助函数输入来替换版本3.2.3中的I函数;

/a表示参数id的值的规则是通过数组的形式获得的。这很关键。

  最后,使用update来保存一组数据,从代码层看似没有SQL拼接的痕迹; 然后看看如何定义更新方法框架。

先前的参数在数据中传递,传入以下参数,并在$ where下跟踪条件变量,然后是save()方法。

继续跟踪\ thinkphp \ library \ think \ db \ Builder.php

介绍了parseWhere方法

最后找到了buildWhere和parseWhereItem最核心的方法

在引入或不引入时,此代码遍历键和值的值 绑定编译器时,密钥未安全处理,因此在预编译期间会导致SQL异常。

作者测试的结果如下

  数据库链接帐户和密码已被泄露; 看看页面提示是SQL注入的,我也试着在这里使用MYSQL错误注入,但结果失败了。 值得一提的是,此类数据库帐户和密码泄漏的前提是SQL语句无法执行或发生异常。例如,如果非SQL语法错误调试模式没有泄漏数据库帐户和密码,则下面的作者请求不存在的操作test1方法

  更新操作中有这样的问题吗?结论当然不行,这个问题也会用select查询方法生成;请参阅下面的代码 公共功能测试() { $ ids=输入('ids/a'); $ gather=new Gather(); $ gather-> where(['Id'=> ['in',$ ids]]) - > select(); } 用hackbar提交请求

仍然可以报告错误;顺藤发现删除方法也有这个问题,然后手动实验来证明 只需用select替换select即可。

使用hackbar提交数据

  触发此漏洞的关键字如下 喜欢,不喜欢,不喜欢,不喜欢 0x02案例研究 我在这里下载了一套商城系统,这个框架也非常听话,官方配置,调试模式启用 以下图像是可以触发漏洞的一段代码。

当Ids的输入功能进入时,开发人员引入了一个自定义过滤器功能,它可以对单引号和双引号进行html编码。 但是当作者提交时 ?[0000%27]=111 Pdo在预编译时出错

数据库帐户和密码很容易获得。 0x03网络战斗 作者正在测试一个电台的安全性。为了防止水表被检查,隐藏了特定的域名。 第一步是注册用户,前台可以自由注册。

注册成功后,直接GET请求http://xxx.com/home/messages/batchRead?ids[0'\]=1 我试图连接到另一个人的数据库,但遗憾的是运气不好。

0x04漏洞摘要 使用PDO机制,Tp5.0框架非常安全。只要没有出现拼接字符现象,查询参数时至少不会产生注入漏洞。可以看出,底层tp对于传入阵列的键值是不安全的。在处理预编译的绑定参数时,过滤会导致注入的字符仍然存在。因此,默认情况下启用调试模式时,框架本身会提供重要的敏感数据。 0x05错误修复 对于这个$ k可以过滤掉所有特殊字符,以防引入特殊字符导致MYSQL错误;当然,最好的方法是关闭调试模式,期望官方升级到最新版本默认禁用调试模式。   文章来自:https://xianzhi.aliyun.com/forum/read/1813.html 由安全脉冲账号中的先知技术社区发布 Prophet Technology Community专门发布此文章。如果您需要重印,请先联系先知技术社区许可;请不要擅自转载。 Prophet Technology社区提交电子邮件:Aliyun_xianzhi#service.alibaba.com;