首页 游戏 软件 资讯 排行榜 专题
首页
编程语言
php代码审计片段 02 绕过过滤的空白字符

php代码审计片段 02 绕过过滤的空白字符

热心网友
47
转载
2026-05-06

源码点这:bowu678/php_bugs: PHP代码审计分段讲解 (github.com)

php代码审计片段 02 绕过过滤的空白字符

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

要彻底吃透这道题,你得先备好这几样“家伙事儿”:扎实的PHP基础知识、对特定函数行为的深刻理解,以及对URL编码和ASCII码的灵活运用。当然,如果你还能用Python写个简单的脚本(比如会用Requests库发个请求),那效率就更高了。

甜点部分:前置处理逻辑

先来看看代码入口处的“开胃菜”:

ini_set(“display_error”, false);    #关闭错误报告
error_reporting(0); //关闭所有PHP错误报告

foreach([$_GET, $_POST] as $global_var) {
    foreach($global_var as $key => $value) {
        $value = trim($value);//trim — 去除字符串首尾处的空白字符(或者其他字符)
        is_string($value) && $req[$key] = addslashes($value); // is_string — 检测变量是否是字符串,addslashes — 使用反斜线引用字符串
    }
}

这段代码干了件什么事呢?它把通过GET和POST方式传进来的所有参数,都“清洗”了一遍。具体来说,先用trim函数把值首尾的空白字符去掉,然后,如果这个值是个字符串,就用addslashes给它加上反斜线转义,以防SQL注入。处理完的结果,都存进了$req这个数组里。

举个例子,如果请求的URL是xxx.php?a=2,那么$_GET[“a”]是2,经过这一套流程后,$req[“a”]也等于2(只不过数字2不会被addslashes处理)。这个$req数组,就是后面正餐部分要用的“食材”。

正餐部分:核心校验函数

接下来是硬核的主菜。首先登场的是一个自定义函数:is_palindrome_number($number)。顾名思义,它用来判断一个数是不是回文数。它的实现方式很经典:先把数字转成字符串,然后从字符串的两端向中间逐个字符比较。


通读整个代码逻辑,你会发现,要想成功拿到Flag,必须同时满足以下四个条件:

条件①is_numeric($_REQUEST[‘number’]) == 0
这意味着,超全局变量$_REQUEST中的number参数,经过is_numeric函数判断后,结果必须为“假”(即不是数字或数字字符串)。

条件②$req[‘number’] == strval(intval($req[‘number’]))
$req数组里的number值,先被intval转换成整数,再被strval转回字符串,这一通操作之后,得到的结果必须和原始值严格相等。

条件③$value1 == $value2
其中:
$value1 = intval($req[“number”])
$value2 = intval(strrev($req[“number”]))
这个条件要求,$req[“number”]直接转成整数的值,必须等于其字符串反转后再转成整数的值。

条件④is_palindrome_number( $req[“number”] ) == 0
最后,把$req[“number”]丢进回文数判断函数,结果必须返回0,也就是说,函数必须判定它不是回文数。


看到这里,矛盾点就出来了:你需要构造一个number,它既要能通过函数判断“不是回文数”(条件④),又要满足其本身和反转后的整数值相等(条件③),这听起来几乎像个“不可能任务”。

直接传number=11这样的回文数肯定不行,第一个条件就过不去,is_numeric(“11”)会返回true

突破口在于变量来源的差异。仔细看,只有条件①的number是从$_REQUEST里取的,而条件②、③、④的number都来自那个被处理过的$req数组。这就是关键所在!

我们可以利用空字符%00来制造差异。传入number=%0011,对于条件①:$_REQUEST[“number”]接收到的字符串是“%0011”,is_numeric(“%0011”)结果为false,条件满足。而$req数组在处理时,trim函数会去掉首尾的空白字符,但%00(空字符)并不在trim的默认去除列表里吗?这里需要注意,trim默认去除的是空白字符(如空格、制表符等),空字符\0通常不被认为是“空白字符”,但有些环境或配置下可能被处理。更常见的绕过思路是,$_REQUEST在接收参数时会自动对URL解码,%00被解码为空字符,而空字符在字符串比较中有时会被忽略或产生截断效果,导致is_numeric看到的是“11”,从而判断为真?不,这里需要精确测试。实际上,is_numeric(“%0011”)在PHP中会对字符串进行判断,开头的%00(空字符)会导致其判断为非数字字符串,从而满足条件①。同时,这个空字符在后续$req的处理中可能被保留或产生其他影响。

