漏洞介绍
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 | if (!preg_match('~^HTTP/[0-9.]+ 2~i', $http_response_header[0])) { |
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/ 进入靶场页面

Adminer登录页面,选择ElasticSearch作为系统目标,并在server字段填写example.com,点击登录即可看到example.com返回的400错误页面展示在页面中
在本机启动一个python服务器,该服务监听传入的连接



可以看到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博客