PHP代码审计 -- 文件上传

article/2025/10/9 21:03:33

工具&环境

工具:Seay源代码审计系统,文本编辑器一个
环境:phpstudy,网站源码是 zbzcms

步骤

1, 将zbzcms网站源码放入phpstudy,根据网站安装引导完成网站搭建;
2,打开Seay,新建项目 --> 选择网站源码 --> 自动审计,审计完成后点击 漏洞描述对审计结果进行排序,方便结果查看:
在这里插入图片描述3,审计完成,关注存在文件上传这一类,对结果进行观察,一般存在文件上传的地方存在upload,include,up等关键词,然后再看,发现也有文件上传在admin目录下的,这种我们可以猜测是需要登录以后进行上传的,所以首先关注非admin目录下的文件上传点:
在这里插入图片描述4,这里以/cms/cms/include/up.php这个文件为例,首先双击这条结果,进入up.php存在文件上传的地方:
在这里插入图片描述
可以先对这个页面进行访问:
在这里插入图片描述
提示参数有误,说明需要进行传参,然后观察函数,move_uploaded_file,这是一个php函数,直接查看php手册,对于函数,主要观察三个点,函数的功能是什么,函数需要传入什么参数,函数返回的结果:

move_uploaded_file( string $filename, string $destination):功能:move_uploaded_file — 将上传的文件移动到新位置参数:$filename 文件名, $destination 文件移动的最终位置返回结果:true 或者 false

通过php手册可知,这个函数在这里的功能就是将文件名为 $tmp_name的文件,移动到路径为$path的路径下;
因此,对$tmp_name 和 $path 进行全文追踪,查看这两个变量从哪里来的,并且是否可控,全文追踪:选中变量 -->鼠标右键 --> 全文追踪:
在这里插入图片描述

通过全文追踪结果可以看到,$tmp_name 来自一个数组$arr[‘tmp_name’],进而追踪数组 arr 是在foreach 遍历赋值中,通过 $_FILES 产生的,而 $_FILES 是个全局变量,再次查看php手册:

全局变量 $_FILES 包含有所有上传的文件信息。数组的内容来自以下范例表单。我们假设文件上传字段的名称如下例所示,为 userfile。名称可随意命名。 
$_FILES['userfile']['name']
客户端机器文件的原名称。 
$_FILES['userfile']['type']
文件的 MIME 类型,如果浏览器提供此信息的话。一个例子是"image/gif"。不过此 MIME 类型在 PHP 端并不检查,因此不要想当然认为有这个值。 
$_FILES['userfile']['size']
已上传文件的大小,单位为字节。 
$_FILES['userfile']['tmp_name']
文件被上传后在服务端储存的临时文件名。 
$_FILES['userfile']['error']简单来说,$_FILES是一个全局数组,用于存放上传文件的临时文件名,文件类型,文件大小等重要字段,并且要为POST上传

通过php手册可以得知,我们可以POST以方式上传文件,对$_FILES数组产生影响,进入影响$tmp_name
接下来对$path 进行全文追踪:
在这里插入图片描述

通过全文追踪可以看到,$path 是通过$_GET全局变量获取的,而$_GET全局变量就是从url中get传参获取的,因此$path这个变量是可控的;
代码再往上,我们可以看到有一个if判断,只有 $run 的值为file ,才能进入文件上传,再进行全文追踪查看$run ,可以发现$run 变量是从GET传参获取的:
在这里插入图片描述至此,总结审计流程,进行利用:

* move_uploaded_file() 具有文件移动功能,需要提供$tmp_name ,$path 两个参数;
* $tmp_name可以通过post方式上传文件,影响$_FILES,进而影响$tmp_name,因此需要本地构建一个POST方式的文件上传表单,可控;
* $path为 文件上传路径,通过get 传参 path获取,可控;
* $run 是通过get传参获得,并且值一定要为 file 才能执行文件上传,可控;
* 在审计过程中还发现,如果$path的值,也就是路径在目标上不存在,则会创建新的目录;
* $filename 通过get传参获得,并且它的值会影响文件上传之后的文件名,为1时不更改文件名,为 0时会将时间戳拼接进文件名,
因此还需要将 $filename的值置为 1,方便文件上传之后的访问,可控;

利用:
本地构造文件上传表单,将run置为file使得程序进入上传功能,path设置为当前文件夹,也就是上传到当前文件夹下,filename置为1不更改上传之后的文件名,提交方式为post,enctype=“multipart/form-data”上传文件一定要写:

<html>
<head>
<meta charset="utf-8">
<title>test</title>
</head>
<body><form action="http://zbzcms.com/cms/cms/include/up.php?run=file&filename=1&path=./" method="post" enctype="multipart/form-data"><label for="file">文件名:</label><input type="file" name="file" id="file"><br><input type="submit" name="submit" value="提交">
</form>
</body>
</html>

构造完成后直接双击浏览器打开,上传一个1.php, 内容为<?php phpinfo(); ?>:
在这里插入图片描述此时访问1.php,显示出当前php版本等信息即上传成功:
在这里插入图片描述(文末声明:仅供学习参考)


http://chatgpt.dhexx.cn/article/LYWPtADH.shtml

相关文章

PHP代码审计

代码审计顾名思义就是检查源代码中的缺点和错误信息&#xff0c;分析并找到这些问题引发的安全漏洞&#xff0c;并提供代码修订措施和建议。 PHP代码审计 审计套路 通读全文法 (麻烦&#xff0c;但是最全面) 敏感函数参数回溯法 (最高效&#xff0c;最常用) 定向…

【PHP代码审计】——开启你的代码审计生涯

作者名&#xff1a;Demo不是emo 主页面链接&#xff1a;主页传送门创作初心&#xff1a;舞台再大&#xff0c;你不上台&#xff0c;永远是观众&#xff0c;没人会关心你努不努力&#xff0c;摔的痛不痛&#xff0c;他们只会看你最后站在什么位置&#xff0c;然后羡慕或鄙夷座右…

【代码审计】--- php代码审计方法

代码审计需要掌握的点 PHP编程语言的特性和基础Web前端编程基础漏洞形成原理代码审计思路不同系统、中间件之间的特性差异 代码审计思路 方法一 ---- 检查敏感函数的参数&#xff0c;然后回溯变量&#xff0c;判断变量是否可控&#xff0c;并且有没有经过严格的过滤&#xf…

DAY31:代码审计基础( PHP 篇)

DAY31&#xff1a;代码审计基础( PHP 篇) 1、PHP 代码审计基础 1.1、代码审计概述 ​ 代码审计&#xff08;Code audit&#xff09;是一种以发现程序错误&#xff0c;安全漏洞和违反程序规范为目标的源代码分析。软件代码审计是对编程项目中源代码的全面分析&#xff0c;旨在…

PHP代码审计(全)

前言 官方文档&#xff1a;php.net php官方文档是非常详情&#xff0c;好用的&#xff0c;在遇到不清楚作用的函数时可以进行查询 白盒测试做代码审计最主要的知识是要去了解一个漏洞应该有哪些防御方式&#xff0c;因为大部分的漏洞都是因为修复没有做的全面&#xff0c;或…

PHP代码审计——PHP中常见的敏感函数列表

文章目录 前言一、PHP中的敏感函数——命令注入漏洞 1&#xff09;exec() 2&#xff09;system () 3&#xff09;passthru () 4&#xff09;shell_exec () 5&#xff09;popen() **/** proc_open() 二、PHP中的敏感函数——代码注入漏洞 1&#xff09;…

Idea快速选中一行的四种方式

一、鼠标连续点三下 二、end键将光标移到行尾 &#xff0c; ctrlw 选中行 三、end键将光标移到行尾 &#xff0c; shift home 选中行 四、home 键 光标移到行首、然后 点击shift end

Xcode快捷键修改 复制一行、删除一行

快速目录 Xcode快捷键修改 复制一行、删除一行0.移动选中行1.修改权限2.修改快捷键配置文件复制一行删除一行 3.设置修改Xcode快捷键4.其它注意参看 Xcode快捷键修改 复制一行、删除一行 主要是用Android Studio 开发习惯了&#xff0c;在Xcode上又没有&#xff0c;比如复制当…

竖行选中快捷键

