freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

99+
PHP弱类型引发的漏洞实例
OK 2018-04-04 08:30:00 904386

*本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。

*本文作者:补丁君,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。

我们知道PHP 是一门弱类型语言,不必向 PHP 声明该变量的数据类型,PHP 会根据变量的值,自动把变量的值转换为正确的数据类型,但在这个转换过程中就有可能引发一些安全问题。

类型转换

1、会先进行类型转换,再进行对比

2、会先比较类型,如果类型不同直接返回false,参考如下

PHP弱类型引发的漏洞实例

注意:

1 . 当一个字符串被当作一个数值来取值,其结果和类型如下:如果该字符串没有包含'.','e','E'并且其数值值在整形的范围之内,该字符串被当作int来取值。其他所有情况下都被作为float来取值,该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0

PHP弱类型引发的漏洞实例

2.  在进行比较运算时,如果遇到了0e这类字符串,PHP会将它解析为科学计数法

PHP弱类型引发的漏洞实例

3.  在进行比较运算时,如果遇到了0x这类字符串,PHP会将它解析为十六进制

PHP弱类型引发的漏洞实例

实例:DedeCMS(20180109)任意用户密码重置

PHP弱类型引发的漏洞实例

在找回密码时,当$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=safequestion&safequestion=0e1&safeanwser=&id=1

PHP弱类型引发的漏洞实例

然后获取的重置面链接为:(只有没有设置安全问题的用户才能重置)

http://localhost/DedeCMS-V5.7-UTF8-SP2/member/resetpassword.php?dopost=getpasswd&id=1&key=D2kIQomh

PHP弱类型引发的漏洞实例 

函数松散性

switch()

如果switch是数字类型的case的判断时,switch会将其中的参数转换为int类型。

PHP弱类型引发的漏洞实例

实例:HDwikiSQL注入

PHP弱类型引发的漏洞实例

实际执行的语句:

PHP弱类型引发的漏洞实例

in_array()

in_array(search,array,type): 如果给定的值 search 存在于数组 array 中则返回 true(类似于==)。如果第三个参数设置为 true,函数只有在元素存在于数组中且数据类型与给定值相同时才返回 true(类似于===)。如果没有在数组中找到参数,函数返回 false。

PHP弱类型引发的漏洞实例

实例:Piwigo SQL注入

is_number()

is_numeric在做判断时候,如果攻击者把payload改成十六进制0x…,is_numeric会先对十六进制做类型判断,十六进制被判断为数字型为真,就进入了条件语句,如果再把这个代入进入sql语句进入mysql数据库,mysql数据库会对hex进行解析成字符串存入到数据库中,如果这个字段再被取出来二次利用,就可能造成二次注入漏洞。

PHP弱类型引发的漏洞实例

实例:PHPYun二次注入

PHP弱类型引发的漏洞实例

strcmp()

strcmp(string1,string2):比较括号内的两个字符串string1和string2,当他们两个相等时,返回0;string1的大于string2时,返回>0;小于时返回<0。在5.3及以后的php版本中,当strcmp()括号内是一个数组与字符串比较时,也会返回0。

图片 13.png

md5()

string md5 ( string $str [, bool $raw_output = false ] )

md5()需要是一个string类型的参数。但是当你传递一个array时,md5()不会报错,只是会无法正确地求出array的md5值,返回null,这样就会导致任意2个array的md5值都会相等。

PHP弱类型引发的漏洞实例

以上就是常见的利用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

http://www.jsdaima.com/blog/117.html

http://www.freebuf.com/articles/web/55075.html

*本文作者:补丁君,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。

# 漏洞 # PHP弱类型
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 OK 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
OK LV.5
Love * Peace
  • 2 文章数
  • 13 关注者
企业安全建设之云上落地开源SIEM初级实践指南
2020-10-20
Cobalt Strike之DNS Beacon使用记录
2017-02-21
更便捷的中间人攻击框架Xerosploit
2016-11-07
文章目录