PHP动态变量是指一个变量的变量名可以动态地设置和使用,一个变量获取另一个变量的值作为这个变量的变量名。
下面是动态变量的示例:
$Bar = "a";
$Foo = "Bar";
$World = "Foo";
$Hello = "World";
$a = "Hello";
echo $a; //输出Hello
echo "n";
echo $$a; //输出World
echo "n";
echo $$$a; //输出Foo
echo "n";
echo $$$$a; //输出Bar
echo "n";
echo $$$$$a; //输出a
echo "n";
echo $$$$$$a; //输出Hello
echo "n";
echo $$$$$$$a; //输出World
开发人员在平时开发过程中多多少少会使用一些动态变量,然而使用不当将会造成变量覆盖,所以应该尽量避免使用PHP的动态变量。
下面代码示例中的动态变量就属于使用不当的情况。
foreach($_POST as $key => $value){
$$key = $value; //造成动态变量覆盖
}
if(authenticated_user()){ //认证用户是否登录
$authorized = true;
}
当用户提交的参数中包含authorized = true时,在执行authenticated_user()步骤之前,authorized的值已经被设置为true,因此用户在无须通过校验的情况下即可直接向下执行,绕过了校验逻辑,造成任意越权访问的后果。
为了避免全局变量覆盖的发生,应尽量不使用动态变量接收客户端参数。
修复后的代码(这段代码第二次出来,大家发现在哪篇文章的建议修复代码是下面的呢?可以留言哟,有惊喜)。
$username = $_POST['username'];
$password = $_POST['password'];
if(authentcated_user($username,$password)){ //认证用户是否登录
$authorized = true;
}
诚招志同道合的徒弟,还一片教育的净土。
打败你的不是学费,而是“回去再考虑考虑”。如果时光倒退10年,你最想做的事是什么?
毫无疑问,那是你错过了选择,选择比努力更重要!
保证:优质的价格、增值的服务、技术的天堂
学习内容:Web漏洞挖掘、CTF、二进制、逆向、代码审计、免杀等。深耕红蓝紫对抗、渗透攻击链、漏洞分析与挖掘、红队武器开发、二进制安全等。
学成:加入团队做项目、内推、护网、工作。
方式:手把手,一对一咨询。
非诚勿扰,请扫描下方二维码或添加微信:yuanchao2015
原文始发于微信公众号(船山信安):原创 | PHP变量安全之动态变量覆盖
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论