bluecms审计

php代码审计

分类

  • 原生态开发
  • 框架类开发
  • 组件类开发
  • 前端类开发

原生开发-SQL注入

bluecms

一环境:

  • https://github.com/source-trace/bluecms,放在根目录下

  • 访问install目录出现空白页面,phpstudy设置允许目录访问,再删除install/compile目录下的php文件,再次访问即可安装成功(这里存在重新安装的漏洞,再访问install目录是可以重新配置数据库的)

  • 继续数据库的配置,之后重新访问首页文件


二.漏洞:

如何快速在多个文件代码里面找脆弱:

  1. 看文件路径
  2. 看代码里面的变量
  3. 看变量前后的过滤

2.1 sql注入漏洞

正则搜索:

1
(update|select|insert|delete|).*?where.*=

参数过滤
  • trim过滤空格,这里相当于变量$ad_id没过滤

单拿出来sql语句:

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

自定义函数getone,查找声明和用例,发现它本质上还是原生的执行sql语句的代码,然后它也没有进行过滤的操作

image-20250526135209658

image-20250526135227596

在页面中输出结果是以html的形式出现的,结果是在源码中

image-20250526193812710

就开始测(确定列数,回显位,用报错注入,布尔时间盲注啥的)

image-20250526195835630

发现它对引号转义了

image-20250526195906654

源码分析引号转义(common.inc.php):

在ad_js.php文件中发现还包含了文件common.inc.php,猜到是这个文件中做的转义

  • 在blueCMS首页文件index.php中发现首页首先会加载common.inc.php,include/index.fun.php

    1
    2
    3
    4
    define("IN_BLUE",true);
    require_once('include/common.inc.php');//require_once函数是同一个文件加载一次
    require_once(BLUE_ROOT.'include/index.fun.php');

    所以他是一个多入口的模式,注意多入口的系统需要对每个入口文件单独做安全过滤,它们通常都会加载同一个文件来实现,在BlueCMS中这个文件就是common.inc.php

继续跟进去函数deep_addslashes

发现最后就是用的函数addslashes对参数进行过滤

2.2 宽字节注入

common.inc.php文件中加载了数据连接文件mysql.class.php

数据库连接里面发现编码是gbk,那就有宽字节注入的可能

image-20250526203950281

发下后台登陆,验证账号密码的是函数check_admin

参数有单引号闭合,前面也分析了getone没进行过滤,login.php同样加载了过滤文件common.inc.php

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

所以可以宽字节注入用管理员的身份登录

  • 要注意直接在浏览器上回被编码,应该抓包后在bp中改

2.3 存储型XSS

分析

content进行filter_data过滤

跟进函数,只过滤了这几种,可以用标签绕过

image-20250526221631599

利用

抓包,写入xss

1
<img src="" onerror="alert(123456)">

访问news.php目录

2.4 文件包含

分析源码

这里 pay参数无过滤,后面直接拼接index.php,有截断的可能,然后网站功能点是支付

相对路径是相对include/payment的!!!!!

  • 这里注意:

    • 绕过方法1:%00 截断

      • 条件:magic_quotes_gpc = Off,PHP版本<5.3.4
    • 绕过方法2:路径长度截断

      • 条件:windows 下目录路径最大长度为256字节,超出部分将丢弃;linux 下目录最大长度为4096字节,超出长度将丢弃;PHP版本<5.2.8

我这里phpstudy不知道怎么的,安装不了5.2版本的,没有进行复现成功,学习一下思路

远程包含

上面包含本地php文件截断成功的话,可以再利用文件上传漏洞点getshell

  • 寻找一个可以上传点,上传一个带木马的jpg文件,利用文件包含漏洞包含jpg文件,拿shell。

在上传头像的功能点处上传一句话

返回文件上传的路径

data/upload/face_pic/17483177255.jpg

之后再用文件包含就好了

还有一种思路,上传写这个代码的jpg,文件包含执行该代码,会在根目录下生成lost.php的马,内容为<?php @eval($_POST['lostwolf']);?> 菜刀连接拿shell

1
<?php                                                                                                                  ?>

2.5 任意文件读取写入

功能点:后台编辑功能

分析源码

可控参数$act,它用于选择操作,具体操作有list, edit 和do_edit

(list,列出指定目录下的文件

操作 edit用于读取指定目录下的$file,该参数可控,通过../可以实现目录穿越,这里就有任意文件读取漏洞

操作 do_edit 将$tpl_content写入到$tpl_name文件中,两个参数都可控)

edit操作中可疑参数$tql_name 他没有进行任处理就直接拼接

可能会有目录遍历访问任意文件的漏洞

do_edit操作中post接受的可疑参数$tpl_content进行了deep_stripslahes操作

$tpl_content后续还带入写入操作中

且$tpl_name还是过滤空格简单处理了,可以创建新的php文件

查看操作函数deep_addslashes,将参数进行stripslashes操作

stripslashes() 函数删除由 addslashes() 函数添加的反斜杠。(上面也分析了common.inc.php过滤文件对post接收的数据进行了过滤)

所以现在这里的content就完全可控了,存在任意写入的漏洞

利用

1 .$tql_name

利用目录穿越读取任意文件

2 .$tql_content

任意文件写入,注意是post方式接受的

抓包修改数据包,注意操作是do_edit了

参考文章

https://www.freebuf.com/articles/web/284008.html

https://www.cnblogs.com/wkzb/p/12732078.html

https://www.freebuf.com/vuls/196190.html

https://www.cnblogs.com/zjhzjhhh/p/14338775.html


bluecms审计
https://bxhhf.github.io/2025/05/29/bluecms代码审计/
作者
bxhhf
发布于
2025年5月29日
许可协议