欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

php代码审计【13】变量覆盖

程序员文章站 2022-05-14 23:47:45
...

1、extract

<?php
$b=3;
$a = array('b' => '1' );
extract($a,EXTR_OVERWRITE);
print_r($b);
//extract 有三种形式可能导致变量覆盖,第一种是第二个参数为EXTR_OVERWRITE,他表示如果有冲突,覆盖原有的变量。第二种情况是只传入第一个参数,默认为EXTR_OVERWRITE模式,第三种是第二个参数为EXTR_IF_EXISTS,他表示在当前符号表中已有同名变量时,覆盖它们的值,其他的都不注册新变量.
//关键字:extract,EXTR_OVERWRITE
?>

php代码审计【13】变量覆盖 

2、parse_str()

<?php
$b=3;
parse_str('b=2');
print_r($b);
//parse_str()的作用是解析注册成变量的字符串,第二个参数$arr是一个数组
//关键字:parse_str()
//
?>

php代码审计【13】变量覆盖 

3、import_request_variables()

在register_globals=ON时,

提交/test.php?a=1&b=2 , 变量$a未初始化,$_GET[b]=2

提交/test.php??GLOBALS[a]=1&b=2,$a=1,$_GET[b]=2

tips: 从 PHP » 4.2.0 版开始配置文件中 PHP 指令 register_globals 的默认值从 on 改为 off 了,自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除。

<?php
$b=3;
import_request_variables('GP');
print_r($b);
//import_request_variables()作用是把GET,POST,COOKIE的参数注册成变量,用在register_globals被禁用的时候,需要PHP在4.1到5.4之间的版本。
//关键字:import_request_variables
?>

php代码审计【13】变量覆盖 

 4、//$$变量覆盖

代码一

<?php
$b=3;
foreach (array('_COOKIE','_POST','_GET') as $_REQUEST) {
    foreach ($$_REQUEST as $_key => $_value) {
        echo $_key.'<br />';
        $$_key=addcslashes($_value);
    }
}
echo $b;
 
//$$变量覆盖
//关键字: $$
?>

php代码审计【13】变量覆盖 

<?php
$b=3;
foreach (array('_COOKIE','_POST','_GET') as $_REQUEST) {
    foreach ($$_REQUEST as $_key => $_value) {
        echo $_key.'<br />';
        $$_key=addslashes($_value);
    }
}
echo $b;
?>

 php代码审计【13】变量覆盖

 一个报错,另外一个正常输出。为什么呢?
addslashes 和addcslashes不是同一个函数,发现没有,只有一个字符的区别。
但是两个函数的功能都是一样的—转义字符串。
区别是啥?
addslashes只有一个参数-字符串
addcslashes需要两个参数,字符串,分隔符.
echo addcslashes("Who's John Adams?","'");这样写就可以正常输出了。

注意:

(1)$$导致变量覆盖,这时候我们只要找出变量没有未初始声明,就进入sql查询或者include包含文件中,就会产生漏洞。
(2)变量函数(变量1,变量2);由于开启全局注册,又post被extract,导致变量覆盖,变量作为函数执行,最终形成代码执行。
(3)变量在if中声明的,如果不经过if的话,变量算是没有声明的,就可以进行变量覆盖。
(4)etc