攻防世界 simple PHP wp

题目描述:小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。

在这里插入图片描述

解题思路

在这里插入图片描述

  1. 分析代码逻辑

    • show_source(__FILE__);:显示当前文件的源代码,这通常是CTF题目中用于帮助选手理解代码逻辑的功能。
    • include("config.php");:引入配置文件,可能包含$flag1$flag2的定义。
    • $a=@$_GET['a'];:从GET参数中获取a的值,@符号用于抑制错误提示。
    • $b=@$_GET['b'];:从GET参数中获取b的值。
    • 第一个条件:
      if($a==0 and $a){
          echo $flag1;
      }
      
      这个条件看似矛盾,因为$a==0$a(即$a为真)不能同时成立。但在PHP中,==是弱比较,可能会有类型转换的漏洞。
    • 第二个条件:
      if(is_numeric($b)){
          exit();
      }
      
      如果$b是数值类型,程序会直接退出。我们需要确保$b不是数值类型。
    • 第三个条件:
      if($b>1234){
          echo $flag2;
      }
      
      如果$b大于1234,会输出$flag2
  2. 寻找漏洞点

    • 第一个条件漏洞$a==0 and $a。在PHP中,0""null等值会被认为是“假值”,而"0"(字符串形式的0)会被认为是“真值”。因此,如果$a是字符串"0"$a==0会成立(因为松散比较会将字符串"0"转换为数值0),同时$a(字符串"0")也会被认为是“真值”。因此,$a="0"可以触发输出$flag1
    • 第二个条件漏洞is_numeric($b)会检查$b是否为数值类型。我们需要确保$b不是数值类型,但同时又要满足$b>1234的条件。在PHP中,字符串和数值比较时,字符串会被尝试转换为数值。如果字符串以数字开头,会按照数字部分进行比较。例如,字符串"12345abc"会被转换为12345,因此"12345abc" > 1234会成立。同时,"12345abc"不是数值类型,不会触发is_numeric($b)的退出。

构造Payload

根据上述分析,我们可以构造以下payload来获取`$flag:
http://61.147.171.105:57553/?a=null&b=1235abc
在这里插入图片描述

最终flag

Cyberpeace{647E37C7627CC3E4019EC69324F66C7C}

知识点

  • is_numeric()函数

绕过方法一:
is_numeric($b)会检查$b是否为数值类型。我们需要确保$b不是数值类型,但同时又要满足$b>1234的条件。在PHP中,字符串和数值比较时,字符串会被尝试转换为数值。如果字符串以数字开头,会按照数字部分进行比较。例如,字符串"12345abc"会被转换为12345,因此"12345abc" > 1234会成立。同时,"12345abc"不是数值类型,不会触发is_numeric($b)的退出。
绕过方法二:
可以通过设置 $b 为一个数组来满足条件。

$b = array(1235);

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值