ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
变量覆盖漏洞产生的原因有两种 第一种 是 register_globals 为 on 的情况,PHP4 默认开启,PHP5 以后默认关闭。 第二种 是人为注册成为全局变量 全局变量的取值与赋值 ``` <form action='' method='get'> <input type='text' name='username' value='alex' > <input type='submit' name='sub' value='sub'> </form> <?php echo 'username::',$username; echo '<br>sub::',$sub; echo '<br>GET::'; print_r($_GET); //或者直接访问携带参数test.php?username=alex&sub=sub ``` 当register_globals = On的时候,程序运行**提交**时输出结果为: ~~~ username::alex sub::sub array ( [username] => alex [sub] => sub ) ~~~ 当register_globals = Off的时候,程序运行提交输出结果为: ~~~ username:: sub:: array ( [username] => alex [sub] => sub ) ~~~ 通过测试结果,显而易见:register\_globals的意思就是注册为全局变量,所以当On的时候,传递过来的值会被直接的注册为全局变量直接使用,而Off的时候,我们需要到特定的数组里去得到它。 人为注册全局变量 ``` foreach (array('_GET','_POST') as $request){ foreach ($$request as $_k=>$_v){ $$_k=$_v; } } 注入上面的代码后,想要那个变量,请求参数携带就行了 //http://www.test.com/audit/test.php?moon=1 echo $moon;//1 http://www.test.com/audit/test.php?user=tom echo $user;//tom ```