<?php
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操作来换取比较长的执行时间来替代延时。
那么是不是有别的方式替代呢?
笛卡儿积
https://blog.csdn.net/niexinming/article/details/52980140 这种方法又叫做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
这是一种比较神奇的利用技巧,延时是精确可控的,但问题在于并不是所有站都能实现。 https://zhuanlan.zhihu.com/p/35245598 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)