当前位置: 首页 > news >正文

Web开发-PHP应用原生语法全局变量数据接受身份验证变量覆盖任意上传(代码审计案例)

DW+ PHPStorm + PhpStudy + Navicat Premium

DW:HTML&JS&CSS开发

PHPStorm : 专业PHP开发IDE

PhpStudy :Apache MYSQL环境

Navicat Premium: 全能数据库管理工具

参考:https://tutorials.wcode.net/php

变量覆盖安全:

$GLOBALS:这种全局变量用于在PHP脚本中的任意位置访问全局变量

存在这种变量覆盖安全问题

数据接收安全:

$_REQUEST:用于收集 HTML 表单提交的数据。

$_POST:广泛用于收集提交method="post" 的HTML表单后的表单数据。

$_GET:收集URL中的发送的数据。也可用于提交表单数据(method="get")

$_ENV:是一个包含服务器端环境变量的数组。

$_SERVER:这种超全局变量保存关于报头、路径和脚本位置的信息。

这里z是走到post提交,用hackbar试一下

成功

或者使用postman进行提交参数

$_SERVER:这种超全局变量保存关于报头、路径和脚本位置的信息。

文件上传安全:

$_FILES:文件上传且处理包含通过POST方法上传给当前脚本的文件内容。

上面是源码,下面是浏览器展示情况,然后我们使用file函数看一下他的作用

下面添加一段代码,就是我们使用$_FILES获取上传文件的名字,并且用echo输出,看一下

<?php
$filename=$_FILES['file_upload']['name'];
$filetype=$_FILES['file_upload']['type'];
$filesize=$_FILES['file_upload']['size'];
$filetmp_name=$_FILES['file_upload']['tmp_name'];echo "文件名:".$filename."<hr>";
echo "文件格式:".$filetype."<hr>";
echo "文件大小:".$filesize."<hr>";
echo "文件临时名:".$filetmp_name."<hr>";

这个函数就能获取上传文件的相关信息了

身份验证安全:

$_COOKIE:是一个关联数组,包含通过cookie传递给当前脚本的内容。

本地客户端浏览器存储

cookie也可以提交数据

这里就定义了一个COOKIE提交方式

这里就传完了参数

然后设置一下cookie,看一下返回数据

<?php
$user='zhaoyang';
setcookie(user,$user,time()+3600);

这里看一下我们抓包后的数据

$_SESSION:是一个关联数组,包含当前脚本中的所有session内容。

目标服务端存储,存储记录的数据

代码审计应用:

1、DuomiCMS变量覆盖

找变量覆盖代码->找此文件调用->

选择利用覆盖Session->找开启Session文件覆盖

这里开一个网站

知识点:
$x='a';
$a='bbb';
$$x='ccc';
echo $a;
最后输出的是cccc,也就是说$$x=$a

这里看一下参考文章

foreach(Array('_GET','_POST','_COOKIE') as $_request)
{foreach($$_request as $_k => $_v) ${$_k} = _RunMagicQuotes($_v);
}

这里第一行就是进行一边遍历,遍历_GET,_POST,_COOLIE,然后再依次赋值给变量$_request

$_k => $_v这个写法等同于键名和键值,类似于$a=@$_REQUERST['x'];

foreach($$_request as $_k => $_v)
  • $$_request代表的是含有全局变量($_GET、$_POST、$_COOKIE)数组
  • 动态的调用对应的全局变量,将每个数组元素的键值对分别赋值为$_k$_v

这里全局搜索一下,哪个文件包含了common.php这个文件并且开了session

这里我们打开了config.php文件,然后发现其中的函数如果getUserID()==-1就会跳转

这里定位搜索一下,找到了getUserID功能,发现了是check.admin.php这个文件的,我们过去看一下

找到了,这里第34-43行发现了他的登录类,也就是我们要输入下面三个参数

var $keepUserIDTag = "duomi_admin_id";
var $keepgroupidTag = "duomi_group_id";
var $keepUserNameTag = "duomi_admin_name";
这就是我们要输入的,大概能懂是干嘛的,存储识别用户的id,组id和用户名这三个变量

然后我们的思路就是修改session伪造管理员身份,因为这一段代码

在admin_manager.php这段代码中,我们发现了groupid=1是管理员,但是等于其他数字就是用户和未知类型,也就是我们的之前推测的用户分组id

