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就都能上传成功