CTF Web PHP弱类型与进制绕过(过滤)

题目代码分析

php 复制代码
if(isset($_GET['pangoulin'])){ // 有pangoulin参数
    $pangoulin = $_GET['pangoulin'];
    if($pangoulin==="4476"){ // 严格等于"4476"拦截
        die("no no no!");
    }
    if(preg_match("/[a-z]/i", $pangoulin)){ // 有字母拦截
        die("no no no!");
    }
    if(!strpos($pangoulin, "0")){ // 没有"0"或"0"在首位拦截
        die("no no no!");
    }
    if(intval($pangoulin,0)===4476){ // 转换为数字等于4476则输出flag
        echo $flag;
    }
}
绕过条件分解

1.严格字符串拦截
=== "4476"要求参数不能为字符串"4476",但可通过其他形式(如浮点、进制)表示4476。

2.字母过滤

正则/[a-z]/i禁止任何字母,排除十六进制(如0x117c)或科学计数法(如4476e0)的解法。

3.数字0的位置限制
!strpos($pangoulin, "0")需满足:

  • 必须包含字符"0"(否则strpos返回false,!false触发拦截)。
  • "0"不能在首位(否则strpos返回0,!0触发拦截)。

4.intval转换规则
intval($pangoulin, 0)的自动进制识别逻辑:

  • 0x前缀:十六进制(受0的位置限制)
  • 0前缀:八进制(受0的位置限制)
  • 其他:十进制
  • 需最终十进制值为4476。
有效解法与原理

浮点形式"4476.0"

  • 不匹配=== "4476"
  • 无字母,通过正则
  • strpos("4476.0", "0")返回5(非首位),!5为false
  • intval("4476.0", 0)截断小数部分,得到4476

思考的流程图

最终Payload
复制代码
?pangoulin=4476.0

总结

本题考查PHP弱类型、进制识别和strpos返回值陷阱,只允许数字且"0"不能在首位。

利用"4476.0"(浮点数形式)既能通过所有过滤,又能被intval转为4476,成功拿到flag。

相关推荐
多客:duokelijie16 小时前
代练订单系统选型思路:跨品类游戏接入、订单分层管理、自动结算逻辑拆解!
数据库·mysql·微信小程序·前端框架·uni-app·php·持续部署
从琳开始98920 小时前
网络原理入门(二)------OSI七层模型?TCP/IP五层(四层)模型原来是这样的
java·网络·tcp/ip·java-ee·php
BingoGo21 小时前
PHP 标准库的价值远不止少写几行代码
后端·php
JaguarJack21 小时前
PHP 标准库的价值远不止少写几行代码
后端·php·服务端
evoxwht1 天前
给 CRMEB V8 接一个 S3 兼容存储驱动
php
北京中科新远科技2 天前
高速交换机端口预算怎么做?下行、上联、拆分和冗余计算框架
开发语言·php
其实防守也摸鱼2 天前
信创安全竞赛知识总结与题库
大数据·网络·人工智能·算法·安全·php
可涵不会debug2 天前
PHP2Shell 爆发一周后:CVE-2026-109618/109619 自查、修复与防护实录
安全·php·云安全·waf·phpshell
一支蜉蝣2 天前
Day26 XD安全学习笔记--PHP 应用&模版引用&Smarty渲染&MVC 模型&数据联动&RCE 安全
笔记·网络安全·html·php
vipxieliang2 天前
PHP 中的设计模式:工厂模式与单例
php