我是靠谱客的博主 能干酸奶,这篇文章主要介绍PHP弱类型漏洞学习,现在分享给大家,希望可以做个参考。

简介

PHP在使用双等号(==)判断的时候,不会严格检验传入的变量类型,同时在执行过程中可以将变量自由地进行转换类型。由于弱数据类型的特点,在使用双等号和一些函数时,会造成一定的安全隐患

eg:

复制代码
1
2
3
4
5
6
7
8
<?php var_dump("admin"==0); //true var_dump("1admin"==1); //true var_dump("admin1"==1); //false var_dump("admin1"==0); //true var_dump("0e123456"=="0e4456789"); //true ?>

== 在进行比较的时候,会先将字符串类型转化成相同,再比较

=== 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较

Hash比较缺陷

研发人员在对比Hash2字符串的时候常常用到等于、不等于(!=)进行比较。如果Hash值以0e开头,后面都是数字,当与数字进行比较时,就会被解析成0x10n,会被判与0相等,攻击者可以绕过某些系统逻辑

PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。

攻击者可以利用这一漏洞,通过输入一个经过哈希后以”0E”开头的字符串,即会被PHP解释为0,如果数据库中存在这种哈希值以”0E”开头的密码的话,他就可以以这个用户的身份登录进去,尽管并没有真正的密码。

复制代码
1
2
3
4
<?php var_dump("0e123456789012345678901234567890"==="0"); //false var_dump("0e123456789012345678901234567890"=="0"); //true ?>

加密后为0E的字符

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
QNKCDZO 0e830400451993494058024219903391 s878926199a 0e545993274517709034328855841020 s155964671a 0e342768416822451524974117254469 s214587387a 0e848240448830537924465865611904 s214587387a 0e848240448830537924465865611904 s878926199a 0e545993274517709034328855841020 s1091221200a 0e940624217856561557816327384675 s1885207154a 0e509367213418206700842008763514 s1502113478a 0e861580163291561247404381396064 s1885207154a 0e509367213418206700842008763514 s1836677006a 0e481036490867661113260034900752 s155964671a 0e342768416822451524974117254469 s1184209335a 0e072485820392773389523109082030 s1665632922a 0e731198061491163073197128363787 s1502113478a 0e861580163291561247404381396064 s1836677006a 0e481036490867661113260034900752 s1091221200a 0e940624217856561557816327384675 s155964671a 0e342768416822451524974117254469 s1502113478a 0e861580163291561247404381396064 s155964671a 0e342768416822451524974117254469 s1665632922a 0e731198061491163073197128363787 s155964671a 0e342768416822451524974117254469
View Code

 CTF例题

复制代码
1
2
3
4
5
6
7
8
9
<?php $pass=$_GET['password']; $password='0e342768416822451524974117254469'; if (md5($pass)==$password) { echo "flag{xx-xx-xxxx-xiaohua}"; }else{ echo "error"; } ?>

payload:

复制代码
1
http://127.0.0.1/index.php?password=s1885207154a

预防方案 :

PHP5.6以上使用hash_equals()函数比较Hash值,可以避免对比恶意绕过

低于5.6可用可以实现的函数解决

参考学习:https://www.freebuf.com/news/67007.html

bool比较缺陷

在使用json_decode()函数或使用unserialize()函数时,部分结构被解释成bool类型,也会造成缺陷。

json_decode漏洞代码:

复制代码
1
2
3
4
5
6
7
8
<?php $str='{"user":true,"pass":true}'; $data=json_decode($str,true); if($data['user']=='root' && $data['pass']=='myPass'){ print_r('登陆成功 获得flag{xx-ssss-xiaohua}'); }else{ print_r('登陆失败!'); }
View Code

unserialize漏洞代码:

复制代码
1
2
3
4
5
6
7
8
9
<?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('登陆成功 获得flag{xx-ssss-xiaohua}'); }else{ print_r('登陆失败!'); } ?>
View Code

 避免bool比较可以使用三个等号作比较即可。

数字转换比较缺陷

当赋值给PHP变量的整型超过PHP的最大值PHP_INT_MAX时,PHP将无法计算出正确的结果,攻击者可能会利用其跳过某些校验逻辑,如密码校验、账号充值校验等

复制代码
1
2
3
4
5
<?php $a=98869694308861098395599991222222222222; $b=98869694308861098395599992999999999999; var_dump($a===$b); ?>
View Code

 再实际的业务逻辑中,一定要对最大值进行限制,避免数据越界而导致错误的执行结果。

switch比较缺陷

当再switch中使用case判断数字时,switch会将其中的参数转换为int类型进行计算

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php $num='2xiaohua'; switch($num){ case 0:echo '000000'; break; case 1:echo '1111'; break; case 2:echo '2222222'; break; case 3:echo '333333'; } ?>   
View Code

 最终输出2222  

数组比较缺陷

当使用in_array()或array_search()函数时,如果$strict参数吗有设置为true,则in_array()或array_search()将使用松散来判断$needle是否存在$haystack中

复制代码
1
2
3
bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )//strict默认为false miixed array_search( mixed $needle , array $haystack [, bool $strict = FALSE ] )//strict默认为false

漏洞代码:

复制代码
1
2
3
4
5
<?php $array=[0,1,2,'3']; var_dump(in_array('abc',$array)); var_dump(array_search('abc',$array)); ?>
View Code

2222

参考学习:《php安全之道》

最后

以上就是能干酸奶最近收集整理的关于PHP弱类型漏洞学习的全部内容,更多相关PHP弱类型漏洞学习内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(80)

评论列表共有 0 条评论

立即
投稿
返回
顶部