但仅用%00还不够,因为11依然是回文数,无法满足条件④。

所以,我们需要在%0011之间,再插入一个“神奇”的字符。这个字符需要能“欺骗”intvalstrrevstrval这些函数(用于条件②③),让它们忽略它,但同时又能让自定义的回文判断函数is_palindrome_number(条件④)认为字符串不对称。

经过测试,有两个字符可以胜任这个角色:%0c(换页符)或者%2B(加号+)。

因此,最终的有效载荷可以是:number=%00%0c11 或者 number=%00%2B11

%2B(加号)这个选择可以从逻辑上推导出来。因为intval()函数对加号的处理很特别:intval(“+123”)结果是123intval(“123+”)结果也是123intval(“1+23”)则得到1。也就是说,intval在转换时,遇到非数字字符(包括加号在非开头位置)就会停止。把加号放在数字前面,就能让intval(“+11”)intval(strrev(“+11”))(即intval(“11+”))都得到11,从而满足条件③。同时,字符串“+11”不是回文(“+11”反转是“11+”),满足了条件④。

模糊测试(Fuzzing)思路

除了逻辑推导,我们还可以用“暴力美学”——模糊测试来寻找所有可能的解。我们的目标是找出所有能放在%0011之间,并满足所有条件的ASCII字符。

基本ASCII码有128个,扩展ASCII码还有128个,总共256个字符,对应十六进制从%00%FF

下面这段Python脚本展示了如何自动化这个过程。理解这段代码的关键在于Python的“字符串切片”和“格式化输出”:

import requests