_SESSION[duomi_admin_id]=10&_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_name]=zmh

所以payload就是这个样子,为什么是_SESSION呢,因为前面的引用有foreach($$_request as $_k => $_v),这里$_request就能理解为我们传入的参数,_SESSION,然后后面就是键名和键值,因此传入参数后应该是

$_SESSION as duomi_admin_id => 10 &$_SESSION as duomi_group_id =>1 & $_SESSION as duomi_admin_name =>xxxx

就是这样,懂了噻,这不就对应了我们看到的代码这一段了吗

if($groupid==1){return "系统管理员";
}else if($groupid==2){return "网站编辑员";
}else{return "未知类型";
}

思路

uomiphp/common.php存在可利用变量覆盖代码

2、找谁引用了common.php调用了这个代码

3、找到覆盖什么,覆盖的点去利用,选择覆盖session为了去登录后台,如果$_SESSION[duomi_group_id]=1就是管理员

4、但是需要有session_start();由它才能进行session接收

5、需要引用common.php还要有session_start()代码的文件

参考:

https://blog.csdn.net/qq_59023242/article/details/135080259

/interface/comment.php?_SESSION[duomi_admin_id]=10&_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_name]=zmh

这里复现,就是访问一下,用我们构造的paload,这时服务器会记录我们的session,所以我们再次登录后台就发现有了管理员的权限

2、YcCms任意文件上传

找文件上传代码->找此文件调用->找函数调用->过滤type用mime绕过

参考:

https://zhuanlan.zhihu.com/p/718742254

?a=call&m=upLoad send

搭建这个网站

源码

这里找一个getPath,指向了这个文件

这里找到了验证类型的函数,也是这个文件下,我们再看一下是怎么验证的

在这里就找到了他的验证类型,只验证了image/png这种其他的没有,所以只要符合image/png就都能上传成功

http://www.lryc.cn/news/606134.html

相关文章:

  • HighgoDB查询慢SQL和阻塞SQL
  • 电商项目_性能优化_高并发缓存一致性
  • 当过滤条件不符合最左前缀时,如何有效利用索引? | OceanBase SQL 优化实践
  • 0731 IO进程基础
  • FATFS文件系统
  • 从“救火”到“先知”:润建曲尺运维大模型如何重构网络运维价值链
  • 科研快报 |无人机+AI:广东防控基孔热背后的技术革命
  • 大疆无人机开发:MQTT 赋能机场系统集成的Java实战之旅
  • 九识智能与星逻智能达成战略合作,共推“无人车 + 无人机”空地一体巡检升级
  • 5G 单兵终端 + 无人机:消防应急场景的 “空 - 地” 救援协同体系
  • 无人机光伏巡检缺陷检出率↑32%:陌讯多模态融合算法实战解析
  • Lombok 字段魔法:用 @FieldDefaults 解锁“隐身+锁死”双重特效
  • php session 和 jwt 区别和使用场景
  • Java试题-选择题(2)
  • sqli-labs:Less-13关卡详细解析
  • 数据大集网:引领精准获客新时代的优质平台
  • 智慧医院导航系统:基于GPS+蓝牙ibeacon多源融合定位与deepseek•AI导诊问答的设计与实现
  • Linux 时钟同步配置:基础管理与 chrony 工具应用
  • 多架构镜像整合全攻略:在Docker中实现单一镜像支持同时支持amd64和arm64架构
  • hive新增列之后插入新数据时,新列为NULL的解决办法
  • CentOS 7 编译 Redis 6.x 完整教程(解决 GCC 版本不支持 C11)
  • 告别物业思维:科技正重构产业园区的价值坐标系
  • AR智能巡检:工业4.0时代的降本增效利器
  • [人工智能-综述-17]:AI革命:重塑职业版图,开启文明新篇
  • 数据集归一化
  • 机器学习之逻辑回归(Logistic Regression)
  • 视觉图像处理中级篇 [2]—— 外观检查 / 伤痕模式的原理与优化设置方法
  • 【支持Ubuntu22】Ambari3.0.0+Bigtop3.2.0——Step5—Nginx安装
  • Qt 常用控件 - 3
  • vue-seamless-scroll 与 echarts 三联水球图循环滚动的渲染难题-出现短暂空白