PHP弱类型引发的漏洞实例
source link: https://www.freebuf.com/articles/web/166543.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
*本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。
*本文作者:补丁君,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。
我们知道PHP 是一门弱类型语言,不必向 PHP 声明该变量的数据类型,PHP 会根据变量的值,自动把变量的值转换为正确的数据类型,但在这个转换过程中就有可能引发一些安全问题。
1、会先进行类型转换,再进行对比
2、会先比较类型,如果类型不同直接返回false,参考如下
注意:
1 . 当一个字符串被当作一个数值来取值,其结果和类型如下:如果该字符串没有包含'.','e','E'并且其数值值在整形的范围之内,该字符串被当作int来取值。其他所有情况下都被作为float来取值,该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。
2. 在进行比较运算时,如果遇到了0e这类字符串,PHP会将它解析为科学计数法。
3. 在进行比较运算时,如果遇到了0x这类字符串,PHP会将它解析为十六进制。
实例:DedeCMS(20180109)任意用户密码重置
在找回密码时,当$dopost = safequestion时,通过传入的member_id查询出对应id用户的安全问题和答案信息,当我们传入的问题和答案不为空,而且等于之前设置的问题和答案,就进入sn()函数。
这里如果用户设置了问题和答案,我们并不知道问题和答案是什么,就无法进入sn()函数。但是如果此用户没有设置问题和答案呢?此时系统默认问题0",答案是空。0.、0.1、0e1、利用PHP弱类型即可绕过if判断
直接发送如下请求即可获取重置密码的链接:
然后获取的重置面链接为:(只有没有设置安全问题的用户才能重置)
http://localhost/DedeCMS-V5.7-UTF8-SP2/member/resetpassword.php?dopost=getpasswd&id=1&key=D2kIQomh
函数松散性
switch()
如果switch是数字类型的case的判断时,switch会将其中的参数转换为int类型。
实例:HDwikiSQL注入
实际执行的语句:
in_array()
in_array(search,array,type): 如果给定的值 search 存在于数组 array 中则返回 true(类似于==)。如果第三个参数设置为 true,函数只有在元素存在于数组中且数据类型与给定值相同时才返回 true(类似于===)。如果没有在数组中找到参数,函数返回 false。
实例:Piwigo SQL注入
is_number()
is_numeric在做判断时候,如果攻击者把payload改成十六进制0x…,is_numeric会先对十六进制做类型判断,十六进制被判断为数字型为真,就进入了条件语句,如果再把这个代入进入sql语句进入mysql数据库,mysql数据库会对hex进行解析成字符串存入到数据库中,如果这个字段再被取出来二次利用,就可能造成二次注入漏洞。
实例:PHPYun二次注入
strcmp()
strcmp(string1,string2):比较括号内的两个字符串string1和string2,当他们两个相等时,返回0;string1的大于string2时,返回>0;小于时返回<0。在5.3及以后的php版本中,当strcmp()括号内是一个数组与字符串比较时,也会返回0。
md5()
string md5 ( string $str [, bool $raw_output = false ] )
md5()需要是一个string类型的参数。但是当你传递一个array时,md5()不会报错,只是会无法正确地求出array的md5值,返回null,这样就会导致任意2个array的md5值都会相等。
以上就是常见的利用PHP弱类型产生的一些安全问题,在CTF、PHP代码审计中也会遇到这种利用弱类型来绕过逻辑判断,进而引发更大问题的漏洞。希望这个小结能帮助到大家,谢谢~~
http://php.net/manual/zh/types.comparisons.php
http://wooyun.org/bugs/wooyun-2015-089892
http://wooyun.org/bugs/wooyun-2015-0122884
http://blog.nsfocus.net/dedecms-20180109/
https://blog.formsec.cn/2018/02/05/php-weak-type/
https://www.cnblogs.com/Mrsm1th/p/6745532.html
*本文作者:补丁君,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。
本文作者:KEYONE, 转载请注明来自FreeBuf.COM
Recommend
-
45
Struts2著名RCE漏洞引发的十年之思
-
10
PHP漏洞挖掘思路+实例 lxj616 ·...
-
8
PHP漏洞挖掘思路+实例 第二章 lxj616 ·...
-
26
-
7
本文初完成于2020年3月31日,由于涉及到0day利用,所以于2020年3月31日报告厂商、CNVD漏洞平台,满足90天漏洞披露期,遂公开。 前几天偶然看到了一篇在hackone上提交得漏洞报告,在这个漏洞中,漏洞发现者提出了很有趣的利用,作者利用GMP的一个类...
-
7
类实例对象的class类型却不属于该类,何解?标题可能会让人一头雾水,直接上例子如果我们在代码中,执行如下内容server instanceof MvpServer它返回的东西会是啥...
-
1
最近互联网技术圈最火的一件事莫过于Log4j2的漏洞了。同时也涌现出了各类分析文章,关于漏洞的版本、漏洞的原因、漏洞的修复、程序员因此加班等等。经常看我文章的朋友都知道,面对这样热门有意思的技术点,怎能错过深入分析一波呢?大概你也已经听说了...
-
3
为什么这个T类型实例无法调用*T类型的方法 本文永久链接 – https://tonybai.com/2022/02/27/go-addressable 近期在“Go语言第一...
-
6
四个实例递进php反序列化漏洞理解 阅读量 425344...
-
3
两个由于IP地址冲突引发的故障(Veeam与vSAN故障实例) 精选 原创 IP地址冲突...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK