
استغلال لـ CVE-2022-46169
استغلال ثغرة CVE-2022-46169 في إصدارات Cacti قبل 1.2.3
هنا تتحقق الدالة remote_client_authorized من اسم مضيف العميل في جدول poller عند الإدخال
function remote_client_authorized() {
// ...
$client_addr = get_client_addr();
// ...
$client_name = gethostbyaddr($client_addr);
// ...
$pollers = db_fetch_assoc('SELECT * FROM poller', true, $poller_db_cnn_id);
foreach($pollers as $poller) {
if (remote_agent_strip_domain($poller['hostname']) == $client_name) {
return true;
// ...
تُستخدم الدالة get_client_addr للحصول على عنوان العميل، والذي يمكن للمهاجم تعديله عند تحديد عنوان IP. تستخدم IP لحله إلى اسم المضيف المقابل وتتحقق مما إذا كان جدول poller يحتوي على إدخال بهذا الاسم المضيف لتأكيد العميل.
<?php
// ...
function get_client_addr($client_addr = false) {
$http_addr_headers = array(
// ...
'HTTP_X_FORWARDED',
'HTTP_X_FORWARDED_FOR',
'HTTP_X_CLUSTER_CLIENT_IP',
'HTTP_FORWARDED_FOR',
'HTTP_FORWARDED',
'HTTP_CLIENT_IP',
'REMOTE_ADDR',
);
$client_addr = false;
foreach ($http_addr_headers as $header) {
// ...
$header_ips = explode(',', $_SERVER[$header]);
foreach ($header_ips as $header_ip) {
// ...
$client_addr = $header_ip;
break 2;
}
}
return $client_addr;
}
لذا فإن تعديل رأس الطلب يسمح لنا بتجاوز المصادقة
وهنا يتم استخدام إدخال المستخدم غير المنقى لتنفيذ أمر خارجي
// ... retrieve poller items from database ...
foreach($items as $item) {
switch ($item['action']) {
// ...
case POLLER_ACTION_SCRIPT_PHP: /* script (php script server) */
// ...
$cactiphp = proc_open(read_config_option('path_php_binary') . ' -q ' . $config['base_path'] . '/script_server.php realtime ' . $poller_id, $cactides, $pipes);
قم بتكوين رؤوس HTTP التي يجب استخدامها عند تحديد عنوان IP للعميل
نظرًا لأن قيمة poller_id يجب أن تكون عددًا صحيحًا، يجب التحقق من صحتها قبل تمريرها إلى proc_open