当前位置: 首页 > news >正文

CTF Web 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则输出flagecho $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(非首位),!5false
  • intval("4476.0", 0)截断小数部分,得到4476

思考的流程图

最终Payload
?pangoulin=4476.0

总结

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

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

http://www.dtcms.com/a/265779.html

相关文章:

  • 【云计算】企业项目 策略授权
  • 网络层:ip协议 与数据链路层
  • C++反射之获取可调用对象的详细信息
  • 《Spring 中上下文传递的那些事儿》Part 2:Web 请求上下文 —— RequestContextHolder 与异步处理
  • 低代码实战训练营教学大纲 (10天)
  • Linux之Socket 编程 UDP
  • 自然光实时渲染~三维场景中的全局光照
  • osg加入实时光照SilverLining 天空和3D 云
  • 租车小程序电动车租赁小程序php方案
  • Flutter 3.29+使用isar构建失败
  • 创客匠人视角:知识变现与创始人 IP 打造的破局之道
  • centos7源码编译安装python3
  • SSM和SpringBoot框架的关系
  • 关于微前端框架micro,子应用设置--el-primary-color失效的问题
  • FPGA从零到一实现FOC(一)之PWM模块设计
  • 火语言 RPA:突破企业自动化瓶颈,释放数字生产力​
  • Linux基本命令篇 —— zip/unzip命令
  • Apache Commons Pool中的GenericObjectPool详解
  • 华为Freebuds 6i新音效,设置后音质敲好!
  • Nginx安全配置漏洞修复实战指南
  • 百度文心智能体平台x小米应用商店:联手打造行业首个智能体与应用市场跨端分发模式
  • React 强大的表单验证库formik之集成Yup、React Hook Form库
  • 使用 Dockerfile 构建基于 .NET9 的跨平台基础镜像
  • 安卓开机自启动方案
  • Kafka生态整合深度解析:构建现代化数据架构的核心枢纽
  • Sklearn安装使用教程
  • 机器人焊接电源节气阀
  • 工程化实践——标准化Eslint、PrettierTS
  • 读书笔记:《DevOps实践指南》
  • android 网络访问拦截器的编写的几种方式