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

相关推荐
xyphf_和派孔明12 分钟前
关于Web前端安全防御之点击劫持的原理及防御措施
安全·点击劫持
Sandman6z14 分钟前
启用“安全登录”组合键(Ctrl+Alt+Delete)解锁
安全
芯盾时代17 分钟前
芯盾时代受邀出席安全可信数据要素交易流通利用研讨会
安全·网络安全·数据安全·芯盾时代
nuoxin1141 小时前
CY7C68013A-56LTXC -USB2.0控制器芯片-富利威,国产CBM9002A-56ILG可替代
网络·人工智能·单片机·嵌入式硬件·硬件工程
椿融雪2 小时前
高效轻量的C++ HTTP服务:cpp-httplib使用指南
网络·网络协议·http·cpp-httplib
程序员老徐2 小时前
Netty的Http解码器源码分析
网络·网络协议·http
Ray Song3 小时前
Linux iptables防火墙操作
linux·网络·iptables·防火墙
xyphf_和派孔明3 小时前
关于Web前端安全防御XSS攻防的几点考虑
安全
亲爱的非洲野猪4 小时前
OAuth 2.0 详解:现代授权的核心协议
安全·认证