攻防世界: simple_php

攻防世界: simple_php

  1. 访问网页,可以看到源码部分如下
php 复制代码
<?php
show_source(__FILE__);
include("config.php");
$a=@$_GET['a'];
$b=@$_GET['b'];
if($a==0 and $a){
    echo $flag1;
}
if(is_numeric($b)){
    exit();
}
if($b>1234){
    echo $flag2;
}
?>

这里可以简单了解下php相关的知识:


松散比较 (==) 的类型转换

当字符串与数字使用 == 比较时,PHP会尝试将字符串转换为数字。

  • "0" == 0 → true (字符串 "0" 转为数字 0)

到布尔值的隐式转换 (if($a))

在 if、and、or 等布尔上下文中,值会被自动转换为 true 或 false。这里我的第一想法是让a='0',这样在比较相等的时候是相等的,但是非空字符串为true.


is_numeric() 函数的行为

它判断一个变量是否是数字或数字字符串,但比较严格:

  • 返回 true:1234、"1234"、"-123.4"、"1e4"、"0x4d2"(十六进制)
  • 返回 false:"1234abc"、"1234 "(尾部有空格)、"abc"、NULL

字符串与数字的 > 比较

当字符串与数字进行大小比较时,PHP的行为是:

  1. 尝试将整个字符串转换为数字。
  2. 转换规则:从左到右读取,直到遇到第一个非数字字符(小数点除外)为止,将读取到的数字部分作为转换结果。
  3. 如果字符串不是以数字开头 ,则转换结果为 0。

  1. 构造数据,根据前面的规则,我构造了下面的数据

a='0' (实际上是 a=0):

  • '0' 是一个字符串。在 $a==0 的松散比较中,PHP会将字符串 '0' 转换为数字 0,条件成立。
  • 同时,字符串 '0' 本身在 if($a) 的布尔判断中,它不为空且不是假值字符串 ,因此也为 true。(在PHP中,只有字符串 '' 和 '0' 会被认为是布尔假,但这里作为整体条件 $a 是存在的,所以为真。)
  • 因此满足 $a==0 and $a,触发 echo $flag1;。

b=1235a:

  • '1235a' 是一个以数字开头的字符串。is_numeric('1235a') 会返回 false,因此不会执行 exit()。
  • 在 $b>1234 的比较中,PHP会将字符串 '1235a' 强制转换为数字,取开头的 1235 进行比较,1235 > 1234 成立。
  • 因此触发 echo $flag2;。

成功拿到数据!

相关推荐
mmsx15 分钟前
Android 测绘数值基础:测量单位系统与七四参数、高程拟合
android
郑州光合科技余经理23 分钟前
出海外卖平台:支付对接为什么要和下单收款分开
android·java·开发语言·前端·后端·php·ai编程
夜雪一千24 分钟前
MySQL 如何提高查询速度:从索引、SQL、表结构到实战调优
android·sql·mysql
谢亮_vipxieliang34 分钟前
PHP 异常处理全解析:try-catch、自定义异常与全局异常处理器
开发语言·php
终端安全笔记43 分钟前
配置锁状态那一栏查的是什么:报告里几项各自指向什么风险
android·前端·安全·ios
恋猫de小郭1 小时前
Kotlin Toolchain 0.13,JetBrains 推荐 KMP 都切换到到全新工具链
android·前端·flutter
JaguarJack1 小时前
免费可商用 PHP 管理后台 CatchAdmin V5.4.1 发布,新增 MCP 支持
后端·php·laravel·服务端
BingoGo1 小时前
免费可商用 PHP 管理后台 CatchAdmin V5.4.1 发布,新增 MCP 支持
后端·php
谢亮_vipxieliang1 小时前
多智能体系统的“TCP/IP时刻”:MCP与A2A协议如何定义Agent时代
网络·tcp/ip·ai·php
安卓机器1 小时前
rom定制系列------小米8 安卓16线刷原生固件 体验新版本
android·小米8安卓16