php之文件操作代码审计

1 PHP文件操作函数

1.1 PHP文件操作函数

  • 文件包含 include/require/include_once/require_once

  • 文件读取 file_get_contents/fread/readfile/file

  • 文件写入 file_put_contents/fwrite/mkdir/fputs

  • 文件删除 unlink/rmdir

  • 文件上传 move_uploaded_file/copy/rename

1.2 文件上传流程

  • 检查文件大小、后缀、类型

  • 检查文件内容(如图片头)

  • 提取文件后缀

  • 生成新文件名

  • 将上传临时文件拷贝到新文件名位置

1.3 文件上传逻辑常见错误

  • 只检查文件类型不检查文件后缀

  • 文件后缀黑名单导致遗漏

  • 使用原始文件名,导致\0截断等漏洞

2 taocms靶场

2.1 taocms后台任意文件上传

1.点击上传弹出一个小的弹窗

2 参数有file和upload但是fil和upload设置文件


3 查看源码发现

发现几乎将php文件上传限制了

4 在新建空白3.php文件

5 在3.php文件插入一句话木马

6 查看3.php文件所在位置以及访问文件

发现新建文件哪里代码没有做限制

2.2 tomccms任意文件删除

1 先新建1.php文件

2 抓取删除3.php的数据包

3 删除的3.php文件修改为1.php

表示删除上成功

4 查看file.php文件以及参数del的代码模块

/**  
 * 删除文件或目录  
 */  
function del(){  
    // 获取当前对象的realpath属性作为路径  
    $path = $this->realpath;  
  
    // 检查路径是否可写,如果不是,则显示无删除权限的消息  
    if (!is_writable($path)) {  
        Base::showmessage('无删除权限');  
        return; // 添加返回语句,避免后续代码继续执行  
    }  
  
    // 检查路径是否为一个目录  
    if (is_dir($path)) {  
        // 如果目录内的文件(包括.和..)数量大于2,则目录非空,不能删除  
        if (count(scandir($path)) > 2) {  
            Base::showmessage('目录非空,不能删除');  
            return; // 添加返回语句,避免后续代码继续执行  
        }  
        // 删除目录  
        rmdir($path);  
    } else {  
        // 如果路径不是一个目录,则尝试删除文件  
        unlink($path);  
    }  
  
    // 获取删除项的路径信息  
    $info = pathinfo($this->path); // 注意:这里使用了$this->path而不是$path,可能是一个错误  
  
    // 显示删除成功的消息,并跳转到文件管理列表页面  
    Base::showmessage('删除成功', 'admin.php?action=file&ctrl=lists&path=' . $info['dirname']);  
}

代码分析

