在使用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比较缺陷
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论