CTF你真的懂PHP吗--PHP代码审计

本文详细解析了一个CTF挑战中的回文数漏洞,通过代码审计发现并利用了回文数验证过程中的逻辑缺陷,成功获取了FLAG。介绍了如何构造payload绕过检查,适合对CTF和代码审计感兴趣的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://ctf5.shiyanbar.com/web/PHP/index.php

就是一个纯代码审计

在这里插入图片描述

访问.txt地址撸一把源码
进行分析

<?php


$info = ""; 
$req = [];
$flag="xxxxxxxxxx";

ini_set("display_error", false); 
error_reporting(0); 


if(!isset($_POST['number'])){
   header("hint:6c525af4059b4fe7d8c33a.txt");

   die("have a fun!!"); 
}

foreach([$_POST] as $global_var) { 
    foreach($global_var as $key => $value) { 
        $value = trim($value); 
        is_string($value) && $req[$key] = addslashes($value); 
    } 
} 


function is_palindrome_number($number) {      //定义一个方法判断是否为回文数  如:  789    987
    $number = strval($number); 
    $i = 0; 
    $j = strlen($number) - 1; 
    while($i < $j) { 
        if($number[$i] !== $number[$j]) { 
            return false; 
        } 
        $i++; 
        $j--; 
    } 
    return true; 
} 


if(is_numeric($_REQUEST['number'])){      //is_numeric判断是否为数字
    
   $info="sorry, you cann't input a number!";

}elseif($req['number']!=strval(intval($req['number']))){
      
     $info = "number must be equal to it's integer!! ";  

}else{

     $value1 = intval($req["number"]);    //intval   取整数值
     $value2 = intval(strrev($req["number"]));  //strrev反转字符串       intval  取整数      

     if($value1!=$value2){
          $info="no, this is not a palindrome number!";
     }else{
          //判断回文数
          if(is_palindrome_number($req["number"])){
              $info = "nice! {$value1} is a palindrome number!"; 
          }else{       //$value1= $value2时   $info=$flag   PS:输出FLAG条件
             $info=$flag;
          }
     }

}

echo $info;


//1.不为空,且不能是一个数值型数字,包括小数。(由is_numeric函数判断)
//2.不能是一个回文数。(is_palindrome_number判断)
//3.该数的反转的整数值应该和它本身的整数值相等。即:
//4.post个number.

分析完毕构造payload
很多方法,满足上述4条件即可

number=0e00%00
0.000000%00

在这里插入图片描述

### 关于CTF竞赛中的PHP代码审计 #### 常见漏洞分析 在处理用户输入时,如果未对数据进行适当验证或过滤,则可能导致安全风险。例如,在PHP环境中,当接收并反序列化来自用户的可控输入时,可能会触发对象注入攻击[^1]。 对于给定的例子`a:1:{s:6:"spoock";s:44:"|O:5:"lemon":1:{s:2:"hi";s:10:"phpinfo();";}}`,此字符串代表了一个经过序列化的数组结构,其中包含了可被实例化的类对象。一旦该串被传递至`unserialize()`函数处解析,便会创建相应的对象,并可能调用其内部方法——这里即为执行了`phpinfo()`命令。这表明程序存在潜在的对象注入缺陷,允许攻击者通过精心构造的数据来操控服务器端行为。 另一个值得注意的是MD5比较操作中存在的隐患。由于哈希碰撞的存在以及算法本身的单向特性,简单依赖MD5校验并不能确保两个变量完全相同。因此,在某些场景下(比如身份认证),仅依靠此类方式判断容易遭受伪造请求的威胁。 至于`strpos()`函数的应用不当也可能引发问题。假设开发者意图检测特定子串是否存在某字符串内却忽略了边界条件检查的话,那么就有可能让恶意参与者利用这一点绕过逻辑控制流实现非法访问资源的目的。此外,XXE(XML External Entity Injection)也是常见的Web应用层面上的安全挑战之一。它涉及到应用程序如何处理含有实体引用的XML文档。特别是当这些实体指向远程位置或是能够读取本地文件系统上的敏感信息时,便构成了严重的隐私泄露途径[^2]。 最后提到的一个例子展示了长度与数值范围之间的矛盾对比语句:`else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)`。这段代码试图同时限制密码字符数不超过7位且大于七位整数的最大值,显然是自相矛盾的设计错误[^3]。 ```php // 不推荐的做法 if ($_GET['input']){ $obj = unserialize($_GET['input']); // 存在安全隐患 } ``` 为了防止上述提及的各种类型的漏洞发生,建议采取如下措施: - 对所有外部提交的内容实施严格的白名单机制; - 避免直接使用未经消毒过的参数参与关键业务流程; - 使用更先进的加密技术代替老旧散列方案来进行完整性验证; - 定期审查第三方库版本更新情况以修补已知弱点; - 考虑启用OPcache等字节码缓存组件减少动态解释带来的性能损耗同时也降低了因频繁编译而暴露出来的风险面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值