攻防世界: 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;。

成功拿到数据!

相关推荐
三少爷的鞋3 小时前
Java 线程自上而下,Kotlin 协程自下而上
android
Escalating_xu3 小时前
【Linux 网络编程】DNS 与 ICMP:从域名解析到 ping、traceroute,把“网络通不通”问清楚
linux·网络·php
好的佩奇5 小时前
Dart 之增强枚举
android·flutter·dart
梦影_5 小时前
MySQL进阶教程(五)—— SQL调优(下)
android·大数据·数据库·后端·sql·mysql·database
niucloud-admin5 小时前
NIUCLOUD PHP SAAS上门家政使用文档--服务订单:订单列表
开发语言·php
一枕槐安4875 小时前
大模型限流、重试、超时处理:API 调用健壮性方案
linux·服务器·php·大模型api·指数退避·限流控制·超时预算
李纲明6 小时前
WordPress 白屏或提示「出现了严重错误」:先开 WP_DEBUG 抓致命错误,再二分插件与主题
运维·php·debug·wordpress·白屏·插件冲突·devdiy
好的佩奇7 小时前
蓝牙之无线电与通信距离
android·flutter·蓝牙
其实防守也摸鱼8 小时前
Chrome 扩展安全攻防实录:从攻击面到防御实践
开发语言·前端·网络·chrome·安全·web安全·php
vilya8 小时前
我把一套完整的 Python Agent 运行时塞进手机 APK:依赖闭包、Rust 轮子和三个真机坑
android