作为一个渗透测试的牛马人,还是要多写点代码。各位道友,对不?内卷起来吧!卷呀卷
变量覆盖常常被恶意攻击者用来跳过正常的业务逻辑,越过权限限制,恶意攻击系统,严重时将造成系统瘫痪。
1 全局变量覆盖
在PHP的安全配置中已经讲到(见公众号本系列PHP安全开发),当register_globals全局变量设置开启时,传递过来的值会被直接注册为全局变量而直接使用,这会造成全局变量覆盖。
如果通过$GLOBALS从浏览器动态获取变量,也会发生变量覆盖的情况。为了大家能够理解,我结合前面文章中全局变量配置的例子进行讲解。
一个简单的表单:
通过$GLOBALS获取浏览器提交的变量。
foreach ($_REQUEST as $param=>$value){
$GLOBALS[$param] => $value; //使用$GLOBALS造成变量覆盖
}
if (authenticated_user()){ //认证用户是否登录
$authorized = true;
}
攻击者在请求中构造authorized=true,无须认证用户名和密码就可以直接设置authorized的值为true,从而跳过认证进入登录状态。
为了避免全局变量覆盖的发生,开发人员不应该使用上面的方式从客户端接收动态变量放入到全局的$GLOBALS中。
修复后的代码如下:
$username = $_POST['username'];
$password = $_POST['password'];
if(authentcated_user($username,$password)){
$authorized = true;
}
诚招志同道合的徒弟,还一片教育的净土。
打败你的不是学费,而是“回去再考虑考虑”。如果时光倒退10年,你最想做的事是什么?毫无疑问,那是你错过了选择,选择比努力更重要!