审计bluecms

bluecms审计

黑盒审计

1.登录处验证码没有刷新,并且密码没有经过加密,可以爆破密码

2.注册处暴露了用户已注册,可以爆破账号

1与2结合起来就可以爆破出管理员密码

邮箱中存在xss

1、& (和号)成为 &

2、” (双引号)成为 ”

3、’ (单引号)成为 ‘

4、< (小于)成为 < > (大于)成为 >

地址处有htmlspecialchars() 绕过

注册的邮箱可以是绕过,注册邮箱没有检查后面的内容,可以进行xss

登录的时候密码注入 可直接忽略账号并且可以注入 就因为过滤了一个单引号

在评论的地方存在一个http头xff注入

bluecms存在一个文件包含,其他的地方没看

白盒审计

1.开启了gpc 并且get post cookie request都是addslashes()函数

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

2.可能存在php %00截断

  if(PHP_VERSION > '5.1')
 {
 	date_default_timezone_set($timezone);
 }

3.数据库配置

define('BLUE_CHARSET','gb2312'); 不存在宽字节注入

4.重复安装install

if(file_exists(BLUE_ROOT.'data/install.lock')){
	install_showmsg('您已经安装过本系统,如果想重新安装,请删除data目录下install.lock文件', '../index.php');
}

如果这个地方最后一句加die()就可以避免了

5.ad_js.php存在注入

 $ad_id = !empty($_GET['ad_id']) ? trim($_GET['ad_id']) : '';
if(empty($ad_id))
{
	echo 'Error!';
	exit();
}
$ad = $db->getone("SELECT * FROM ".table('ad')." WHERE ad_id =".$ad_id);
如果getone没有限制,那么就存在sql注入
function getone($sql, $type=MYSQL_ASSOC){
    	$query = $this->query($sql,$this->linkid);
    	$row = mysql_fetch_array($query, $type);
    	return $row;
    } 

可以看到getone函数就是对数据库进行一个筛选,并没有过滤操作就可以进行注入,可以先不使用单引号,先进行判断union oreder by
select 12345678进行判断数据库
等到
尝试16进制编码可以绕过

6.user.php注册&编辑个人资料产生xss

$user_name 		=	!empty($_POST['user_name']) ? trim($_POST['user_name']) : '';
	$pwd       		= 	!empty($_POST['pwd']) ? trim($_POST['pwd']) : '';
	$pwd1 	   		= 	!empty($_POST['pwd1']) ? trim($_POST['pwd1']) : '';
	$email     		= 	!empty($_POST['email']) ? trim($_POST['email']) : '';
	$safecode  		= 	!empty($_POST['safecode']) ? trim($_POST['safecode']) : '';
	$from = !empty($from) ? base64_decode($from) : 'user.php';
	if(strlen($user_name) < 4 || strlen($user_name) > 16){
		showmsg('用户名字符长度不符');
	}
	if(strlen($pwd) < 6){
		showmsg('密码不能少于6个字符');
	}
	if($pwd != $pwd1){
		showmsg('两次输入密码不一致');
	}
	if(strtolower($safecode) != strtolower($_SESSION['safecode'])){
		showmsg('验证码错误');
	}
	if($db->getone("SELECT * FROM ".table('user')." WHERE user_name='$user_name'")){
		showmsg('该用户名已存在');
	}
	if($db->getone("SELECT * FROM ".table('admin')." WHERE admin_name='$user_name'")){
		showmsg('该用户名已存在');
	}

只对邮箱进行了空格验证,所以标准xss,可以进行存储型xss,不需要绕过直接就可以进行xss打击

7.user.php产生万能密码登录

if($act == 'index_login'){
 	$user_name = !empty($_REQUEST['user_name']) ? trim($_REQUEST['user_name']) : '';
 	$pwd = !empty($_REQUEST['pwd']) ? trim($_REQUEST['pwd']) : '';
 	$remember = isset($_REQUEST['remember']) ? intval($_REQUEST['remember']) : 0;
 	if($user_name == ''){
 		showmsg('用户名不能为空');
 	}
 	if($pwd == ''){
 		showmsg('密码不能为空');
 	}
	$row = $db->getone("SELECT COUNT(*) AS num FROM ".table('admin')." WHERE admin_name='$user_name'");
	if($row['num'] == 1){
		showmsg('系统用户组不能从前台登录');
	}
	有一个login函数
	$w = login($user_name, $pwd);
	跟进login函数
	function login($user_name,$pwd){
 	global $db;
	$row = $db->getone("SELECT COUNT(*) AS num FROM ".table('user')." WHERE user_name='$user_name'");
	if($row['num']==0){
		$result = 0;
	}else{
		$sql = "SELECT COUNT(*) AS num FROM ".table('user')." WHERE user_name='$user_name' and pwd=md5('$pwd')";
 		$user_num = $db->getone($sql);
 		if($user_num['num']){
 			$result = 1;
 		}else $result = -1;
	}
 	return $result;
 }

可以看出如果user_name后面的值被过滤掉,密码也就无效了
可以尝试万能密码登录跑一波
%df’) or 1=1#
这个可以尝试去注入,sqlmap没有跑出来,可以尝试手工注入

8.评论的地方


 if($act == 'send')

{
	if(empty($id))
	{
 	
	 	return false;
 	}
 	$user_id = $_SESSION['user_id'] ? $_SESSION['user_id'] : 0;
 	$mood = intval($_POST['mood']);
 	$content = !empty($_POST['comment']) ? htmlspecialchars($_POST['comment']) : '';
 	$content = nl2br($content);
 	$type = intval($_POST['type']);
 	if(empty($content))
 	{
 		showmsg('评论内容不能为空');
 	}
 	if($_CFG['comment_is_check'] == 0)
 	{
 		$is_check = 1;
 	}
 	else
 	{
 		$is_check = 0;
 	}

 	$sql = "INSERT INTO ".table('comment')." (com_id, post_id, user_id, type, mood, content, pub_date, ip, is_check) 
 			VALUES ('', '$id', '$user_id', '$type', '$mood', '$content', '$timestamp', '".getip()."', '$is_check')";
 	$db->query($sql);
 	if($type == 1)
 	{
 		$db->query("UPDATE ".table('article')." SET comment = comment+1 WHERE id = ".$id);
 	}
 	elseif($type == 0)
 	{
 		$db->query("UPDATE ".table('post')." SET comment = comment+1 WHERE post_id = ".$id);
 	}
	if($_CFG['comment_is_check'] == 1)
	{
		showmsg('请稍候,您的评论正在审核当中...','comment.php?id='.$id.'&type='.$type);
	}
	else
	{
		showmsg('发布评论成功','comment.php?id='.$id.'&type='.$type);
	}
} 

看到存在查询ip,而ip完全没有经过过滤,所以可以是xff注入

9.支付方式的时候存在一个include

if ($act == 'pay'){
 	include 'data/pay.cache.php';
 	$price = $_POST['price'];
 	$id = $_POST['id'];
 	$name = $_POST['name'];
 	if (empty($_POST['pay'])) {
 		showmsg('对不起,您没有选择支付方式');
 	}
 	include 'include/payment/'.$_POST['pay']."/index.php";
 }

发现只有include,没有其他东西,可以直接读取文件,写入文件

原文地址:https://www.cnblogs.com/Triangle-security/p/14333189.html