网络安全自学篇-PHP代码审计(八)

一个网络安全学习爱好者在学习过程中记录下的笔记,希望在CSDN能和大家一起成长,学习,分享,进步,下面分享的是代码审计中变量覆盖的案例,希望对入门网安的朋友们有所帮助,大神有兴趣看看即可,勿喷感谢,同时也欢迎各位师傅私聊交流学习。文章有所参考,也感谢教授我网安知识的师父们,感谢出生在这个互联网时代,知识触手可及。

变量覆盖

原理:攻击者使用自定义的参数去替换应用程序未经过初始化的变量值。
挖掘思路:
文件上传页面覆盖白名单列表
用户注册页面覆盖未初始化的变量导致SQL注入
相关函数:
extract、import_request_variables、parse_str、$$
案例:
1、extract函数

 extract ( array &$array [, int $flags = EXTR_OVERWRITE [, string $prefix = NULL ]] ) : int
// array一个关联数组。此函数会将键名当作变量名,值作为变量的值。 对每个键/值对都会在当前的符号表中建立变量,并受到 flags 和 prefix 参数的影响。  EXTR_OVERWRITE,如果有冲突,覆盖已有的变量。 prefix附加前缀。第二个参数有三种情况会产生变量覆盖:
//1、 EXTR_OVERWRITE 如果有冲突,覆盖已有的变量。
//2、 EXTR_PREFIX_SAME 如果有冲突,在变量名前加上前缀 prefix。 
//3、 EXTR_IF_EXISTS 仅在当前符号表中已有同名变量时,覆盖它们的值。

EXTR_OVERWRITE:

<?php
//EXTR_OVERWRITE
//EXTR_PREFIX_SAME
//EXTR_IF_EXISTS

$uid = 'ae';
$arr = array(
    'username' => 'admin',
    'password' => '123456',
    'uid' => 'pr'
);
extract($arr,EXTR_OVERWRITE);
echo "EXTR_OVERWRITE:";
echo "$username,$password,$uid";

在这里插入图片描述
EXTR_PREFIX_SAME:

$uid = 'ae';
$arr = array(
    'username' => 'admin',
    'password' => '123456',
    'uid' => 'pr'
);
extract($arr,EXTR_PREFIX_SAME,"ae");
echo "EXTR_PREFIX_SAME:";
echo "$username,$password,$uid";
echo ",".$ae_uid;

在这里插入图片描述
EXTR_IF_EXISTS:

$uid = 'ae';
$arr = array(
    'username' => 'admin',
    'password' => '123456',
    'uid' => 'pr'
);
extract($arr,EXTR_OVERWRITE);
echo "EXTR_IF_EXISTS:";
echo "$username,$password,$uid";

在这里插入图片描述
2、import_request_variables函数(PHP<5.4)

 import_request_variables ( string $types [, string $prefix ] ) : bool
 //types 参数指定需要导入的变量。可以用字母‘G’、‘P’和‘C’分别表示 GET、POST 和 Cookie。这些字母不区分大小写,所以你可以使用‘g’、‘p’和‘c’的任何组合。POST 包含了通过 POST 方法上传的文件信息。注意这些字母的顺序,当使用“gp”时,POST 变量将使用相同的名字覆盖 GET 变量。任何 GPC 以外的字母都将被忽略。 prefix 参数作为变量名的前缀,置于所有被导入到全局作用域的变量之前。所以如果你有个名为“userid”的 GET 变量,同时提供了“pref_”作为前缀,那么你将获得一个名为 $pref_userid 的全局变量。
$uid = 'ae';
import_request_variables('G');
if($uid == 'ae') {
    echo "OK";
}else{
    echo "NO";
}

在这里插入图片描述
3、parse_str函数

 parse_str ( string $encoded_string [, array &$result ] ) : void
// encoded_string输入的字符串。result如果设置了第二个变量 result, 变量将会以数组元素的形式存入到这个数组,作为替代。 
$uid = 'ae';
parse_str($uid = 'pr');
echo $uid;

在这里插入图片描述
4、$$

$a = 1;
foreach(array('_COOKIE','_POST','_GET') as $_request) {
    foreach ($$_request as $key=>$value){
        $$key = addslashes($value);
    }
}
echo $a;

变量a可被传入的参数覆盖
在这里插入图片描述
漏洞防范:
1、php.ini中register_globals = OFF
2、使用原始变量数组,入 P O S T _POST、 _GET等
3、不使用foreach变量$_GET变量
4、判断变量是否注册

猜你喜欢

转载自blog.csdn.net/weixin_44047795/article/details/106627161