博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php比较操作符的安全问题
阅读量:4044 次
发布时间:2019-05-24

本文共 3424 字,大约阅读时间需要 11 分钟。

0x00 比较操作符


php的比较操作符有==(等于)松散比较,===(完全等于)严格比较,这里面就会引入很多有意思的问题。

在松散比较的时候,php会将他们的类型统一,比如说字符到数字,非bool类型转换成bool类型,为了避免意想不到的运行效果,应该使用严格比较。如下是php manual上的比较运算符表:

例子        名称         结果$a == $b    等于      TRUE,如果类型转换后 $a 等于 $b。$a === $b   全等      TRUE,如果 $a 等于 $b,并且它们的类型也相同。$a != $b    不等      TRUE,如果类型转换后 $a 不等于 $b。$a <> $b    不等      TRUE,如果类型转换后 $a 不等于 $b。$a !== $b   不全等     TRUE,如果 $a 不等于 $b,或者它们的类型不同。$a < $b     小与      TRUE,如果 $a 严格小于 $b。$a > $b     大于      TRUE,如果 $a 严格大于 $b。$a <= $b    小于等于     TRUE,如果 $a 小于或者等于 $b。$a >= $b    大于等于     TRUE,如果 $a 大于或者等于 $b。

0x01 安全问题


1 hash比较缺陷

php在处理hash字符串的时候会用到!=,==来进行hash比较,如果hash值以0e开头,后边都是数字,再与数字比较,就会被解释成0*10^n还是为0,就会被判断相等,绕过登录环节。

1
2
3
4
root@kali:~
/tool
# php -r 'var_dump("00e0345" == "0");var_dump("0e123456789"=="0");var_dump("0e1234abc"=="0");'
bool(
true
)
bool(
true
)
bool(
false
)

当全是数字的时候,宽松的比较会执行尽力模式,如0e12345678会被解释成0*10^12345678,除了e不全是数字的时候就不会相等,这能从var_dump("0e1234abc"=="0")可以看出来。

2 bool 欺骗

当存在json_decode和unserialize的时候,部分结构会被解释成bool类型,也会造成欺骗。json_decode示例代码:

1
2
3
4
5
6
$json_str
=
'{"user":true,"pass":true}'
;
$data
= json_decode(
$json_str
,true);
if
(
$data
[
'user'
] ==
'admin'
&&
$data
[
'pass'
]==
'secirity'
)
{
    
print_r(
'logined in as bool'
.
"\n"
);
}

运行结果:

1
2
root@kali:
/var/www
# php /root/php/hash.php
logined
in
as bool

unserialize示例代码:

1
2
3
4
5
6
$unserialize_str
=
'a:2:{s:4:"user";b:1;s:4:"pass";b:1;}'
;
$data_unserialize
= unserialize(
$unserialize_str
);
if
(
$data_unserialize
[
'user'
] ==
'admin'
&&
$data_unserialize
[
'pass'
]==
'secirity'
)
{
    
print_r(
'logined in unserialize'
.
"\n"
);
}

运行结果如下:

1
2
root@kali:/
var
/www# php /root/php/hash.php
logined in unserialize

3 数字转换欺骗

1
2
3
4
5
6
7
8
9
$user_id
= (
$_POST
[
'user_id'
]);
if
(
$user_id
==
"1"
)
{
    
$user_id
= (int)(
$user_id
);
    
#
$user_id
=
intval
(
$user_id
);
    
$qry
=
"SELECT * FROM `users` WHERE user_id='$user_id';"
;
}
$result
= mysql_query(
$qry
)
or
die
(
'<pre>'
. mysql_error() .
'</pre>'
);
print_r(mysql_fetch_row(
$result
));

将user_id=0.999999999999999999999发送出去得到结果如下:

Array(    [0] => 0    [1] => lxx'    [2] =>     [3] =>     [4] =>     [5] => )

本来是要查询user_id的数据,结果却是user_id=0的数据。int和intval在转换数字的时候都是就低的,再如下代码:

1
2
3
4
5
6
if
(
$_POST
[
'uid'
] != 1) {
 
$res
=
$db
->query(
"SELECT * FROM user WHERE uid=%d"
, (int)
$_POST
[
'uid'
]);
 
mail(...);
}
else
{
 
die
(
"Cannot reset password of admin"
);
}

假如传入1.1,就绕过了$_POST['uid']!=1的判断,就能对uid=1的用户进行操作了。另外intval还有个尽力模式,就是转换所有数字直到遇到非数字为止,如果采用:

if (intval($qq) === '123456'){    $db->query("select * from user where qq = $qq")}

攻击者传入123456 union select version()进行攻击。

4 PHP5.4.4 特殊情况

这个版本的php的一个修改导致两个数字型字符溢出导致比较相等

$ php -r 'var_dump("61529519452809720693702583126814" == "61529519452809720000000000000000");'bool(true)

3 题外话:

同样有类似问题的还有php strcmp函数,manual上是这么解释的,int strcmp ( string $str1 , string $str2 ),str1是第一个字符串,str2是第二个字符串,如果str1小于str2,返回<0,如果str1>str2,返回>0,两者相等返回0,假如str2为一个array呢?

1
2
3
4
5
6
7
8
$_GET
[
'key'
] =
array
();
$key
=
"llocdpocuzion5dcp2bindhspiccy"
;
$flag
=
strcmp
(
$key
,
$_GET
[
'key'
]);
if
(
$flag
== 0) {
    
print
"Welcome!"
;
}
else
{
    
print
"Bad key!"
;
}

运行结果:

root@kali:~/php# php strcmp.phpPHP Warning:  strcmp() expects parameter 2 to be string, array given in /root/php/strcmp.php on line 13Welcome!

参考: 1,http://phpsadness.com/sad/47
2,http://php.net/language.operators.comparison

3,http://indico.cern.ch/event/241705/material/slides/0.pdf

http://drops.wooyun.org/tips/7679

转载地址:http://rwhdi.baihongyu.com/

你可能感兴趣的文章
Oracle 12C DG 搭建(RAC-RAC/RAC-单机)
查看>>
Truncate 表之恢复
查看>>
Oracle DG failover 后恢复
查看>>
mysql 主从同步配置
查看>>
为什么很多程序员都选择跳槽?
查看>>
mongdb介绍
查看>>
mongdb安装使用
查看>>
mongdb在java中的应用
查看>>
区块链技术让Yotta企业云盘为行政事业服务助力
查看>>
yotta企业云盘助力制造行业创高峰
查看>>
Yotta企业云盘更好的为媒体广告业服务
查看>>
Yotta企业云盘助力旅游行业新发展
查看>>
Yotta企业云盘助力科技行业创高峰
查看>>
Yotta企业云盘更好地为教育行业服务
查看>>
Yotta企业云盘怎么帮助到能源化工行业
查看>>
企业云盘如何助力商业新发展
查看>>
医疗行业运用企业云盘可以带来什么样的提升
查看>>
教育数字智能化能为现有体系带来新的起点
查看>>
媒体广告业如何将内容资产进行高效地综合管理与利用
查看>>
能源化工要怎么管控核心数据
查看>>