攻防世界: 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" == 0true (字符串 "0" 转为数字 0

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

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


is_numeric() 函数的行为

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

  • 返回 true1234"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;

成功拿到数据!

相关推荐
云水一下3 小时前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
weiggle3 小时前
第七篇:状态提升与单向数据流——架构设计的核心
android
xingpanvip4 小时前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua
goldenrolan4 小时前
A公司物料替代测试系统 v1.7:从需求到 exe/apk 的 AI 辅助全链路实践
android·自动化测试·软件测试·python·ai
AC赳赳老秦5 小时前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
骇客之技术6 小时前
AutoLua:在安卓上写 Lua 脚本
android·junit·lua
酉鬼女又兒7 小时前
零基础入门计算机网络运输层:端到端通信核心作用、端口号分类规则、复用分用工作机制及UDP与TCP协议全方位对比详解
网络·网络协议·tcp/ip·计算机网络·考研·udp·php
dog2507 小时前
不要再继续优化 TCP
网络协议·tcp/ip·php
kiros_wang7 小时前
Android 常见面试题
android
Channing Lewis7 小时前
PHP 解析 Excel 的那些坑:一次“行号错位”引发的数据丢失
开发语言·php·excel