【php弱类型的特性】

一、php弱类型简介

请添加图片描述

1、弱类型导致的问题

请添加图片描述

可以看到intval在遇到不能转换的字符串时,并没有报错,而是将返回值置0

2、弱类型导致松散比较的问题

请添加图片描述
请添加图片描述

3、比较举例

'0e123' == 0	#true

'0e123’会被当成科学计数,相当于0的123次幂等于0,和数字0比较

'0e123' == '0e321'	#true

0的123次幂和0的321次幂都等是零

'0x10' == 16

‘0x10’ 被php识别为16进制的10,对应的是10进制的16,都等于16

false == "" == 0 == NULL	#true

false在和数字比较时被转化为0,同理true会被转化为1,""为字符串,比较时会先将字符串转为数字不能转换的字符串或NULL会被转换成0

"app" == 0

"app"被转化为0,和0比较,转换为0

更多松散比较的例子:
请添加图片描述

二、CTF中弱类型的应用

demo1:

 <?php
highlight_file(__FILE__);
include('flag.php');
if (isset($_POST['a'])&isset($_POST['b'])) {
    if ($_POST['a']!=$_POST['b']) {
        if (md5($_POST['a']) == md5($_POST['b'])) {
            echo $flag;
        }else {
            echo 'fail!';
        }
    }
} 

问题分析

请添加图片描述

这个时候我们就需要用到之前松散比较的例子:

'0e123' == '0e321'	#true

这个时候我们只需要找到两个字符串经过md5加密后,满足0e+30个纯数字就能满足我们的条件

事实上这样的字符串是存在的,在此举例几个:
请添加图片描述

demo2:

请添加图片描述

 <?php
highlight_file(__FILE__);
include('flag.php');
if (isset($_POST['a'])&isset($_POST['b'])) {
    if ($_POST['a']!=$_POST['b']) {
        if (md5($_POST['a']) === md5($_POST['b'])) {
            echo $flag;
        }else {
            echo 'fail!';
        }
    }
} 

问题分析

请添加图片描述
我们将设给md5传入一个数组,看看会出现什么情况:
请添加图片描述
当我们给md5传入数组时,函数报出了警告,但是它并没有退出,而是返回了NULL,那么我们将a、b都传入数组的话,md5返回的数值都为NULL,NULL和NULL比较返回的就是true

demo3:

<?php
highlight_file(__FILE__);
include('flag3.php');

if(isset($_POST['a'])){
    $temp = json_decode($_POST['a']);
    if($temp->key == $flag){
        echo $flag;
    }else{
        die('ERROR!');
    }
} 

问题分析

请添加图片描述

请添加图片描述
那么我们只需要传入一个json数据中包含数字的值和0比较就能返回true

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值