从源码级别了解PHP %00截断原理

本文详细介绍了PHP 5.2.x版本中的一个重大漏洞——%00截断问题。该漏洞允许恶意用户通过URL参数输入%00,导致后续字符被自动忽略。文章通过示例代码展示了漏洞的具体表现,并逐步剖析了漏洞的源码,最后探讨了修复该问题的代码改动。

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

一:漏洞简介

    PHP的00截断是5.2.x版本的一个漏洞,当用户输入的url参数包含%00经过浏览器自动转码后截断后面字符。

二:漏洞示例代码

    例如url输入的文件名1.txt%00.jpg经过url转码后会变为1.txt\000.jpg,测试文件1.php如下
<?php
    include "1.txt\000.jpg";
?>
    测试文件1.txt如下
<?php
    echo 'fireXXX';
?>
    php5.2.x版本解析1.php时,会将1.txt\000.jpg解释为1.txt

三:漏洞源码分析

    php5.2.17代码分析:
    调用php去解析1.php文件。
    主要的执行流程在Zend/zend.c的zend_execute_scripts函数中。该函数首先通过zend_compile_file获取1.php文件的内容,然后调用zend_execute解析读取到的文件内容。
    zend_compile_file函数首先调用open_file_for_scanning去读取文件,然后通过zendparse去进行语法和词法解析,而zendparse是通过lex_scan去扫描出token并进行语法分析。可以通过调试器观察到include的文件名参数经过lex_scan后的数据:
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值