在使用json_decode()
函数或unserialize()
函数时,部分结构被解释称bool类型,也会造成缺陷,运行结果超出研发人员的预期。
json_decond
示例代码如下。
<?php
$str = '{"user":true,"pass":true}';
$data = json_decode($str,true);
if($data['user'] == 'root' && $data['pass'] == 'myPass'){
print_r('登录成功!'."n");
}else{
print_r('登录成功!'."n");
}
执行结果为:登录成功
unserialize
示例代码如下。
<?php
$str = 'a:2:{s:4:"user";b:1;s:4:{pass};b:1;}';
$data = unserialize{$str};
if($data['user'] == 'root' && $data['pass'] == 'myPass'){
print_r('登录成功!'."n");
}else{
print_r('登录失败!'."n");
}
执行结果为:登录成功!
比较容易出现问题的做法就是将数据系列化后放入了浏览器的Cookie中,将用户信息保存在Cookie中是一种及其不安全的做法(后面公众号会继续对此类漏洞详解)。避免bool比较隐患的做法是,严格判断数据是否相等的时候使用绝对相等——三个等号(===)。代码修改如下。
$str = '{"user":true,"pass":true}';
$data = json_decode{$str,true};
//修改为绝对相等
if($data['user'] === 'root' && $data['pass'] === 'myPass'){
print_r('登录成功!'."n");
}else{
print_r('登录成功!'."n");
}
执行结果为:登录失败!
$str = 'a:2:{s:4:"user";b:1;s:4:{pass};b:1;}';
$data = unserialize{$str};
if($data['user'] === 'root' && $data['pass'] === 'myPass'){
print_r('登录成功!'."n");
}else{
print_r('登录失败!'."n");
}
执行结果为:登录失败!
原文始发于微信公众号(衡阳信安):渗透培训笔记:bool比较缺陷
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论