BlueCMS_V1.6:审计过程与漏洞分析

Andrew2021-03-01 11:13:07

菜鸟入坑代码审计,听说BlueCMS比较合适初学者,特此学习,大佬勿喷

漏洞环境&搭建

本地环境搭建,使用phpstudy集成系统,CMS版本为BlueCMS_v1.6

访问install目录

BlueCMS_V1.6:审计过程与漏洞分析

下一步,查看数据库文件有没有生成

BlueCMS_V1.6:审计过程与漏洞分析

数据库有数据表显示,安装成功!

漏洞分析

丢进seay里面(新建项目->选择bluecms安装目录->自动审计->开始)

1.数字型SQL注入

产生此漏洞的文件为ad_js.php

BlueCMS_V1.6:审计过程与漏洞分析

seay显示19行的$ad_id变量存在sql注入,而变量$ad_id是从$_GET['ad_id']中来的,且只经过了trim

trim():函数移除字符串两侧的空白字符或其他预定义字符。
而在ad_js.php文件的开头(第10行)引入了过滤文件require_once dirname(__FILE__) . '/include/common.inc.php';

查看common.inc.php文件, 发现对$_POST,$_GET,$_COOKIE,$_REQUEST传递的参数都进行了过滤

BlueCMS_V1.6:审计过程与漏洞分析

跟踪看看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过滤

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

可以看出上面的是个数字型注入,getone函数我们也追踪一下,代码在mysql.class.php中

function getone($sql, $type=MYSQL_ASSOC){
   $query = $this->query($sql,$this->linkid);
   $row = mysql_fetch_array($query, $type);
   return $row;
}

是一个执行sql语句的函数,这里就确认存在数字型sql注入漏洞

漏洞复现:因为我们这里是白盒测试,所以直接提取一下管理的用户名和密码

http://www.bluecms16.com/ad_js.php?ad_id=1 UNION SELECT 1,2,3,4,5,6,GROUP_CONCAT(admin_name,0x3a,pwd) FROM blue_admin

BlueCMS_V1.6:审计过程与漏洞分析

BlueCMS_V1.6:审计过程与漏洞分析

38行输出的时候注释掉了,因此我们需要查看源代码

2. INSERT型SQL注入

BlueCMS_V1.6:审计过程与漏洞分析

// include/common.fun.php 文件108行
function getip()
{
if (getenv('HTTP_CLIENT_IP'))
{
$ip = getenv('HTTP_CLIENT_IP'); 
}
elseif (getenv('HTTP_X_FORWARDED_FOR')) 
{ 
$ip = getenv('HTTP_X_FORWARDED_FOR');
}
elseif (getenv('HTTP_X_FORWARDED')) 
{ 
$ip = getenv('HTTP_X_FORWARDED');
}
elseif (getenv('HTTP_FORWARDED_FOR'))
{
$ip = getenv('HTTP_FORWARDED_FOR'); 
}
elseif (getenv('HTTP_FORWARDED'))
{
$ip = getenv('HTTP_FORWARDED');
}
else
{ 
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}

由于第一分析中common.inc.php文件只对$_POST,$_GET,$_COOKIE,$_REQUEST进行了处理,但是遗漏了$_SERVER,而getip()函数中恰好是通过该变量获取ip地址。我们可以通过client-ip或x-forwarded-for进行ip的伪造,触发漏洞。

phpstorm使用ctrl+shift+F搜索一下,看哪里调用了getip(), 如下图,我们跟进comment.php文件114行

BlueCMS_V1.6:审计过程与漏洞分析

$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);

这里我们也分析一下其他变量插入会不会产生漏洞

$id = !empty($_REQUEST['id']) ? intval($_REQUEST['id']) : '';
// intval函数进行了转义
$user_id = $_SESSION['user_id'] ? $_SESSION['user_id'] : 0; //session  略
$mood = intval($_POST['mood']);
// intval函数进行了转义
$content = !empty($_POST['comment']) ? htmlspecialchars($_POST['comment']) : '';
// 对comment内容做了html转义,所以不存在xss

看来我们还是只能利用getip()来触发漏洞

漏洞复现:

这里是对评论区进行的sql注入,因此我们需要新建一篇文章,然后在评论区测试(白盒测试,为了方便理解,我将sql语句输出了)

BlueCMS_V1.6:审计过程与漏洞分析

poc 构造思路如下:

插入两条数据的思路,进行构造(注入返回结果要显示在留言内容处)

BlueCMS_V1.6:审计过程与漏洞分析

BlueCMS_V1.6:审计过程与漏洞分析

BlueCMS_V1.6:审计过程与漏洞分析

3. 另一处INSERT型注入

在文件guest_book.php77行处

$sql = "INSERT INTO " . table('guest_book') . " (id, rid, user_id, add_time, ip, content) VALUES ('', '$rid', '$user_id', '$timestamp', '$online_ip', '$content')";
$db->query($sql);
这里有个$online_ip, 我们跟踪一下

BlueCMS_V1.6:审计过程与漏洞分析

// include/common.fun.php文件106行处
function getip()
{
  if (getenv('HTTP_CLIENT_IP'))
  {
     $ip = getenv('HTTP_CLIENT_IP'); 
  }
  elseif (getenv('HTTP_X_FORWARDED_FOR')) 
  { 
     $ip = getenv('HTTP_X_FORWARDED_FOR');
  }
  elseif (getenv('HTTP_X_FORWARDED')) 
  { 
     $ip = getenv('HTTP_X_FORWARDED');
  }
  elseif (getenv('HTTP_FORWARDED_FOR'))
  {
     $ip = getenv('HTTP_FORWARDED_FOR'); 
  }
  elseif (getenv('HTTP_FORWARDED'))
  {
     $ip = getenv('HTTP_FORWARDED');
  }
  else
  { 
     $ip = $_SERVER['REMOTE_ADDR'];
  }
  return $ip;
}

原理跟上面的sql注入一样,我们需要构造http头,加个X-FORWARDED-FOR

BlueCMS_V1.6:审计过程与漏洞分析

4.本地文件包含

BlueCMS_V1.6:审计过程与漏洞分析

漏洞发生在user.php文件750行处

BlueCMS_V1.6:审计过程与漏洞分析

$_POST['pay']并没有做多余的安全检测,而是直接进行拼接,但是后面有index.php文件,所以我们的重点是如何截断。如果php版本低于5.3.4且magic_quotes_gpc=off则可以使用%00截断。还可以使用系统文件路径长度限制来进行截断。

这里我们使用系统文件路径长度的限制来截断:

Windows 259个字节

BlueCMS_V1.6:审计过程与漏洞分析

当然了,由于文件包含漏洞可以包含图片文件(例如jpg),而且服务器会解析图片文件(当作php文件执行),那么我们就可以上传一个带木马的jpg文件,然后利用文件包含漏洞包含此jpg文件。执行恶意代码。

具体利用步骤如下:

在个人资料编辑,上传头像处传jpg文件-> 使用包含漏洞包含此文件

BlueCMS_V1.6:审计过程与漏洞分析

5. 任意文件删除

BlueCMS_V1.6:审计过程与漏洞分析

漏洞发生在publish.php文件309行处

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);
}
}

第7行unlink删除文件,传入$id,先删除数据库里的,然后判断本地有没有此文件,如果有,unlink函数也对其进行删除

漏洞复现:

BlueCMS_V1.6:审计过程与漏洞分析

  1. 另一处任意文件删除

漏洞触发在文件user.php中788行处

BlueCMS_V1.6:审计过程与漏洞分析

未做任何处理,直接导致任意文件删除漏洞

漏洞复现:

BlueCMS_V1.6:审计过程与漏洞分析

7.发布文章处XSS

在user.php文件中的266行,有个对文章内容进行过滤

$content = !empty($_POST['content']) ? filter_data($_POST['content']) : '';

跟进一下filter_data函数,看它过滤了什么(include/common.fun.php文件985行)

function filter_data($str)
{
  $str = preg_replace("/<(\/?)(script|i?frame|meta|link)(\s*)[^<]*>/", "", $str);
  return $str;
}

就过滤了几个标签,我们可以用img标签绕过:<img src=1 onerror=alert(‘Tao’)>

漏洞复现:

BlueCMS_V1.6:审计过程与漏洞分析

BlueCMS_V1.6:审计过程与漏洞分析

  1. 用户注册处xss

在user.php文件中的763行处

