代码审计入门学习

简介

HadSky轻论坛程序为个人原创PHP系统,作者为蒲乐天,后端基于puyuetianPHP框架驱动,前端基于 puyuetianUI框架驱动,默认编辑器为puyuetianEditor富文本编辑器,其他非原创框架及驱动JQuery.js 及Font-Awesome字体库,前后端框架以及编辑器都由作者自研,使用此框架进行开发的系统还有 Yodati答题系统、JvHuo聚货网等。

路由分析

查看入口文件index.php

发现其包含了一个puyuetian.php的文件,跟进看看

发现前台路由文件,跟进一下

阅读代码可知其通过get传入c参数来控制路由,如果不传入该参数,则默认访问phpscript目录下 main.php,否则包含phpscript目录下相应文件实现相应功能。

后台路由在/admin/index.php为入口文件

这里的app其实代表app文件夹, superadmin:index则表示superadmin文件夹下的index.php文件,这样路由就定位到该php文件

这里传递另一个参数 s 来控制调用后台的某些功能点

任意文件写入

全局搜索file_put_contents

这里我们文件内容可控,现在看看哪调用了file_put_contents

switch ($type) {
    case 'edit' :
       if (filetype($path) != 'file') {
          if ($_G['GET']['JSON']) {
             ExitJson('不存在的文件');
          }
          PkPopup('{content:"不存在的文件",icon:2,shade:1,hideclose:1,submit:function(){location.href="index.php?c=app&a=filesmanager:index&path="}}');
       }
       $suffix = substr($path, strrpos($path, '.') + 1);
       if (!InArray($suffixs, $suffix)) {
          if ($_G['GET']['JSON']) {
             ExitJson('不支持的文件格式');
          }
          PkPopup('{content:"不支持的文件格式",icon:2,shade:1,hideclose:1,submit:function(){location.href="index.php?c=app&a=filesmanager:index&path="}}');
       }
       $filecontent1 = file_get_contents($path);
       $filecontent = htmlspecialchars($filecontent1, ENT_QUOTES);
       if ($filecontent1 && !$filecontent) {
          if ($_G['GET']['JSON']) {
             ExitJson('不支持该文件编码,仅支持UTF-8');
          }
          PkPopup('{content:"不支持该文件编码,仅支持UTF-8",icon:2,shade:1,hideclose:1,submit:function(){location.href="index.php?c=app&a=filesmanager:index&path="}}');
       }
       if ($_G['GET']['JSON']) {
          ExitJson($filecontent1, TRUE);
       }
       $path = str_replace('\\', '/', $path);
       $paths = explode('/', $path);
       $path = '';
       for ($i = 0; $i < count($paths); $i++) {
          if ($i == count($paths) - 1) {
             $filename = $paths[$i];
          } else {
             $path .= $paths[$i] . '/';
          }
       }
       ExitGourl('index.php?c=app&a=filesmanager:index&path=' . urlencode(realpath($path)) . '&editbtn=' . md5($filename));
       break;
    case 'save' :
       if (filetype($path) != 'file') {
          ExitJson('不存在的文件');
       }
       $suffix = substr($path, strrpos($path, '.') + 1);
       if (!InArray($suffixs, $suffix)) {
          ExitJson('不支持的文件格式');
       }
       $r = file_put_contents($path, $_POST['filecontent']);
       ExitJson('保存失败:' . $path, $r);
       break;

这里有个switch语句,需要$type=save

这里我们也是可控

再看看$path

这里的path参数有 realpath() 函数包裹和下面代码进行限制,以至于这个点不能直接创建新文件,而只能将任意内容写到存在的php文件中

如果不想覆盖原有php文件其实还可以通过先创建php文件再将文件内容写入到创建的文件中,代码如 下: 通过$type=mkfile,并且传入 mkname 参数即可创建文件,这样我们就可以通过创建的文件进行文件内容的写入

漏洞复现

之所以会说保存错误,是因为这给关键代码并没有被限制

任意文件读取

全局搜索file_get_contents

当$type=edit时会调用file_get_contents函数读取文件内容,而且当我们GET传入json参数时,就会进入ExitJson函数中,该函数将我们读取到的内容通过 json形式进行回显

漏洞复现

文件上传getshell

通过上传.zip压缩包然后自动解压缩来进行模板部署,而且这里可能会检测压缩包中内容是否合法,如果这里检测不完善或者该处压缩包可以伪造的话,那么大概率我们可以通过上传压缩文件来绕过该处的后缀检测,从而上传我们想要上传的文件。

定位文件app\superadmin\phpscript\app.php

这里就是上传zip文件的代码,可以看到这里代码121行的后缀白名单,然后通过ZipArchive class(php自带类库,可以对文件进行压缩与解压缩处理) 下的open方法打开压缩文件;然你通过ZipArchive::extractTo()方法将.zip文件解压到根目录。在此过程 中,并没有对解压后的文件进行后缀的校验

漏洞复现

上传一个php文件的压缩包

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

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

相关文章

Java线程池入门03

1. 这3种创建线程池的方式有风险 FixedThreadPool : 固定大小的线程池SingleThreadExecutor : 单个线程的线程池CachedThreadPool : 可缓存的线程池 FixedThreadPool内部其实也是使用ThreadPoolExecutor来创建的 等价于 : new ThreadPoolExecutor(nThreads, nThreads, 0L, Tim…

C#连接sql server

连接时&#xff0c;出现如下提示&#xff1a; ERROR [IM014] [Microsoft][ODBC 驱动程序管理器] 在指定的 DSN 中&#xff0c;驱动程序和应用程序之间的体系结构不匹配 原因是odbc的驱动和应用程序的架构不一致。我的odbc如下所示&#xff1a; 显示为64位&#xff0c;而c#程序显…

【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.1.2典型应用场景:日志分析、实时搜索、推荐系统

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 为什么选择Elasticsearch&#xff1f;——典型应用场景深度解析1. 引言2. 日志分析&#xff1a;海量数据的实时洞察2.1 行业痛点2.2 ES解决方案关键技术实现&#xff1a; 2.…

SQLite 安装教程以及可视化工具介绍

目录 简述 1. Windows 系统安装 1.1 下载预编译的二进制文件 1.2 解压文件 1.3 配置环境变量 1.4 验证安装 2. GUI 可视化工具 2.1 免费工具 2.1.1 DB Browser for SQLite 2.1.2 SQLiteStudio 2.1.3 SQLite Expert 2.1.4 SQLiteGUI 2.1.5 Antares SQL 2.1.6 DbGa…

C#快速调用DeepSeek接口,winform接入DeepSeek查询资料 C#零门槛接入DeepSeek C#接入DeepSeek源代码下载

下载地址<------完整源码 在数字化转型加速的背景下&#xff0c;企业应用系统对智能服务的需求日益增长。DeepSeek作为先进的人工智能服务平台&#xff0c;其自然语言处理、图像识别等核心能力可显著提升业务系统的智能化水平。传统开发模式下&#xff0c;C#开发者需要耗费大…

IP------PPP协议

这只是IP的其中一块内容PPP&#xff0c;IP还有更多内容可以查看IP专栏&#xff0c;前一章内容为网络类型&#xff0c;可通过以下路径查看IP---网络类型-CSDN博客&#xff0c;欢迎指正 3.PPP协议 1.PPP优点 网络类型&#xff1a;p2p PPP---点到点协议 兼容性会更强凡是接口或…

山东大学软件学院ai导论实验之生成对抗网络

目录 实验目的 实验代码 实验内容 实验结果 实验目的 基于Pytorch搭建一个生成对抗网络&#xff0c;使用MNIST数据集。 实验代码 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data…

【Java 面试 八股文】JVM 虚拟机篇

JVM 虚拟机篇 1. JVM组成1.1 JVM由那些部分组成&#xff0c;运行流程是什么&#xff1f;1.2 什么是程序计数器&#xff1f;1.3 你能给我详细的介绍Java堆吗?1.4 Java 虚拟机栈1.4.1 Java Virtual machine Stacks (java 虚拟机栈)1.4.2 栈和堆的区别1.4.3 垃圾回收是否涉及栈内…

钉钉MAKE AI生态大会思考

1. 核心特性 1.1 底层模型开放 除原有模型通义千问外,新接入猎户星空、智普、MinMax、月之暗面、百川智能、零一万物。 1.2 AI搜索 AI搜索贯通企业和个人散落在各地的知识(聊天记录、文档、会议、日程、知识库、项目等),通过大模型对知识逻辑化,直接生成搜索的答案,并…

flex布局自定义一行几栏,靠左对齐===grid布局

模板 <div class"content"><div class"item">1222</div><div class"item">1222</div><div class"item">1222</div><div class"item">1222</div><div class"…

当下弹幕互动游戏源码开发教程及功能逻辑分析

当下很多游戏开发者或者想学习游戏开发的人&#xff0c;想要了解如何制作弹幕互动游戏&#xff0c;比如直播平台上常见的那种&#xff0c;观众通过发送弹幕来影响游戏进程。需要涵盖教程的步骤和功能逻辑的分析。 首先&#xff0c;弹幕互动游戏源码开发教程部分应该分步骤&…

jdk21下载、安装(Windows、Linux、macOS)

Windows 系统 1. 下载安装 访问 Oracle 官方 JDK 下载页面 或 OpenJDK 下载页面&#xff0c;根据自己的系统选择合适的 Windows 版本进行下载&#xff08;通常选择 .msi 安装包&#xff09;。 2. 配置环境变量 右键点击 “此电脑”&#xff0c;选择 “属性”。 在左侧导航栏…

2.部署kafka:9092

官方文档&#xff1a;http://kafka.apache.org/documentation.html (虽然kafka中集成了zookeeper,但还是建议使用独立的zk集群) Kafka3台集群搭建环境&#xff1a; 操作系统: centos7 防火墙&#xff1a;全关 3台zookeeper集群内的机器&#xff0c;1台logstash 软件版本: …

VUE向外暴露文件,并通过本地接口调用获取,前端自己生成接口获取public目录里面的文件

VUE中&#xff0c;如果我们想对外暴露一个文件&#xff0c;可以在打包之后也能事实对其进行替换&#xff0c;我们只需要把相关文件放置在public目录下即可&#xff0c;可以放置JSON&#xff0c;Excel等文件 比如我在这里放置一个other文件 我们可以直接在VUE中使用axios去获取…

ubuntu-24.04.1-desktop 中安装 QT6.7

ubuntu-24.04.1-desktop 中安装 QT6.7 1 环境准备1.1 安装 GCC 和必要的开发包:1.2 Xshell 连接 Ubuntu2 安装 Qt 和 Qt Creator:2.1 下载在线安装器2.2 在虚拟机中为文件添加可执行权限2.3 配置镜像地址运行安装器2.4 错误:libxcb-xinerama.so.0: cannot open shared objec…

应用的负载均衡

概述 负载均衡&#xff08;Load Balancing&#xff09; 调度后方的多台机器&#xff0c;以统一的接口对外提供服务&#xff0c;承担此职责的技术组件被称为“负载均衡”。 负载均衡器将传入的请求分发到应用服务器和数据库等计算资源。负载均衡是计算机网络中一种用于优化资源利…

Linux: 已占用接口

Linux: 已占用接口 1. netstat&#xff08;适用于旧系统&#xff09;1.1 书中对该命令的介绍 2. ss&#xff08;适用于新系统&#xff0c;替代 netstat&#xff09;3. lsof&#xff08;查看详细进程信息&#xff09;4. fuser&#xff08;快速查找占用端口的进程&#xff09;5. …

组件注册方式、传递数据

组件注册 一个vue组件要先被注册&#xff0c;这样vue才能在渲染模版时找到其对应的实现。有两种注册方式&#xff1a;全局注册和局部注册。&#xff08;组件的引入方式&#xff09; 以下这种属于局部引用。 组件传递数据 注意&#xff1a;props传递数据&#xff0c;只能从父…

使用DeepSeek/chatgpt等AI工具辅助网络协议流量数据包分析

随着deepseek,chatgpt等大模型的能力越来越强大&#xff0c;本文将介绍一下deepseek等LLM在分数流量数据包这方面的能力。为需要借助LLM等大模型辅助分析流量数据包的同学提供参考&#xff0c;也了解一下目前是否有必要继续学习wireshark工具以及复杂的协议知识。 pcap格式 目…

蓝桥杯嵌入式客观题以及解释

第十一届省赛&#xff08;大学组&#xff09; 1.稳压二极管时利用PN节的反向击穿特性制作而成 2.STM32嵌套向量终端控制器NVIC具有可编程的优先等级 16 个 3.一个功能简单但是需要频繁调用的函数&#xff0c;比较适用内联函数 4.模拟/数字转换器的分辨率可以通过输出二进制…