for i in range(256):
    i = str(hex(i))
    if len(i) == 3: # 例如0x1,需要去掉‘x’
        i = i[0:1:] + i[2::]
    else: # 例如0x10,需要去掉‘0x’
        i = i[2::]
    i = “%” + i
    # print(i)
    number = f“%00{i}11”
    re = requests.get(f“https://127.0.0.1/php_bugs/02%20%E7%BB%95%E8%BF%87%E8%BF%87%E6%BB%A4%E7%9A%84%E7%A9%BA%E7%99%BD%E5%AD%97%E7%AC%A6.php?number={number}”)
    # print(re.text)
    if “x” in re.text: # 假设成功时页面包含‘x’(或Flag标识)
        print(i)

这个脚本会遍历所有可能的单字节字符,构造形如%00{XX}11的payload进行测试,并根据返回页面内容判断是否成功,从而找出所有可用的特殊字符。

来源:https://blog.csdn.net/saigyoji_yuyuko/article/details/131537056
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

如何在 PHP 中高效获取多页 TIFF 图像的总页数(无需加载整个文件)
编程语言
如何在 PHP 中高效获取多页 TIFF 图像的总页数(无需加载整个文件)

本文详解如何利用 php-vips 替代传统的 imagemagick 方案,在毫秒级别快速获取超大 JPEG 压缩 TIFF 文件(例如 1 5GB 2600 页)的总页数,彻底规避 imagick 因加载全部数据而引发的严重性能延迟问题。 在 PHP 开发中,处理大型多页 TIFF 文件(尤其是

热心网友
05.05
PHP函数如何识别硬件RAID控制器_PHP区分软硬RAID配置【教程】
编程语言
PHP函数如何识别硬件RAID控制器_PHP区分软硬RAID配置【教程】

PHP函数如何识别硬件RAID控制器_PHP区分软硬RAID配置【教程】 PHP 无法直接识别硬件 RAID 控制器 这里有个核心概念需要先厘清:PHP作为运行在用户态的脚本语言,本身并没有内核级别的权限。这意味着,它既无法直接访问SCSI或SAS控制器的底层寄存器,也读不了PCI设备的ID信息,更

热心网友
05.05
phpopenssl扩展怎么配置_https与加密功能【教程】
编程语言
phpopenssl扩展怎么配置_https与加密功能【教程】

PHP的openssl扩展怎么配置_https与加密功能【教程】 PHP的openssl扩展需同时满足扩展已加载、密钥可用、证书链可信三条件;否则HTTPS请求、加密函数等均会失败,须逐项验证配置、CA路径、IV 密钥长度及PEM格式。 将PHP的openssl扩展视为一个“配置即用”的普通模块,往

热心网友
05.05
PHP如何检测客户端是否支持Cookie_PHP检测客户端是否支持Cookie方法【兼容】
编程语言
PHP如何检测客户端是否支持Cookie_PHP检测客户端是否支持Cookie方法【兼容】

PHP如何检测客户端是否支持Cookie:几种兼容性良好的实战方法 在Web开发中,依赖Cookie的功能(比如用户登录状态保持)能否正常运行,有时得打个问号。毕竟,用户可能手动禁用了它,或者某些特殊环境本身就有限制。那么,如何在服务端稳稳当当地判断客户端是否真的支持Cookie呢?今天就来聊聊几种

热心网友
05.05
如何通过命令行执行 PHAR 归档中的 PHP 文件
编程语言
如何通过命令行执行 PHAR 归档中的 PHP 文件

如何通过命令行执行 PHAR 归档中的 PHP 文件 本文详细解析在 RHEL 7 系统中,如何正确配置 PHAR 归档以同时支持 Web 访问与命令行独立执行(例如用于定时任务),重点解决执行 `php phar phar path to script php` 时出现“Could not ope

热心网友
05.05

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

史上最长寿标准版!iP17生产周期延长:苹果刀法变了
科技数码
史上最长寿标准版!iP17生产周期延长:苹果刀法变了

iPhone 17:为何成为苹果史上最长寿的爆款? 最近科技圈有个消息传得挺热:iPhone 17标准版的生产周期被大幅拉长了。这可不是简单的产能调整,背后是苹果近期完成的大规模产能扩展。看来,这款热门机型已经瞄准了今年下半年的双11战场,准备再掀一波销售热潮。 消息一出,不少网友都在猜测原因。矛头

热心网友
05.06
小米有品新款mini智能电动平衡车深度体验:便携智能,解锁城市出行新方式
科技数码
小米有品新款mini智能电动平衡车深度体验:便携智能,解锁城市出行新方式

在快节奏的都市生活中,一款兼具便携性与环保特性的出行工具正成为越来越多人的选择 城市通勤的“最后一公里”难题,催生了对灵活出行方案的持续探索。近期,小米有品推出的mini智能电动平衡车,以其独特的设计理念和深度智能化功能,迅速吸引了市场的目光。它不仅仅是一款酷玩装备,更切实地为青少年和上班族提供了高

热心网友
05.06
护眼与智能兼备:科大讯飞AI学习机深度评测,为孩子选对学习好帮手
科技数码
护眼与智能兼备:科大讯飞AI学习机深度评测,为孩子选对学习好帮手

在数字化教育蓬勃发展的当下,家长们为孩子挑选学习设备时,既希望设备具备护眼功能,又期望能满足多样化的学习需求。传统平板电脑功能虽丰富,但长时间使用易引发视力疲劳;普通学习机功能又相对单一,难以契合现代教育的发展趋势。在此背景下,科大讯飞AI学习机系列凭借先进的护眼技术与智能学习系统,成为众多家长和学

热心网友
05.06
以太坊(ETH)财库黑马ETHZilla解析:蒂尔和EF深度加持 mNAV高达6
web3.0
以太坊(ETH)财库黑马ETHZilla解析:蒂尔和EF深度加持 mNAV高达6

目录 ethzilla是谁? ETHZilla独特其他ETH DAT之处 1、Peter Thiel持股ETHZilla近30% 2、Vitalik和以太坊基金会入局 3、聚焦DeFi和链上策略 结语 以太坊财库概念的热度,最近真是肉眼可见。伴随着这股热潮,ETH价格也强势突破了4700美元,距离历

热心网友
05.06
国内彩电一年仅卖2763万台 创10年新低
科技数码
国内彩电一年仅卖2763万台 创10年新低

全球彩电市场:存量博弈下的冰与火之歌 最近,行业调研机构奥维睿沃(A VC Revo)发布了一份引人关注的报告,揭示了2025年全球彩电市场的真实图景。数据显示,全球彩电整体出货量达到2 64亿台,同比仅微跌0 1%,市场基本盘看似稳固。 然而,拆开来看,内部结构正在发生深刻变化。LCD液晶电视依然

热心网友
05.06