//编辑个人资料
elseif($act == 'edit_user_info'){
 $user_id = intval($_SESSION['user_id']);
 if(empty($user_id)){
 return false;
}
$birthday = trim($_POST['birthday']);
$sex = intval($_POST['sex']);
   $email = !empty($_POST['email']) ? trim($_POST['email']) : '';
   $msn = !empty($_POST['msn']) ? trim($_POST['msn']) : '';
   $qq = !empty($_POST['qq']) ? trim($_POST['qq']) : '';
   $mobile_phone = !empty($_POST['mobile_phone']) ? trim($_POST['mobile_phone']) : '';
   $office_phone = !empty($_POST['office_phone']) ? trim($_POST['office_phone']) : '';
   $home_phone   = !empty($_POST['home_phone']) ? trim($_POST['home_phone']) : '';
$address = !empty($_POST['address']) ? htmlspecialchars($_POST['address']) : '';
    ..............
    ...............
    $sql = "UPDATE ".table('user')." SET birthday = '$birthday', sex = '$sex', face_pic = '$face_pic', email = '$email', msn = '$msn', qq = '$qq'," ." mobile_phone = '$mobile_phone', office_phone = '$office_phone', home_phone = '$home_phone', address='$address' WHERE user_id = ".intval($_SESSION['user_id']);
$db->query($sql);
showmsg('更新个人资料成功', 'user.php');
$email只是经过了trim, 其余未作处理,存在xss

BlueCMS_V1.6:审计过程与漏洞分析

观察表结构,email长度是足够存储产生xss代码的

漏洞复现:

BlueCMS_V1.6:审计过程与漏洞分析

BlueCMS_V1.6:审计过程与漏洞分析

当管理登录后台,查看用户的时候,也会触发(可拿管理员cookie),且具有隐藏性。这里模拟一下管理员登录后台。

BlueCMS_V1.6:审计过程与漏洞分析

  1. 后台大量漏洞

漏洞有点多,就先不写了?

原创: Tao 黑白天实验室
原文链接:https://mp.weixin.qq.com/s/C6SXz61DsKeNiIw...

postgetenv
本作品采用《CC 协议》,转载必须注明作者和本文链接
该漏洞是CGI脚本在处理authentication.cgi请求,来读取POST参数中的"password"参数的值时造成的缓冲区溢出。
前言BlueCMS是一款国产的CMS平台,十分灵活、方便,早些年广泛的应用于商业系统、个人博客等。在使用getip()函数获取ip时没有严格过滤,导致sql注入。
菜鸟入坑代码审计,听说BlueCMS比较合适初学者,特此学习,大佬勿喷 漏洞环境&搭建 本地环境搭建,使用phpstudy集成系统,CMS版本为 访问install目录 下一步,查看数据库文件有没有生成 数据库有数据表显示,安...
在cgiHandler函数中,将用户的HTTP请求参数作为环境变量,通过诸如LD_PRELOAD即可劫持进程的动态链接库,实现远程代码执行。代码首先拼接出用户请求的cgi完整路径并赋予cgiPath,然后检查此文件是否存在以及是否为可执行文件。随后代码将cgiPath、envp、stdIn与stdOut作为参数传入launchCgi函数中。
主要的环境准备参见上一篇文章,这里介绍本篇文章中会用的的模拟工具以及另一个静态分析工具。
[VNCTF2022]gocalc0复现
2022-05-07 16:02:38
看雪论坛作者ID:H3h3QAQ
Dridex也称为 Bugat 或 Cridex,可以从失陷主机上窃取敏感信息并执行恶意模块的木马。FortiGuard Labs 最近捕获了新的网络钓鱼邮件活动,其中包括特制的 Excel 文档附件。分析研究后,发现一旦在受害者的机器上打开了恶意 Excel 文档就会下载 Dridex 的新变种。宏代码解析收件人打开 Excel 文档后会在顶部以红色粗体显示要求用户启用宏代码。Excel
AFL 源代码速通笔记
2023-04-24 09:22:40
AFL 作为一个现在仍然适用且比较经典的 fuzzer,笔者打算从它开始。先说结论,这一步的目的其实是为了向代码中插桩,完成插桩后其实还是调用原生的 gcc 进行编译。其实这个描述有些偏颇,插桩其实是 afl-as 负责的,不过在这里,笔者将 afl-gcc 和 afl-as 放到同一节,因此用了这样的表述,下文会具体分析 afl-as 的原理。
总之,是一个数组越界导致缓冲区溢出的漏洞。
2020 Codegate Web题解
2022-07-07 08:09:51
Codegate 还是有很多国际强队参加的,这里记录 Codegate 的两道 Web题。
Andrew
暂无描述