漏洞介绍

Adminer是一个开源的单文件PHP数据库管理工具,它提供了一个简单而强大的界面来管理数据库。CVE-2021-21311是一个服务器端请求伪造(SSRF)漏洞,攻击者可以通过构造恶意的数据库连接参数,诱导Adminer向攻击者指定的服务器发送请求,从而访问内部系统或服务。

漏洞范围

Adminer < 4.7.9

漏洞靶场

使用vulhub的靶场

使用环境为Adminer 4.7.8

vulhub-master/adminer/CVE-2021-21311

1
docker-compose up -d

漏洞原理

Adminer在处理某些数据库连接时,未对用户输入的服务器地址进行充分验证,导致攻击者可以通过构造恶意的数据库连接参数,使服务器发送请求到攻击者指定的地址。

攻击者可以利用该漏洞诱导服务器向意外的位置发送请求,从而访问内部系统或服务。在某些情况下,攻击者可以利用该漏洞绕过安全防护措施,直接访问目标服务器。

漏洞出现在Adminer的数据库连接处理部分,以下是与漏洞相关的关键代码片段的简化示例,帮助我们理解漏洞的原理。

1
$server = $_GET['server'] ?? 'localhost';

在上述代码中,Adminer直接从$_GET['server']获取服务器地址,未进行充分的验证和过滤,导致攻击者可以通过构造恶意的server参数,诱导Adminer向攻击者指定的服务器发送请求。

原始漏洞代码 (adminer/drivers/elasticsearch.php 等):

1
2
3
4
if (!preg_match('~^HTTP/[0-9.]+ 2~i', $http_response_header[0])) {
$this->error = $file; // 直接暴露原始响应内容
return false;
}

adminer/drivers/clickhouse.inc.php#L24-L27

if (!preg_match('~^HTTP/[0-9.]+ 2~i', $http_response_header[0])) {
    $this->error = $file;
    return false;
}

adminer/drivers/elastic.inc.php#L30-L33

当HTTP状态码非2xx时,直接将原始响应体($file)赋值给错误信息

前端会显示完整的错误响应内容

漏洞复现

访问 http://127.0.0.1:8080/ 进入靶场页面

image-20250302165152363

Adminer登录页面,选择ElasticSearch作为系统目标,并在server字段填写example.com,点击登录即可看到example.com返回的400错误页面展示在页面中

在本机启动一个python服务器,该服务监听传入的连接

image-20250302165251685

image-20250302165628786

image-20250302165645390

可以看到192.168.159.132对192.168.159.1发送了请求,完成了ssrf

参考

https://blog.csdn.net/shierbai/article/details/139057668

vulhub中Adminer ElasticSearch 和 ClickHouse 错误页面SSRF漏洞复现(CVE-2021-21311)-CSDN博客