MySQL时间盲注的五种延时方法实现

作者:demopy 时间:2024-01-21 19:46:16 

MySQL时间盲注五种延时方法 (PWNHUB 非预期解)

延时注入函数

五种:sleep(),benchmark(t,exp),笛卡尔积,GET_LOCK() RLIKE正则

sleep()


sleep(x)
select sleep(5);

benchmark() 重复执行某表达式


benchmark(t,exp)
    select benchmark(count,expr),是重复执行count次expr表达式,使得处理时间很长,来产生延迟,
    比如select benchmark(1000000,encode("hello","good"));
    select benchmark( 5000000, md5( 'test' ));

笛卡尔积


笛卡尔积(因为连接表是一个很耗时的操作)
    AxB=A和B中每个元素的组合所组成的集合,就是连接表
    SELECT count(*) FROM information_schema.columns A, information_schema.columns B, information_schema.tables C;
    select * from table_name A, table_name B
    select * from table_name A, table_name B,table_name C
    select count(*) from table_name A, table_name B,table_name C  表可以是同一张表

GET_LOCK() 加锁

GET_LOCK(key,timeout) 需要两个连接会话
RELEASE_LOCK(key) 锁是否释放,释放了返回1
IS_FREE_LOCK(key) 返回当前连接ID,表示名称为'xxxx'的锁正在被使用。
key 锁的名字,timeout加锁等待时间,时间内未加锁成功则事件回滚。get_lock 加锁成功返回1,
这个锁是应用程序级别的,在不同的mysql会话之间使用,是名字锁,不是锁具体某个表名或字段,具体是锁什么完全交给应用程序。它是一种独占锁,意味着哪个会话持有这个锁,其他会话尝试拿这个锁的时候都会失败。
session A select get_lock('test',1);
session B select get_lock('test',5);
可以指定表也可以不指定
直到关闭连接会话结束,锁才会释放,但不像redis那样加了锁只要不主动释放就一直有。
但是当会话1 get_lock 后,未释放。会话2 不get_lock 同一个key,或者就不get_lock,依然可以对数据进行任何操作,所以加锁只是说人为的主观的想要让某些操作同时只有一个连接能进行操作,别的连接不调用get_lock加同一个锁,那它不会受到任何影响,想干什么干什么。

session1

MySQL时间盲注的五种延时方法实现

session2

MySQL时间盲注的五种延时方法实现

get_lock:但是当会话1 get_lock 后,未释放。会话2 不get_lock 同一个key,或者就不get_lock,依然可以对数据进行任何操作,所以加锁只是说人为的主观的想要让某些操作同时只有一个连接能进行操作,别的连接不调用get_lock加同一个锁,那它不会受到任何影响,想干什么干什么。

session1

MySQL时间盲注的五种延时方法实现

session2

MySQL时间盲注的五种延时方法实现

优缺点分析 (1)这种方式对于更新所有列比较有效,但是得把查询的语句也放在锁内执行; (2)这种方式当客户端无故断线了会自动释放锁,比较好,不像redis锁那样,如果加完锁断了,那么锁一直在; (3)这种方式是针对锁内的所有操作加锁,并不针对特定表或特定行,所以使用了同一个Key的锁但不同的操作都会共用一把锁,会导致效率低下; (4)如果查询语句放在锁之前,则数据可能是旧的,更新之后会把查询之后更新之前别的客户端更新的数据覆盖掉;

RLIKE REGEXP正则匹配

通过rpadrepeat构造长字符串,加以计算量大的pattern,通过repeat的参数可以控制延时长短。 


select rpad('a',4999999,'a') RLIKE concat(repeat('(a.*)+',30),'b');

正则语法:
. : 匹配任意单个字符
* : 匹配0个或多个前一个得到的字符
[] : 匹配任意一个[]内的字符,[ab]*可匹配空串、a、b、或者由任意个a和b组成的字符串。
^ : 匹配开头,如^s匹配以s或者S开头的字符串。
$ : 匹配结尾,如s$匹配以s结尾的字符串。
{n} : 匹配前一个字符反复n次。

RPAD(str,len,padstr)

用字符串 padstr对 str进行右边填补直至它的长度达到 len个字符长度,然后返回 str。如果 str的长度长于 len',那么它将被截除到 len个字符。


mysql> SELECT RPAD('hi',5,'?'); -> 'hi???'

repeat(str,times) 复制字符串times次

⭐️寻找新的延迟函数


concat(rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a')) RLIKE '(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+b'

以上代码等同于 sleep(5)

来源:https://www.cnblogs.com/forforever/p/13019703.html

标签:MySQL,时间盲注
0
投稿

猜你喜欢

  • 用python3教你任意Html主内容提取功能

    2022-09-08 02:27:01
  • Win7 安装软件时无法连接sql server解决方法

    2024-01-18 12:10:59
  • Python零基础入门学习之输入与输出

    2023-07-22 09:50:12
  • centos 6.9安装mysql的详细教程

    2024-01-13 06:51:15
  • 轻松掌握如何从命令行启动mysqld服务器

    2008-12-31 15:47:00
  • Django2.1.3 中间件使用详解

    2023-11-06 19:46:00
  • 地图可视化神器kepler.gl python接口的使用方法

    2022-05-07 00:10:57
  • Python语法垃圾回收机制原理解析

    2021-04-02 13:37:45
  • python自动化脚本安装指定版本python环境详解

    2022-08-14 11:31:46
  • 自动化测试Pytest单元测试框架的基本介绍

    2023-08-20 04:51:47
  • python 使用get_argument获取url query参数

    2023-02-12 03:52:18
  • 基于python实现银行管理系统

    2023-11-22 01:32:18
  • PyCharm 2020.1版安装破解注册码永久激活(激活到2089年)

    2022-06-20 13:08:13
  • python实现复制大量文件功能

    2023-09-03 16:42:54
  • SQL Server 2008中的新日期数据类型

    2009-03-16 15:05:00
  • 运用Python的webbrowser实现定时打开特定网页

    2021-12-15 23:07:02
  • Python+unittest+requests+excel实现接口自动化测试框架

    2021-09-08 07:04:49
  • 微信小程序实现电影App导航和轮播

    2024-04-18 09:49:32
  • Java+MySql图片数据保存与读取的具体实例

    2024-01-22 01:07:31
  • 详解PANDAS 数据合并与重塑(join/merge篇)

    2022-12-13 04:02:08
  • asp之家 网络编程 m.aspxhome.com