zoukankan      html  css  js  c++  java
  • 审计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,没有其他东西,可以直接读取文件,写入文件

  • 相关阅读:
    将maven项目托管到github
    HDOJ_1215_七夕节
    HDOJ_1108_最小公倍数
    HDOJ_1061_Rightmost Digit
    HDON_1021_Fibonacci Again
    HDOJ_1008_Elevator
    HDOJ_1235_统计同成绩学生人数
    HDOJ_2006_求奇数的乘积
    HDOJ_1201_18岁生日
    HDOJ_1019_大二写_Least Common Multiple
  • 原文地址:https://www.cnblogs.com/Triangle-security/p/14333189.html
Copyright © 2011-2022 走看看