为了账号安全,请及时绑定邮箱和手机立即绑定

PHP弱类型引发的漏洞实例

标签:
PHP

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

类型转换

  1. 会先进行类型转换,再进行对比
  2. 会先比较类型,如果类型不同直接返回false,参考如下

图片描述

注意:

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

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

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

实例: DedeCMS(20180109)任意用户密码重置
博客: http://blog.nsfocus.net/dedecms-20180109/

函数松散性
switch()
如果switch是数字类型的case的判断时,switch会将其中的参数转换为int类型。
图片描述

实例:HDwikiSQL注入
图片描述

实际执行的语句:
$type = 'hot';

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进行解析成字符串存入到数据库中,如果这个字段再被取出来二次利用,就可能造成二次注入漏洞。
图片描述

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代码审计中也会遇到这种利用弱类型来绕过逻辑判断,进而引发更大问题的漏洞。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 1
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消