张小白的渗透之路(六)——SQL注入的思路、流程及SQL的CONCAT系列函数、Information_schema数据库讲解

本文详细介绍SQL注入的测试方法,包括如何确认注入点、利用union select爆破敏感信息、获取数据库和表名,以及最终获取用户密码的过程。文章还介绍了concat、concat_ws和group_concat等函数的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

关于SQL注入理论的内容,小白之前的博客有写,有兴趣的可以去看一看哦~SQL注入原理详解

实践

1

在SQL注入测试界面的url输入

?id=1

结果页面无变化,说明有可能存在注入点
2

下面让我们继续以这个例子来更深入的理解一下SQL注入的思路。
比方说我现在想获取的是数据库当中某一个用户的密码,那么我们该怎么做呢?
1.查看网页源代码分析
这个原理篇有讲就不废话了,分析的目的就是为了查看是否存在注入漏洞。
2.通过测试性的方式我们注入代码,(这里注意,?不要打成中文的)

?id=1' and 1=1--+

3

?id=1' and 1=2--+

4

看上面两个图:首先我们在输入的开头添加一个 ’ 起到闭合代码的作用。然后我们添加判断语句and 1=1或者1=2,如果前者能够正常访问,后者访问不正常(因为and 1=2恒假,所以访问不到正确的网页),那么我们就可以确定,存在注入漏洞。

3.在验证了漏洞确实存在之后,因为现在发现的数字型的注入(id=x),所以我们通过order by子句(将数据通过某一列从小到大排列,如果是字母就是abcd……)来测试有多少行数据。
4.我们假设猜有4行数据(这个猜测完全是随机的)
5
发现报错:在从句中没有发现字段4
5.那么我们再往下尝试
6
发现访问正常,那么我们就可以确定,现在ID这一项是有3个值。

6.既然发现了有3个值,那么我们尝试通过联合查询来获取一些敏感信息。

?id=1 'and 1=2 union select 1,user(),database()--+

使用这条命令我们可以爆出服务端MYSQL当前的用户名,当前的数据库名,可以利用数据库名进一步获取表名。(因为UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。所以Union前面的查询我们用1=2给取消掉)
7
7.下面我们知道了数据库名,那么下一步肯定就是要获取数据库的表名。
我们尝试输入代码

?id=1 'and 1=2 union select 1,2,group_concat(tables_name) from information_schema.tables where table_schema=database()--+

8
发现爆出了两个表名
8.接下来我们再利用information_schema数据库查询列名。
注入代码

?id=1 'and 1=2 union select 1,group_concat(name),group_concat(pass) from users --+

最终我们获取到了我们需要的数据,下面的一行代码就是我们要的密码啦,是MD5加密之后的
在这里插入图片描述

值得一提的函数用法:
CONCAT()函数
concat()函数用于将多个字符串连接成一个字符串。
如下是一个表名为info的表

idname
1litbai

a.语法及使用特点
concat(str1,str2,……)
返回结果为连接参数产生的字符串。如果有任何一个参数为NULL,则返回值为NULL,可以有一个或者多个参数。

b.使用示例

select concat('id',',','name') as zhang from info limit 1;

返回结果为(注意返回结果中的,也是拼接的字符串哦)

zhang
1 ,litbai

select concat(‘id’,‘zhang’,name);返回结果为

concat(‘id’,‘zhang’,‘name’)
null

CONCAT_WS()函数
当我们想指定参数之间的分隔符时,我们可以使用concat_ws()参数
a.语法及使用特点
concat_ws(separator,str1,str2,……)
concat_ws即 concat with separator,即带有分隔符的concat
分隔符可以是一个字符串也可以是其他参数,如果分隔符为null,那结果肯定也为null。函数会忽略任何分隔符参数后面的null值,但是concat_ws()不会忽略任何空字符串。(然而会忽略所有的null)

b.使用示例

select concat_ws('~',id,name) as zhang from info limit 1;

返回结果

zhang
1~litbai

select concat_ws(’~’,‘id’,‘null’,‘name’);
返回结果

concat_ws(’~’,‘job’,‘null’,‘age’)
job~age

GROUP_CONCAT()函数
group_concat函数返回一个字符串结果,该结果由分组中的值连接组合而成。
例如一个info表的数据如下:

select name,id,job from info where name in ('lit','bai');
nameidjob
lit1teacher
lit2worker
bai34code monkey
bai46cleaner

a.语法及其特点

group_concat([distinct]expr[,expr…]
[order by {unsigned_integer | col_name | formula}[asc | desc] [,col…]]
[spearator str_val])

在mysql中,你可以得到表达式结合体的连结值。
通过使用distinct可以排除重复值。如果希望对结果中的值进行排序,可以使用oder by子句。
separator是一个字符串的值,他被用于插入到结果值,默认为一个逗号,可以通过使用separator“”完全的移除这个值

b.使用示例

select name ,group_concat(id) from info where name in('lit','bai') group by name
namegroup_concat(id)
bai34,46
lit1,2
select name,group_concat(distinct id oder by id desc separator'~') from info where name in ('lit','bai') group by name
namegroup_concat(distinct id oder by id desc separator’~’)
bai46~34
lit2~1
select name,group_concat(concat_ws(',','id','job') order by id desc separator'.')from info where name in ('lit','bai') group by name;
namegroup_concat(concat_ws(’,’,‘id’,‘job’) order by id desc separator ‘.’)
bai46,cleaner.34,code monkey
lit2,worker.1,teacher

group by()函数与order by()函数
group by 从大到小排序
order by() 从小到大排序
order by() desc 从大到校排序

值得一提的数据库用法
information_schema可以理解为师所有数据库的汇总,
比如我要
查询所有数据库
select * from information_schema;
查询litbai库当中的所有表名
select groupconcat(table_name) from information_schema.tables where table_schema=‘litbai’;

<think>好的,我现在要解决用户的问题,即如何使用SQLgroup_concat函数information_schema.schemata表中获取schema_name的连接字符串。首先,我需要回忆用户之前的问题和之前的回答,以保持连贯性。用户之前询问了关于PDO执行十进制SQL的问题,现在转向SQL查询,特别是group_concatinformation_schema的用法。 用户现在提到他们想理解group_concatinformation_schema的作用,以及如何用group_concatinformation_schema.schemata获取schema_name的连接字符串。首先,我需要确认用户是否已经了解这些基本概念,还是需要详细解释。 根据用户提供的引用内容,他们可能已经接触过一些例子,比如通过information_schema.tables获取表名,使用group_concat来合并结果。现在用户的问题是针对schemata表,获取schema_name,也就是数据库名称的连接字符串。 首先,我需要明确information_schema.schemata表的结构。根据MySQL文档,schemata表包含所有数据库的信息,其中schema_name列存储了数据库的名称。因此,正确的查询应该从schemata中选择schema_name,并用group_concat合并。 接下来,用户需要具体的SQL语句示例。根据引用中的例子,用户可能已经见过类似的结构,例如:SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema='security'。现在需要将table_name替换为schema_name,并从schemata表中查询,而无需where条件,因为要获取所有数据库名称。 需要注意的是,如果用户使用的MySQL版本较高(8.0+),可能需要处理group_concat的默认长度限制,或者是否有权限访问information_schema。另外,用户可能想知道如何过滤结果,比如排除系统数据库,所以需要给出可选的where子句示例。 另外,用户可能对group_concat的参数感兴趣,比如使用SEPARATOR来改变分隔符,或者ORDER BY来排序结果。这些细节可以增强回答的实用性。 在安全方面,用户之前的回答中提到了PDO预处理语句,可能需要注意SQL注入的问题。但在这里,用户是在学习如何构造查询,而不是直接处理用户输入,所以可能不需要强调安全,但可以提到在生产环境中谨慎使用这类查询,尤其是在处理敏感信息时。 最后,用户的问题可能涉及到实际应用场景,比如数据库管理、数据导出或调试。因此,解释这些使用场景会帮助用户更好地理解何时使用这些技术。 总结步骤: 1. 解释information_schema.schemata表的作用。 2. 给出基础查询:SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata; 3. 讨论可能的过滤,如排除系统数据库。 4. 提到group_concat的参数,如分隔符和排序。 5. 提醒权限和长度限制的问题。 6. 提供示例输出,帮助用户理解结果。 需要确保回答准确,语法正确,并且符合用户的需求,即获取schema_name的连接字符串。同时,参考用户提供的引用,特别是引用1和引用2中的例子,保持回答的一致性。</think>### 使用`GROUP_CONCAT`函数从`information_schema.schemata`获取数据库名称列表 #### 1. **功能解析** - **`information_schema.schemata`表**:存储所有数据库的元数据,`schema_name`字段记录了数据库名称[^1]。 - **`GROUP_CONCAT`函数**:将多行数据合并为单个字符串,默认以逗号分隔,常用于简化结果展示[^3]。 #### 2. **基础查询语法** ```sql SELECT GROUP_CONCAT(schema_name) AS databases FROM information_schema.schemata; ``` - **输出示例**:`information_schema,mysql,performance_schema,security,sys`(所有数据库名称拼接的字符串) --- #### 3. **可选参数与过滤条件** - **指定分隔符**:通过`SEPARATOR`参数自定义分隔符号 ```sql SELECT GROUP_CONCAT(schema_name SEPARATOR ' | ') AS databases FROM information_schema.schemata; ``` 输出示例:`information_schema | mysql | performance_schema | security | sys` - **过滤系统数据库**:通过`WHERE`子句排除默认数据库 ```sql SELECT GROUP_CONCAT(schema_name) AS user_databases FROM information_schema.schemata WHERE schema_name NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys'); ``` - **排序与去重**:结合`ORDER BY`和`DISTINCT` ```sql SELECT GROUP_CONCAT(DISTINCT schema_name ORDER BY schema_name DESC) FROM information_schema.schemata; ``` --- #### 4. **注意事项** - **权限要求**:需具备`SELECT`权限访问`information_schema`(默认开放给管理员角色)。 - **结果长度限制**:`GROUP_CONCAT`默认最大返回长度为1024字节,可通过设置`group_concat_max_len`调整: ```sql SET SESSION group_concat_max_len = 1000000; ``` --- #### 5. **典型应用场景** - **快速获取数据库清单**:用于审计或备份前的验证 - **动态生成SQL脚本**:拼接`DROP DATABASE`或`SHOW TABLES`语句 - **渗透测试**:枚举数据库名称(需合法授权)[^1] --- ### 相关问题 1. 如何从`information_schema.tables`中获取指定数据库的所有表名? **示例**:`SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema='security';`[^1] 2. `GROUP_CONCAT`函数SQL注入攻击中有哪些利用方式?如何防范? **提示**:过滤用户输入,避免直接拼接SQL语句[^2]。 3. 如何通过`GROUP_CONCAT`实现多列数据合并? **示例**:`SELECT GROUP_CONCAT(CONCAT_WS(':', schema_name, default_character_set_name)) FROM information_schema.schemata;`[^3]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值