展开菜单
首页 精品内容 本月促销 装机必备 Windows macOS软件 IOS软件 Android AI PDF教程 专题
全部分类

当前位置:

首页 > 编程开发 > php代码审计片段 02 绕过过滤的空白字符

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

源码点这:bowu678/php_bugs: PHP代码审计分段讲解 (github.com) 要彻底吃透这道题,你得先备好这几样“家伙事儿”:扎实的PHP基础知识、对特定函数行为的深刻理解,以及对URL编码和ASCII码的灵活运用。当然,如果你还能用Python写个简单的脚本(比如会用Reques

源码点这: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“http://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进行测试,并根据返回页面内容判断是否成功,从而找出所有可用的特殊字符。

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发 PHP
相关文章 更多
精品专题 更多
本月促销

正软商城本月促销专区,汇集办公、设计、安全、影音、系统工具及AI软件等正版软件优惠活动,提供限时折扣、特价授权和优惠购买信息,活动库存及价格以页面实时展示为准。

装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

IOS软件

正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

AI

正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
灵活计算器
灵活计算器

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

图几
图几

图几是一款适用于 macOS 的截图、标注与美化工具,支持离线操作保障隐私。界面整理和高频系统操作被放到一起考虑,桌面或窗口内容一多时,管理起来会更省心。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Menuist
Menuist

Menuist 是一款面向 macOS 的 Finder 右键菜单增强工具,主要用来补充新建文件、快捷导航等常用操作,让日常文件管理和访问路径时更高效、更顺手。

Mole
Mole

Mole 是一款专为 Mac 设计的深度清理优化工具,涵盖缓存清理、应用管理及实时状态监控等功能。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

WINDOWS 更多
Windows 10
Windows 10

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

傲梅轻松备份
傲梅轻松备份

傲梅轻松备份是一款专业易用的数据备份软件,为重要数据提供安全保障。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

Wise Folder Hider Pro
Wise Folder Hider Pro

Wise Folder Hider Pro 是一款专业级文件和文件夹隐藏加密软件,为私密数据添加多重保护。高频操作更强调就近处理,浏览、整理和跨目录移动文件时,来回切换和重复点击都会少很多。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

PinStack
PinStack

PinStack是一款轻量级的Windows平台剪贴板管理工具,优化您的剪贴板使用体验。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Seer
Seer

Seer是一款在Win平台下的空格键功能增强效率工具,只需轻敲空格键,就能预览几乎任何格式的文件。它更适合把零散的小功能集中起来使用,处理高频琐碎任务时会更省事。