问题:HTTPS 请求关闭 SSL 证书校验,存在中间人攻击风险
此文章为XIUNOX版本重构审计时发现问题,XIUNOX版本已优化修复此问题。分享出来方便后续想基于xiuno bbs4.0.4版本制作维护版本或插件模板等需求的开发者和站长参考。
现象
Xiuno BBS 4.0.4 的 https_post() 函数在发起 HTTPS 请求时(用于插件市场下载、远程附件抓取、SMTP 邮件等场景),将 CURLOPT_SSL_VERIFYPEER 设为 0、CURLOPT_SSL_VERIFYHOST 设为 2(仅校验主机名不校验证书链)。这意味着攻击者只需在客户端与服务端之间插入自签名证书即可解密、篡改全部 HTTPS 流量,包括插件下载内容(落盘后会被 include 执行,直接 RCE)。
源码证据
文件:xiunobbs_4.0.4/xiunophp/misc.func.php 行 1317-1335(https_post 函数中的 curl 选项)
php
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 2);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/x-www-form-urlencoded', 'x-requested-with: XMLHttpRequest'));
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, _SERVER('HTTP_USER_AGENT'));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // 关闭对端证书校验
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // 仅校验主机名,不校验证书链
同一函数后续还会跟随 301/302 跳转(行 1340-1346),攻击者通过 MITM 返回 302 即可让 curl 跳转到攻击者控制的任意地址继续下载,最终落盘内容(如插件 zip、远程图片)被解压并 include。
调用链佐证:
admin/route/plugin.php的插件在线下载调用http_get/https_get→ 落盘解压 →include install.php(已记录于01_critical_ssrf_plugin_download.md)tool/save_remote_image.php抓取远程图片也走同一函数
风险等级与结论
高危
危害后果:
- 中间人攻击者可篡改插件下载包,植入后门代码,落盘后由
include install.php触发 RCE - 远程图片抓取可被替换为恶意内容,配合文件上传缺陷写入 webshell
- SMTP over HTTPS 的认证凭据可被窃取
- 官方源
http://plugin.xiuno.com/本身已是 HTTP(见04_plugin_official_source_dead_market_paralyzed.md),即使 SSL 校验开启也无法保护,双重缺陷叠加
修复建议:
- 将
CURLOPT_SSL_VERIFYPEER设为true(1)、CURLOPT_SSL_VERIFYHOST设为2 - 维护 CA 证书包路径(
CURLOPT_CAINFO指向 cacert.pem) - 官方源切换到 HTTPS 且证书有效
- 对下载的 zip 包做 GPG/签名校验后再解压执行