PHP弱类型引发的漏洞实例

我们知道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弱类型引发的漏洞实例

输出:this is 2

 

实例:HDwikiSQL注入

PHP弱类型引发的漏洞实例

实际执行的语句:

SELECT COUNT(*) num FROM wiki_focus WHERE type=2 and 1=1

PHP弱类型引发的漏洞实例

in_array()

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

PHP弱类型引发的漏洞实例

 

实例:Piwigo SQL注入

is_numeric()

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

PHP弱类型引发的漏洞实例

ps: php7 输出:no no no, it's not number

 

实例:PHPYun二次注入

15221623968204.png!small

 

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

### PHP 弱类型特性及用法 #### 基本概念 PHP 是一种弱类型的编程语言,在这种环境中,变量的数据类型可以在必要时自动转换。这意味着开发者无需显式声明变量的类型,PHP 会在运算过程中根据上下文环境推断并调整这些类型[^1]。 #### 类型比较操作符 对于比较操作而言,`==` 和 `===` 存在差异。前者仅对比数值上的相等性,并允许不同类型的值之间进行隐式的类型转换;后者则是严格的全等比较,既检验值也校验数据类型的一致性。 ```php // 使用 == 进行松散比较 var_dump(0 == "abc"); // bool(true) // 使用 === 进行严格比较 var_dump(0 === "abc"); // bool(false) ``` #### 数据类型转换规则 当涉及到不同类型之间的比较或者赋值时,PHP 遵循特定的转换逻辑: - 字符串到整数/浮点数:如果字符串开头部分能解析成有效的数字,则取这部分作为结果; - 数字到布尔值:零或空字符串视为假(`false`),其他任何非零数值都视作真(`true`); - 浮点数到整数:会截掉小数部分只保留整数位; - 更多复杂的组合情况也有相应的处理方式。 #### 安全隐患 由于弱类型机制的存在,某些情况下可能导致意外行为甚至安全漏洞的发生。例如未经充分验证就使用来自用户的输入去构建查询语句、文件路径或是命令行参数等敏感场景下容易引发SQL注入、远程代码执行等问题[^2][^3]。 #### 应对措施 为了防止潜在风险,应当遵循最佳实践原则: - 对所有外部输入做必要的清理和验证工作; - 尽量采用严格模式下的比较运算符 (`===`, `!==`) 来替代宽松版本; - 利用预编译语句代替直接拼接 SQL 查询; - 不要轻易信任用户提交的内容用于创建对象实例或其他可能触发反射特性的场合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值