目录
4.1.1.4 remote_agent_strip_domain
4.3 绕过prepare_validate_result函数
1 环境搭建
1.1 linux:
1.1.1 在ubuntu上拉取环境(docker)
root@yang:~/vulhub/cacti/CVE-2022-46169# wget https://github.com/Cacti/cacti/archive/refs/tags/release/1.2.22.zip^C
1.1.2 docker环境部署
使用此命令构建docker环境镜像
root@yang:~/vulhub/cacti/CVE-2022-46169# docker compose up -d
WARN[0000] /root/vulhub/cacti/CVE-2022-46169/docker-compose.yml: the attribute `version` is obsol ete, it will be ignored, please remove it to avoid potential confusion
[+] Running 2/2
✔ Container cve-2022-46169-db-1 Started 0.5s
✔ Container cve-2022-46169-web-1 Started
1.1.3 查看镜像端口:
root@yang:~/vulhub/cacti/CVE-2022-46169# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 9592f5595f2b 4 weeks ago 192MB
mysql 5.7 5107333e08a8 19 months ago 501MB
vulhub/cacti 1.2.22 c0a06715ff54 2 years ago 642MB
root@yang:~/vulhub/cacti/CVE-2022-46169# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9b7a360a3476 vulhub/cacti:1.2.22 "bash /entrypoint.sh…" 2 weeks ago Up 2 minutes 0.0.0.0:8080->80/tcp, [::]:8080->80/tcp cve-2022-46169-web-1
35343a3e052e mysql:5.7 "docker-entrypoint.s…" 2 weeks ago Up 2 minutes 3306/tcp, 33060/tcp cve-2022-46169-db-1
1.1.4 访问
1.1.5 查看数据库配置:

1.2 windows搭建:
下载安装包后直接部署在小皮的WWW的目录下面,发现报错
1.2.1 config.php.dist
这是一个备份文件,可以修改为php文件,作为mysql
修改配置文件

无法成功!稍后再试,尝试了很多方法都不行
2 环境设置
2.1 登录仙人掌
账号:admin
密码:admin
进入后就直接一直next

2.2 设置

3 vscode进入容器的方法
因为自己最开始不知道,所以写了

然后在这里面可以选择想进入的容器:

4 RCE绕过与分析
4.1 绕过鉴权函数

4.1.1 函数分析
function remote_client_authorized() {
global $poller_db_cnn_id;
/* don't allow to run from the command line */
$client_addr = get_client_addr();
if ($client_addr === false) {
return false;
}
if (!filter_var($client_addr, FILTER_VALIDATE_IP)) {
cacti_log('ERROR: Invalid remote agent client IP Address. Exiting');
return false;
}
$client_name = gethostbyaddr($client_addr);
if ($client_name == $client_addr) {
cacti_log('NOTE: Unable to resolve hostname from address ' . $client_addr, false, 'WEBUI', POLLER_VERBOSITY_MEDIUM);
} else {
$client_name = remote_agent_strip_domain($client_name);
}
$pollers = db_fetch_assoc('SELECT * FROM poller', true, $poller_db_cnn_id);
if (cacti_sizeof($pollers)) {
foreach($pollers as $poller) {
if (remote_agent_strip_domain($poller['hostname']) == $client_name) {
return true;
} elseif ($poller['hostname'] == $client_addr) {
return true;
}
}
}
cacti_log("Unauthorized remote agent access attempt from $client_name ($client_addr)");
return false;
}
4.1.1.1 get_client_addr
走到这个函数里面来,再接着走到了get_client_addr 这一看就知道应该是获取客户端的地址的函数,那我们来分析一下他的函数源码
function get_client_addr($client_addr = false) {
$http_addr_headers = array(
'X-Forwarded-For',
'X-Client-IP',
'X-Real-IP',
'X-ProxyUser-Ip',
'CF-Connecting-IP',
'True-Client-IP',
'HTTP_X_FORWARDED',
'HTTP_X_FORWARDED_FOR',
'HTTP_X_CLUSTER_CLIENT_IP',
'HTTP_FORWARDED_FOR',
'HTTP_FORWARDED',
'HTTP_CLIENT_IP',
'REMOTE_ADDR',
);
//循环获取他的http的请求头
$client_addr = false;
foreach ($http_addr_headers as $header) {
if (!empty($_SERVER[$header])) {
$header_ips = explode(',', $_SERVER[$header]);
foreach ($header_ips as $header_ip) {
if (!empty($header_ip)) {
if (!filter_var($header_ip, FILTER_VALIDATE_IP)) {
cacti_log('ERROR: Invalid remote client IP Address found in header (' . $header . ').', false, 'AUTH', POLLER_VERBOSITY_DEBUG);
} else {
$client_addr = $header_ip;
cacti_log('DEBUG: Using remote client IP Address found in header (' . $header . '): ' . $client_addr . ' (' . $_SERVER[$header] . ')', false, 'AUTH', POLLER_VERBOSITY_DEBUG);
break 2;
}
}
}
}
}
return $client_addr;
}
最开始这个数组就是为了循环获取他的请求头的数据
$_server:就是为了获取到X-Forwarded-For,这样就可以判断能不能获取到这个X-Forwarded-For参数,就可以判断出请求头是否伪空
<?php
echo'<pre>';
var_dump($_SERVER);
可以打印出全局的数组,其中它就有请求头的数据
打印出来的数据如上:和f12里面的http-request-header里面的内容是一样的
所以说我们可以通过获取X-Forwarded-For,可以进行伪造
$header_ips = explode(',', $_SERVER[$header]);
foreach ($header_ips as $header_ip) {
if (!empty($header_ip)) {
if (!filter_var($header_ip, FILTER_VALIDATE_IP))
这里是通过全局数组获取到了header头里面的ip字段的信息,获取到后,判断是否为空,如果不是空,就用filter_var来进行过滤
FILTER_VALIDATE_IP:这是一个过滤器,用来验证IP是否合法
4.1.1.2 break 2:
跳出两层循环
break 2是 PHP 中的控制语句,用于终止多层嵌套循环的执行。在这段代码中,它的作用是:
- 内层循环:遍历由逗号分隔的 IP 列表(例如,当




最低0.47元/天 解锁文章
772

被折叠的 条评论
为什么被折叠?



