题目
提示:
小宁听说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