this−>realpath的来源:如果‘this->realpath`的值来自用户输入或不可信的源,并且没有进行适当的验证和清理,那么攻击者可能会尝试删除不应该被删除的文件或目录。 this−>path与path:在函数内部,您使用了$this->realpath作为$path,但在显示成功消息时使用了$this->path。这可能会导致显示错误的路径信息或引发未定义行为(如果$this->path没有被正确设置)。 URL跳转:在显示成功消息时,您直接使用了$info['dirname']作为URL参数的一部分。如果$info['dirname']可以被用户控制或伪造,那么攻击者可能会被重定向到不希望的页面或执行未授权的操作。但是,这通常不被视为“任意文件删除漏洞”,而是URL重定向或注入的问题。 任意文件删除漏洞:要构成任意文件删除漏洞,攻击者需要能够控制$this->realpath的值,以便指定要删除的文件或目录。如果$this->realpath的值直接来自用户输入,并且没有进行验证和过滤,那么这就是一个漏洞。

5 在data文件下新建一个名为install8.lock

6 将删除文件修改为我们要删除的文件

那么确定村子啊任意文件删除漏洞

3 beecms靶场

3.1 beecms靶任意文件删除

1 使用seay的全局搜索unlink

2 点击查看第一个

代码分析

我们能不构建任意的vlaued的值

成为任意文件删除漏洞

3 漏洞复现

在upload文件下的新建1.php文件

在data文件下的新建install9.lock文件

burp抓包并删除upload文件下的1.php

查看upload文件夹下没有1.php

尝试删除instal9.lock文件

查看data文件下已经没有install9.lock

3.2 beecms意外的sql注入

1 审计第二个漏洞


2 对代码分析

// 删除栏目  
// 检查动作是否为删除(del)  
elseif($action=='del'){  
    // 检查当前用户是否有删除栏目的权限  
    if(!check_purview('cate_del')){  
        // 如果没有权限,则输出错误消息并终止执行  
        msg('<span style="color:red">操作失败,你的权限不足!</span>');  
    }  
  
    // 获取要删除的栏目ID,并进行整型转换,防止SQL注入  
    $id=intval($_GET['id']);  
  
    // 判断该栏目下是否有内容  
    // 如果有内容,则不允许直接删除栏目,需先删除内容  
    $has_content=$GLOBALS['mysql']->fetch_rows("select id from ".DB_PRE."maintb where category=".$id);  
    if($has_content){  
        // 如果有内容,则输出错误消息并终止执行  
        msg('<span style="color:red">请先删除该栏目下的内容</span>');  
    }  
  
    // 递归删除子栏目(函数未在此段代码中给出)  
    del_cate_child($id,$lang);  
  
    // 删除当前栏目的所有子栏目(指定父ID)  
    $GLOBALS['mysql']->query('delete from '.DB_PRE.'category where cate_parent='.$id." and lang='".$lang."'");  
  
    // 删除当前栏目  
    $GLOBALS['mysql']->query('delete from '.DB_PRE.'category where id='.$id." and lang='".$lang."'");  
  
    // 检查缓存文件是否存在,如果存在则删除  
    if(file_exists(DATA_PATH.'cache_cate/cache_category'.$parent.'_'.$lang.'.php')){  
        unlink(DATA_PATH.'cache_cate/cache_category'.$parent.'_'.$lang.'.php');  
    }  
  
    // 重新缓存父栏目信息(函数未在此段代码中给出)  
    $GLOBALS['cache']->cache_category($parent,$lang);  
  
    // 重新缓存所有子栏目信息(函数未在此段代码中给出)  
    $GLOBALS['cache']->cache_category_child(0,$lang);  

此代码基本上没有错误

3 删除文件查看网络请求

4 对照代码分析

// 删除栏目  
// 检查动作是否为删除(del)  
elseif($action=='del'){  
    // 检查当前用户是否有删除栏目的权限  
    if(!check_purview('cate_del')){  
        // 如果没有权限,则输出错误消息并终止执行  
        msg('<span style="color:red">操作失败,你的权限不足!</span>');  
    }  
  
    // 获取要删除的栏目ID,并进行整型转换,防止SQL注入  
    $id=intval($_GET['id']);  
  
    // 判断该栏目下是否有内容  
    // 如果有内容,则不允许直接删除栏目,需先删除内容  
    $has_content=$GLOBALS['mysql']->fetch_rows("select id from ".DB_PRE."maintb where category=".$id);  
    if($has_content){  
        // 如果有内容,则输出错误消息并终止执行  
        msg('<span style="color:red">请先删除该栏目下的内容</span>');  
    }  
  
    // 递归删除子栏目(函数未在此段代码中给出)  
    del_cate_child($id,$lang);  
  
    // 删除当前栏目的所有子栏目(指定父ID)  
    $GLOBALS['mysql']->query('delete from '.DB_PRE.'category where cate_parent='.$id." and lang='".$lang."'");  
  
    // 删除当前栏目  
    $GLOBALS['mysql']->query('delete from '.DB_PRE.'category where id='.$id." and lang='".$lang."'");  
  
    // 检查缓存文件是否存在,如果存在则删除  
    if(file_exists(DATA_PATH.'cache_cate/cache_category'.$parent.'_'.$lang.'.php')){ 
    删除文件并命令为 cache_category_0_cn.php
    那么删除文件的  cache_category/../../cn.php直接返回到上一级目录
        unlink(DATA_PATH.'cache_cate/cache_category'.$parent.'_'.$lang.'.php');  
    }  
  
    // 重新缓存父栏目信息(函数未在此段代码中给出)  
    $GLOBALS['cache']->cache_category($parent,$lang);  
  
    // 重新缓存所有子栏目信息(函数未在此段代码中给出)  
    $GLOBALS['cache']->cache_category_child(0,$lang);

5 抓包尝试

现在data文件夹新建一个instal8.lock

抓包尝试

发现报sql错误,那么猜测是否存在SQL注入漏洞

6 根据报错信息查找内容

发现parent参数没有进行过滤那么存在sql注入

7 构建payload进行攻击

1%20or%20updatexml(1,concat(0x3e,database()),1)--+

爆出了数据库名称

3.3 beecms文件上传代码审计

1 在seay软件使用全局搜索move_uploaded_file参数

2 进入第一个进入漏洞详细并用在idea上进行代码分析


发现判断格式只有图片的格式可以进行任意文件上传

3 漏洞复现

burp抓包

修改
Content-Type: application/octet-stream
修改为
Content-Type: image/jpeg

并发送

重新查看图片

查看图片链接

4 进入第三个漏洞汇报

代码分析


发现只允许图片格式上传

payload发现

抓包复现

查看文件

3.4 beecms文件包含漏洞

1 在seay上使用全局搜索include($

2 在admin_channel.php文件第449行上找到导入字段存在文件包漏洞

3 在游览器上访问admin_channel.php地址

4 根据参数说明,编写路径

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/669355.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Error CREATEing SolrCore ‘new_core‘ Unable to create core [new_core]

Error CREATEing SolrCore new_core: Unable to create core [new_core] Caused by: Cant find resource solrconfig.xml in classpath or F:\Document_Solr.apache.org\solr-8.11.3\server\solr\new_core

VHDL/CPLD硬件描述语言:2022年做的万年历实验

之前接触过一些硬件描述语言以及VHDL/CPLD的单片机的设计实验&#xff0c;那时是2022年了 这里补写一篇笔记,以记录一下那十多个小时 万年历实验 研究中的心得体会&#xff1a; 说明解释都是个人理解&#xff0c;与标准描述有较大出入...... 目录 输入输出器件的编写: 分频器…

年中汇报季?——一文教会你如何进行数据分析

一、常见的数据分析报告类型 数据分析报告通常可以分为三类&#xff1a;日常分析报告、专题型分析报告和综合性分析报告。前两者是以数据结论建议的格式去撰写&#xff0c;综合性分析报告则是&#xff1a;行业环境调研&#xff08;竞品类产品数据分析&#xff09;自身产品数据…

张大哥笔记:你卖什么,就反着来卖

普通人打工的一生&#xff0c;就是努力工作&#xff0c;买房&#xff0c;买车&#xff0c;送孩子上好的学校&#xff0c;为了孩子不要输在起跑线上&#xff0c;拼命报各种补习班等&#xff0c;这些都是普通人认为的主流价值观文化&#xff0c;也造就了一批批的赚钱机器&#xf…

深度解析 Spring 源码:探秘 CGLIB 代理的奥秘

文章目录 一、CGLIB 代理简介1.1 CGLIB 代理的基本原理和特点1.2 分析 CGLIB 如何通过字节码技术创建代理类 二、深入分析 CglibAopProxy 类的结构2.1 CglibAopProxy 类结构2.2 CglibAopProxy 类源码 三、CGLIB 代理对象的创建过程3.1 配置 Enhancer 生成代理对象3.2 探讨如何通…

【斯坦福因果推断课程全集】1_随机对照试验1

目录 The average treatment effect Difference-in-means estimation IID Sampling and Population Asymptotics Example: The linear model Regression adjustments with a linear model 随机对照试验&#xff08;RCT&#xff09;是统计因果推论的基础。如果有的话&#…

Linux - 文件管理高级 sed

3.处理字符 sed ① sed 默认情况下不会修改原文件内容 ② sed 是一种非交互式的编辑器 3.1 工作原理 将原文件一行一行的进行处理&#xff0c;取出一行&#xff0c;放入“模式空间进行处理”&#xff0c;处理完成之后将结果输出到屏幕上&#xff0c;然后读取下一行&#xf…

瓦罗兰特国际服 外服游玩教程 瓦罗兰特外服下载注册游玩指南

瓦罗兰特国际服 外服游玩教程 瓦罗兰特外服下载注册游玩指南 瓦罗兰特作为当今游戏圈顶流的一款热门FPS。游戏&#xff0c;作为拳头游戏公司划时代的一款游戏。游戏不仅延续了传统FPS游戏的玩法&#xff0c;还添加许多新玩法&#xff0c;这也是游戏可以吸引大批量玩家的原因之…

vulnhub靶场之FunBox-10

一.环境搭建 1.靶场描述 As always, its a very easy box for beginners. This works better on VitualBox rather than VMware 2.靶场下载 Funbox: Under Construction! ~ VulnHub 3.靶场启动 靶场IP地址我们不知道&#xff0c;但是网段我们知道是192.168.2.0/24 二.信息…

Filter和ServletContext和Listener

目录 Filter案例 解决全站乱码问题 登录权限校验 ServletContext对象 Listener&#xff08;监听器&#xff09; Filter案例 解决全站乱码问题 我们每次访问每个servlet都要书写处理请求和响应乱码的代码&#xff0c;这样代码十分冗余&#xff0c;所以我们可以在过滤中 We…

python列表的进阶

小结&#xff1a; # 列表的删除小结&#xff1a; # 删除列表的最后一列 punished students.pop() print(被罚站的人是&#xff1a; punished &#xff0c;同学们引以为戒。)# 根据下标删除 del students[0]#根据名称删除 students.remove(王熙凤)在今天的课程里&#xff0c…

k8s自定义资源你会创建吗

创建自定义资源定义 CustomResourceDefinition 当你创建新的 CustomResourceDefinition&#xff08;CRD&#xff09;时&#xff0c;Kubernetes API 服务器会为你所 指定的每一个版本生成一个 RESTful 的 资源路径。CRD 可以是名字空间作用域的&#xff0c;也可以是集群作用域的…

短剧系统源码:构建互动娱乐的新平台

随着数字媒体的兴起&#xff0c;短剧成为了一种新兴的娱乐形式&#xff0c;它以紧凑的叙事和快速的节奏迎合了现代观众的观看习惯。短剧系统源码的开发&#xff0c;为短剧内容的创作、传播和消费提供了一个全面的技术解决方案。本文将探讨短剧系统源码的关键组成部分及其功能。…

如何让 LightRoom 每次导入照片后不自动弹出 SD 卡 LR

如何让 LightRoom 每次导入照片后不自动弹出 SD 卡 LR 在导入窗口左上角有个选项&#xff1a; 导入后弹出 把这个去掉就可以了

FreeRTOS同步互斥与通信

本章简介&#xff1a; 本章是概述性的内容。可以把多任务系统当做一个团队&#xff0c;里面的每一个任务就相当于团队里的一个人。团队成员之间要协调工作进度(同步)、争用会议室(互斥)、沟通(通信)。多任务系统中所涉及的概念&#xff0c;都可以在现实生活中找到例子。 各类RT…

Transformer从0到1的学习【还有2-10,别想太多】

1.高纬度介绍Transformer 1.分为编码Encoders和解码器Decoders&#xff1a;“我爱你”作为编码器Encoders的输入进行编码得到序列码后&#xff0c;作为解码器的输入得到输出即为&#xff0c;“I Love you”。 2.编码器和译码器的具体拆分&#xff1a; 左边的编码器Encoders的…

(函数)判断一句话中最长的单词(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//声明函数&#xff1b; int aiphabetic(char); int longest(char[]);int main() {//初始化变量值&#xff1b;int i;char line[100] { 0 };//获取用户输入字符…

每天写两道(五)合并两个有序链表、最长回文子串

21.合并两个有序链表 . - 力扣&#xff08;LeetCode&#xff09; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] (1)迭代法…

牛客网刷题 | BC105 菱形图案

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 KiKi学习了循环&am…

VMware Workstation中WinXP联网问题

我一直以为我的虚拟机上的XP没有联网 因为 蒙了半天&#xff0c;发现是因为这个网址打不开&#xff0c;不是没有网 太傻了 不如在cmd命令行中通过ping baidu.com来判断是否联网