【?】Web_XCTF_WriteUp | simple_php

发布时间 2023-11-28 13:03:23作者: Guanz

题目

提示
小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。

题目

分析

读代码:

<?php                  // php脚本的开始部分
show_source(__FILE__); // 对当前文件进行php语法高亮显示
include("config.php"); // 引用config.php文件
$a=@$_GET['a'];        // 收集GET表单中的字符'a'的值赋给变量a,当收集GET表单时出错,“@”符号可抑制错误诊断
$b=@$_GET['b'];
if($a==0 and $a){      // “==”为松散比较。当变量a(转换为整型)的值等于0,且变量a的值为TRUE(a不为空且a的值不为0)时
    echo $flag1;       // 输出变量flag1的值
}
if(is_numeric($b)){    // 当变量b为数字或数字字符串时
    exit();            // 退出当前脚本
}
if($b>1234){           // 当变量b的值大于1234时
    echo $flag2;       // 输出变量flag2的值
}
?>                     // php脚本的结束部分

根据代码内容,我们需要对脚本传参 a 和 b。
参数 a 不能为 false、不能为空、不能为 0,但可以通过一个非数值 0 的值转换为数值 0。
参数 b 不能为数字或数字字符串,但可通过其他类型的变量进行类型转换后等同于大于 1234 的值。


能满足参数 a 要求的有:

  • (?)float 值 0.xx(在 \((0,1)\) 范围的小数)
  • string 值以 0 或字符开头

能满足参数 b 要求的有:

  • string 值以大于 1234 的数字开头,拼接字符串

由于所有 GET 参数在 PHP 中都是字符串,所以当我们将诸如 “true” 或 “True” 作为 a 的参数传入时实际传入的是字符串,仍可得到 flag1 的值:


【?】但奇怪的是当我们将 0.1 或 0.9 作为 a 的参数时,我们未能得到 flag1 的输出:


用在线工具跑了一下证实 0.1 为 True 且 0.1 不为 0:

或许是 url 对参数进行了过滤?或者是系统对浮点数的精度存在限制?此处存疑。


故实际在 url 中能够传递的参数只有:
参数 a:以 0 或字符开头的 string 值
参数 b:以大于 1234 的数字开头,拼接字符串的 string 值


按要求对 url 传参 http://61.147.171.105:52312/?a=a&b=1235a

得到 flag。

Flag

Cyberpeace{647E37C7627CC3E4019EC69324F66C7C}

参考

PHP教程-菜鸟教程
PHP: 错误控制运算符-Manual
php中判断值真假-C_Unique-CSDN
PHP中的强制类型转换-硬核项目经理-腾讯云开发者社区
通过PHP GET传递布尔值-码农家园
PHP: 比较运算符-Manual
PHP: Float 浮点型-Manual