全局覆盖
首先认识全局变量和局部变量
再一个就是知道全局变量是全局使用的并且有个特点就是可以覆盖
这个就是全局变量我们输出一下发现 z居然等于函数内的计算值 把我们原来定义的全局变量 $z给覆盖了 看一下局部变量
这个时候 z就不会被覆盖
<?php
$x=1;
$y=2;
$z=4;
function add(){
//全局变量的覆盖 : 声明的全局 'z' 让整个程序都可以运行
$GLOBALS['z']=$GLOBALS['x']+$GLOBALS['y']; //这里我们声明了一个全局变量
};
// 这里有个知识点就是 $$ 这个来声明全局变量
// $x='555';
// $b='2';
// $$x='3333';
// echo $b;
function add1(){
#局部变量
$z=2+3;
#
}
add();
add1();
echo $z
// globals 的声明把我们的定义给覆盖了
那这个覆盖函数就是 GLOBALS (声明全局变量)
那可能说 全局变量覆盖有个鸟用啊 假如对方调用了这个全局变量a 函数 并且变量是可控的
如果这个时候有个waf是 只有a==1才能进入后台 那我们是不是就可以重新输入一个全局变量来覆盖他原有的逻辑从而进入后台(越权)
身份验证
身份验证之前需要了解 数据传输的几种模式
<?php
$r=@$_REQUEST['x']; //request 接受所以得数据包 //@是容错符号 让其不报错
$g=@$_GET['y'];
$p=@$_POST['z'];
$c=$_COOKIE['a'];
echo $_SERVER['HTTP_HOST'].'<hr>';
//这种超全局变量保存关于报头、路径和脚本位置的信息 获取客户的信息
echo $r.'<hr>';
echo $g.'<hr>';
echo$p.'<hr>';
echo $c.'<hr>';
cookie传输需要进行抓包修改
身份验证函数 : 1、cookie(前端的验证 当会话结束时 他不会消失 知道我们指定他的时间结束他才消失)
2、session(服务端的验证 会话结束 session就会被清除 (或者是服务器定时的清除))
<?php
// $a='xiaodisec';
// setcookie('user',$a,time()+3600);
//cookie的堆叠 我们的cookie没有设置但是 因为时间的限制 浏览器会在本地储存下我们的cookie 以便下次使用
$username=$_COOKIE['username'];
setcookie("username",$username.'gay',time()+3600*5);
// session_start(); //session的调用要 先开启这个
// $_SESSION['username']='kongde_username';
// echo "welcome,".$_SESSION['username']."!<br>";
sever函数的用法
看一下cookie 的长时间存在可以造成 堆叠
第一次cookie抓包
第二次
这个就是告诉我们cookie是时间性的
看一下session
这个session 会存储在本地的服务器
文件上传
涉及一个函数 $_Files 这个函数是专门读取文件的
<form action="" method="post" enctype="multipart/form-data"><input type="file" name="file_upload"><button type="submit">上传</button></form>
<!--
action 留空表示传给自己 -->
<?php
$file_name=$_FILES['file_upload']['name']; //表示html上的文件名 加上临时的文件名
$file_type=$_FILES['file_upload']['type'];
$file_size=$_FILES['file_upload']['size'];
$file_tepname=$_FILES['file_upload']['tmp_name'];
echo $file_name;
文件的上传
上传之后会显示名字
漏洞利用
这个是全局变量覆盖的一个漏洞 主要 的 考点就是 如何 进行白盒的代码审计 了解漏洞的形成和基本的情况
先看漏洞的利用再看payload是怎么来的
直接进入后台了
/interface/comment.php?_SESSION[duomi_admin_id]=10&_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_name]=zmh(后边的name是可以随便写)
先看为什么使用 comment.php
这里包含了一个 common.php
在common中找到了一个这个
foreach 遍历
举一个这个 get的例子
_get 进入循环之后 变为了 $_GET 这个$_GET 就变为了 一个全局的变量
那我们知道为什么写这个 comment.php 了 就是因为他可以调用全局变量
那其实我们可以使用别的包含这个文件的进行
这个desktop.php 也包含了配置文件那我们试一下
/interface/desktop.php?_SESSION[duomi_admin_id]=10&_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_name]=zmh
发现你妹的什么情况怎么给下东西了 打开看一下
没线索 想一想我们学的 session是不是要有 start session 才能进行啊 这不就吻合了嘛
再运行 发现可以进入
那就来逻辑了 现在再需要弄清
interface/desktop.php?_SESSION[duomi_admin_id]=10&_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_name]=zmh
session的值是什么情况
追踪一下(因为有个细节就是 这个 location 重定向到 这个 login.php)
发现id的定义就是获取 用户的id
正好这里定义的三个分别是 用户名 用户id和组id
所以最后的payload 可以是interface/desktop.php?_SESSION[duomi_admin_id]=1&_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_name]=1 (让他们都是1 __SESSION[duomi_group_id]=1 经过 $$ 自动变为全局变量 $__SESSION[duomi_group_id]=1 而产生的漏洞 )
这个就是这个越权漏洞的利用 如果换到现实中就需要进行反向 我们现在这个是逆向的