跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

怎么防范DNS rebinding攻击对本地phpMyAdmin的威胁

本地phpMyAdmin受DNS rebinding攻击影响,因其默认不校验HTTP Host头,攻击者可通过恶意域名解析(如attacker.com→127.0.0.1)绕过同源策略,伪装成本地服务访问数据库管理界面;需在config.inc.php中强制指定$cfg['Servers'][$i]['host']='127.0.0.1'并设$cfg['AllowArbitraryServer']=false,同时在Nginx/Apache层校验Host头仅允许localhost或127.0.0.1,二者缺一不可。 为什么本地 php MyAdmin 会受 DNS rebinding 攻击影响 因为 phpmyadmin 默认不校验 http host 头,攻击者可通过恶意域名解析(比如把
attacker.com
解析到
127.0.0.1
)诱使浏览器发起请求,绕过同源策略,让远端服务器“假装”是本地服务,从而读取或操作你的数据库管理界面。 这不是 phpMyAdmin 的 bug,而是它被设计为 Web 应用——只要能访问到它的 HTTP 接口,就默认信任 Host 头。本地开发时习惯用
http://localhost/phpmyadmin
或
http://127.0.0.1/phpmyadmin
,但一旦你开了端口、关了防火墙、或用了代理,攻击面就暴露了。 必须设置
$cfg['Servers'][$i]['host']
并禁用 Host 头动态解析 phpMyAdmin 从 4.9.0 起支持 Host 白名单机制,但默认不启用。关键动作是显式锁定后端 MySQL 连接目标,并关闭对
$_SERVER['HTTP_HOST']
的依赖。 编辑
config.inc.php
,找到对应 server 配置段,在
$cfg['Servers'][$i]
中强制指定:
$cfg['Servers'][$i]['host'] = '127.0.0.1';
添加:
$cfg['Servers'][$i]['host'] = '127.0.0.1';
$cfg['Servers'][$i]['port'] = '3306';
$cfg['Servers'][$i]['auth_type'] = 'cookie';
// 禁用基于 Host 头的自动识别
$cfg['AllowArbitraryServer'] = false;
删掉或注释掉任何类似
$cfg['Servers'][$i]['host'] = $_SERVER['HTTP_HOST'];
的动态赋值——这在某些旧教程里常见,极其危险 Web 服务器层加 Host 头校验(Nginx / Apache) phpMyAdmin 自身不拦截非法 Host,得靠前置 Web 服务器兜底。否则攻击者直接发
Host: evil.com
请求仍能抵达 PHP 脚本。 Nginx:在 server 块中加
if ($host !~ ^(localhost|127\.0\.0\.1)$) { return 444; }
,或更稳妥地只允许明确的 server_name:
server_name localhost 127.0.0.1;
Apache:用
RewriteCond %{HTTP_HOST} !^(localhost|127\.0\.0\.1)$ [NC]
+
RewriteRule ^ - [F]
别信
Allow from 127.0.0.1
——这是针对客户端 IP 的,而 DNS rebinding 的请求 IP 就是
127.0.0.1
,完全绕过 开发环境不该暴露到公网或局域网可访问 很多人以为“我在家里的路由器后面就安全”,但现代攻击链常利用内网横向移动,或者通过鱼叉邮件诱导点击恶意链接,触发浏览器向
http://router.local/phpmyadmin
发请求(如果该域名真被解析到本地)。 PHP 8.5.5 PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。 下载 立即学习 “ PHP免费学习笔记(深入) ”; 确认 phpMyAdmin 目录不在 Web 根目录下被意外暴露;路径应为
/var/www/html/phpmyadmin/
这类可控位置,而非
/var/www/html/
下任意可猜路径 禁用 Apache 的
mod_userdir
、Nginx 的
autoindex
,防止目录遍历或误配导致配置文件泄露(如
config.inc.php
) 如果只是本地调试,用 PHP 内置服务器启动(
php -S 127.0.0.1:8000 router.php
)并绑定到
127.0.0.1
,比跑完整 LAMP 更轻量也更隔离 真正麻烦的不是配几行代码,而是 Host 头校验和网络层绑定要同时生效——漏掉任意一环,攻击者都能用一个伪造 DNS 记录打穿整个防护逻辑。

相关文章