
CTFShow 萌新区 Web 1-21 命令执行漏洞深度解析5 种绕过 intval() 限制的实战技巧在CTF竞赛中PHP命令执行漏洞是Web安全方向的常见考点。本文将系统剖析CTFShow萌新区Web 1-21系列题目中涉及的关键技术点重点讲解如何绕过intval()函数限制的5种核心手法帮助参赛者建立完整的解题思维框架。1. 理解 intval() 函数的安全限制intval()是PHP中用于获取变量整数值的函数其行为特性直接影响安全过滤效果$id $_GET[id]; if(intval($id) 999){ die(Access Denied); }关键特性分析字符串转换规则100abc→100abc100→0进制识别能力支持16进制(0x前缀)和二进制(0b前缀)特殊字符处理科学计数法(1e3)、小数点(10.5)等会被截断注意intval()在安全过滤中常被误用为完美的数字验证实际上存在多种绕过可能。2. 五种核心绕过手法详解2.1 单引号字符串绕过原理PHP的弱类型特性允许字符串形式的数字参与数值比较1000 1000 // truePayload示例?id1000适用场景代码使用松散比较未对引号进行过滤2.2 算术运算符绕过原理利用PHP的表达式求值特性构造合法数学表达式操作符对照表运算符示例计算结果*100*101000/2000/2100050011000^1024^241000Payload示例?id100*10 ?id50012.3 进制转换绕过原理利用intval()对不同进制表示法的解析差异进制对照表进制类型前缀示例十进制值十六进制0x0x3e81000二进制0b0b11111010001000Payload示例?id0x3e8 ?id0b11111010002.4 二次取反绕过原理利用位运算保持数值不变但改变类型特征~~1000 1000 // truePayload示例?id~~10002.5 字符串拼接绕过原理动态构造满足条件的参数值实现方式参数污染id999id1000逻辑运算符id999 || id1000注释截断id999/*x*/1000Payload示例?id999 || id1000 ?id999 - -13. 进阶过滤场景下的组合技巧随着题目难度提升会出现更复杂的过滤条件。以下是Web 1-21系列中出现的过滤演进路径3.1 过滤关键词的绕过典型过滤代码if(preg_match(/or|\-|\\|\*|\|\|\!|x|hex|\/i,$id)){ die(Filtered); }解决方案使用未被过滤的运算符?id5001利用位运算?id999^19993.2 特殊符号限制的突破严格过滤场景if(preg_match(/\|\|or|\||\-|\\\|\/|\\*|\|\|\^|\!|\~|x|hex|\(|\)|\|select/i,$id)){ die(Filtered); }可用技巧纯数字运算?id9991隐式类型转换?id1e34. 实战Payload对比分析下表总结了Web 1-21题目中不同过滤级别下的有效Payload题目编号过滤强度有效Payload示例技术要点Web1基础1000、0x3e8类型转换、进制绕过Web5中等~~1000、9991位运算、算术运算Web7严格999- -1、5001负负得正、位移运算Web21综合999^1999、1000.0异或运算、浮点特性5. 防御方案与最佳实践针对命令执行漏洞推荐采用多层防御策略输入验证// 严格类型检查 if(!is_numeric($id) || (int)$id 999){ die(Invalid input); }白名单过滤$allowed [100,200,300]; if(!in_array($id, $allowed)){ die(Not allowed); }参数绑定数据库场景$stmt $pdo-prepare(SELECT * FROM table WHERE id ?); $stmt-execute([$id]);在CTF实战中遇到intval()限制时建议按照以下步骤进行测试尝试基本字符串形式测试各种数学运算符验证不同进制表示法组合使用位运算和逻辑运算检查参数污染等边缘情况