今天选中代码时需要竖行选中&#xff0c;就回顾了一下竖行选中的快捷键 这是个很实用的快捷键。 在myeclipse中竖行选中是AltShiftA&#xff0c;进入竖行选中状态&#xff0c;按Esc退出 在idea中竖行选中的快捷键是Alt鼠标选中

idea 删除当一行或者选中行的快捷键

之前前端开发一直使用VSCode&#xff0c;常用快捷键删除一行或者当前选中的几行代码&#xff0c;使用idea的时候发现快捷键并不相同&#xff0c;查看发现idea的快捷是&#xff1a;Ctrl Y&#xff0c;比手动删除代码方便很多。 通过File->Setttings->Keymap可以查看已经…

java开发银行柜员业务绩效考核系统

导读:当今社会己进入信息社会时代,信息己经受到社会的广泛关注,被看作社会和科学技术发展的三大支柱(材料、能源、信息)之一。信息是管理的基础,是进行决策的的基本依据。在一个组织里,信息己作为人力、物力、财力之外的第四种能源,占有重要的地位。然而,信息是一种非…

Python模拟银行管理系统(面向对象)# 谭子

一、系统需求说明 本项目计划实现一个银行管理系统&#xff0c;包括开户、查询、取款、存款、转账、锁定、解锁和退出功能。 银行管理系统一览表 序号 模块 子模块 说明 1 菜单模块 显示菜单 验证管理员身份&#xff0c;显示功能菜单 2 开户模块 注册&#xff0c;生…

核心银行系统 之一 历史与发展

核心银行系统是银行信息系统中实现客户关系管理、产品与服务、业务流程、财务核算与管理、风险管控、辅助管理与决策等银行业务最核心功能的系统&#xff0c;是银行信息系统的基础和核心。 核心银行系统的英文名字 CORE Banking System&#xff0c;其中CORE是Centralized Onli…

银行信贷系统java_java毕业设计_springboot框架的银行信贷系统

这是一个基于java的毕业设计项目,毕设课题为springboot框架的银行信贷系统, 是一个采用b/s结构的javaweb项目, 开发工具eclipsei/eclipse, 项目框架jspspringbootmybatis, 银行信贷系统采用mysql进行数据存储, 并基于mybatis进行了orm实体关系映射, 该银行信贷系统系统通过模块…

支付系统开发

支付系统开发 一、工程结构 pay-common-parent 项目的Maven父配置工程 pay-common 公共工程&#xff0c;所有项目均可引用 pay-common-config 公共配置工程 pay-common-core 公共核心工程&#xff0c;service工程共用 pay-common-web 公共…

手把手搭建Java网上银行系统【附源码】(毕设)

一、项目简介 本课程演示的是一套基于Java的SSH框架实现的网上银行系统 或 银行管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的java人群。 详细介绍了网上银行系统的实现&#xff0c;包括&#xff1a; 1.项目介绍 2.环境搭建 3.系统功能…

银行综合前置系统IFS

&#xff08;布尔公司简介&#xff09; 法国布尔集团是一家国际性综合IT集团&#xff0c;业务及分支机构遍及全球100多个国家。布尔公司重点面向四大行业&#xff0c;即金融、电信、公共事业和制造业&#xff0c;为其提供量身定作的解决方案。 &#xff08;产品概述&#xff0…

C语言版的银行管理系统

C语言版的银行管理系统。可以模拟ATM及柜台操作&#xff0c;实现用户登录、查询、取款、存款、开户、销户等一系列操作&#xff0c;代码清晰简洁&#xff0c;注释详细明了。 下面废话不多说&#xff0c;上代码啦。 void main() {//cc22052402char userName[8];char userPWD[7]…

银行核心系统是什么?

银行核心系统是什么? 2011-01-03 csdn 银行核心系统是什么 银行核心系统的英文原意CORE Banking, CORE其实不是“核心”的意思这么简单&#xff0c;它的全称是: Centralized Online Real-time Exchange &#xff08;集中式在线实时交互&#xff09;。注意两个重要的关键词“集…

python实现银行ATM系统

通过简单的python程序来实现ATM系统&#xff0c;其功能包括&#xff0c;存取款&#xff0c;余额查明以及退出功能&#xff0c;这些功能通过函数来封装&#xff0c;最后在写出窗口功能和循环 #银行ATM系统 salary int(input("请输入你当月的工资&#xff1a;")) #这…