Web开发-PHP应用&原生语法&全局变量&数据接受&身份验证&变量覆盖&任意上传
PHP超级全局变量$_FILES列表

PHP超级全局变量$_SERVER列表



DW + PHPStorm + PhpStudy + Navicat Premium
DW : HTML&JS&CSS开发
PHPStorm : 专业PHP开发IDE
PhpStudy :Apache MYSQL环境
Navicat Premium: 全能数据库管理工具
参考:https://tutorials.wcode.net/php
变量覆盖安全:
$GLOBALS:这种全局变量用于在PHP脚本中的任意位置访问全局变量
<?php
$X=1;
$Y=2;
function add(){
//全局变量Z=全局变量X+全局变量Y
$GLOBALS['Z']=$GLOBALS['X']+$GLOBALS['Y'];
}
add();
echo $Z;
上述中,我们声明了两个变量,分别为 x,y,并且调用了$GLOBALS函数。最后把变量z给输出出来,我们运行下看看结果

由此我们可以看到一个问题,如果假如了全局变量,那么就是全部都能引用,我们对比一下正常的函数, 如果没有引用它的话,会是一个什么样的情况
<?php
$X=1;
$Y=2;
function add(){
//全局变量Z=全局变量X+全局变量Y
$GLOBALS['Z']=$GLOBALS['X']+$GLOBALS['Y'];
}
function add1(){
$Z=$X+$Y;
}
add1();
echo $Z;
运行结果:

报错信息中,说没有定义X,Y,Z 由此可见,用到全局变量$GLOBALS的话,会造成不管是函数里面的,还是函数外面的,都会进行干扰的 。啥意思? 比如我强行赋值一个变量Z=4
<?php
$X=2;
$Y=3;
$Z=4;
function add(){
//全局变量Z=全局变量X+全局变量Y
$GLOBALS['Z']=$GLOBALS['X']+$GLOBALS['Y'];
}
//function add1(){
//
// $Z=$X+$Y;
//}
add();
echo $Z;
结果为:

正常按照代码的处理逻辑来看,我已经把它赋值为4了,那它怎么会等于5呢? 这就是全局变量对它造成了干扰! 全局变量对它进行了一个更改 那我们再来举个例子,再次对比一下
<?php
$X=2;
$Y=3;
$Z=4;
/*function add(){
//全局变量Z=全局变量X+全局变量Y
$GLOBALS['Z']=$GLOBALS['X']+$GLOBALS['Y'];
}*/
function add1(){
//局部
$Z=2+3;
}
add1();
echo $Z;
运行结果:

正常来说,我已经让它2+3 结果应该是5,但是它确是4
何为全局呢?整个代码文件就叫做全局 add1那里属于局部,局部就是只在花括号里有影响,但是它一出来就啥也不是了 除非给它一个返回 ,在函数调用的时候再赋值给它,例如这样
<?php
$X=2;
$Y=3;
$Z=4;
/*function add(){
//全局变量Z=全局变量X+全局变量Y
$GLOBALS['Z']=$GLOBALS['X']+$GLOBALS['Y'];
}*/
function add1(){
$Z=2+3;
return $Z;
}
$x=add1();
echo $x;
运行结果:

讲它的意义在哪里呢?不知道大家有没有听说过PHP中有一个漏洞,叫变量覆盖 不懂的可以问AI,简单来说,就是攻击者把自己控制的参数值“注入”到程序里,替换掉了程序正常运行时依赖的变量值,从而改变程序的执行逻辑。
数据接收安全:
$_REQUEST:$_REQUEST 用于收集 HTML 表单提交的数据。
$_POST:广泛用于收集提交method=”post” 的HTML表单后的表单数据。
$_GET:收集URL中的发送的数据。也可用于提交表单数据(method=”get”)
<?php
//$_REQUEST:$_REQUEST 用于收集 HTML 表单提交的数据。
//$_POST:广泛用于收集提交method="post" 的HTML表单后的表单数据。
//$_GET:收集URL中的发送的数据。也可用于提交表单数据(method="get")
$r=@$_REQUEST['x'];
$g=@$_GET['y'];
$p=@$_POST['z'];
echo $r."<hr>";
echo $g."<hr>";
echo $p."<hr>";
我们来访问下这个文件;
<?php
//$_REQUEST:$_REQUEST 用于收集 HTML 表单提交的数据。
//$_POST:广泛用于收集提交method="post" 的HTML表单后的表单数据。
//$_GET:收集URL中的发送的数据。也可用于提交表单数据(method="get")
$r=@$_REQUEST['x'];
$g=@$_GET['y'];
$p=@$_POST['z'];
echo $r."<hr>";
echo $g."<hr>";
echo $p."<hr>";

可以看到现在什么都没有,那么我可以给它一个值

它就输出1了,输出给x,x就传递给r,然后再输出x
那么我输出y的值给这个g,那么就是后面加上个连接符

就输出来了1和12,那么我还想输出个z,在后面加

可以看到,并没有输出出来,什么原因呢?就是因为接收方式的不同 $_REQUEST就是收集所有提交方式,$_GET就代表我只接收GET,POST就代表只接收POST,这个就是代码中专门接收请求方法的意思,
所以我这里想输出z,没有输出出来的原因是它并没有用POST方式来提交 那么我们如何用POST方式提交呢?我们可以借助插件或其他的发包工具 我们可以利用浏览器插件 hackerbar

$_ENV:是一个包含服务器端环境变量的数组。
$_SERVER:这种超全局变量保存关于报头、路径和脚本位置的信息。
<?php
echo $_SERVER['HTTP_USER_AGENT'].'<hr>';
echo $_SERVER['HTTP_ACCEPT'].'<hr>';
echo $_SERVER['HTTP_HOST'].'<hr>';
echo $_SERVER['HTTP_USER_AGENT'].'<hr>';
文件上传安全:
$_FILES:文件上传且处理包含通过POST方法上传给当前脚本的文件内容。
身份验证安全:
$_COOKIE:是一个关联数组,包含通过cookie传递给当前脚本的内容。
<?php
//$_REQUEST:$_REQUEST 用于收集 HTML 表单提交的数据。
//$_POST:广泛用于收集提交method="post" 的HTML表单后的表单数据。
//$_GET:收集URL中的发送的数据。也可用于提交表单数据(method="get")
$r=@$_REQUEST['x'];
$g=@$_GET['y'];
$p=@$_POST['z'];
$n=@$_COOKIE['c'];
echo $r."<hr>";
echo $g."<hr>";
echo $p."<hr>";
echo $n."<hr>";

本地客户端浏览器存储
$_SESSION:是一个关联数组,包含当前脚本中的所有session内容。
目标服务端存储,存储记录的数据
代码审计应用:
1、DuomiCMS变量覆盖
找变量覆盖代码->找此文件调用->
选择利用覆盖Session->找开启Session文件覆盖
参考: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
2、YcCms任意文件上传
找文件上传代码->找此文件调用->找函数调用->过滤type用mime绕过
参考:https://zhuanlan.zhihu.com/p/718742254
?a=call&m=upLoad send
演示案例:
