基于 owen0o0/WebStack 的 WordPress 导航主题,在原版基础上修复了全部已知高危安全漏洞。
经过两轮安全审计,共发现并修复 13 个安全漏洞(4 个严重/高危文件上传或 RCE 级别、6 个高危、3 个中危):
| 编号 | 严重程度 | 文件 | 漏洞类型 | 状态 |
|---|---|---|---|---|
| VULN-01 | 🔴 严重 | inc/ajax.php |
未授权任意文件上传(可 RCE) | ✅ 已修复 |
| VULN-02 | 🔴 严重 | inc/img-upload.php |
遗留上传脚本可直接访问 | ✅ 已修复(文件已删除) |
| VULN-03 | 🟠 高危 | inc/ajax.php |
未授权任意附件删除 | ✅ 已修复 |
| VULN-04 | 🟠 高危 | go.php |
开放重定向 + HTML 注入 | ✅ 已修复 |
| VULN-05 | 🟡 中危 | search-tool.php |
混淆 eval() JavaScript | ✅ 已修复 |
| 编号 | 严重程度 | 文件 | 漏洞类型 | 状态 |
|---|---|---|---|---|
| NEW-01 | 🟠 高危 | inc/ajax.php |
投稿接口缺少 CSRF nonce 验证 | ✅ 已修复 |
| NEW-02 | 🟠 高危 | inc/contribute-ajax.php |
遗留投稿脚本可直接访问 | ✅ 已修复(文件已删除) |
| NEW-03 | 🟠 高危 | templates/site-card.php |
存储型 XSS(post meta 未转义) | ✅ 已修复 |
| NEW-04 | 🟠 高危 | single-sites.php |
存储型 XSS(post meta 未转义) | ✅ 已修复 |
| NEW-06 | 🟡 中危 | template-contribute.php |
反射型 XSS(REQUEST_URI 未转义) | ✅ 已修复 |
| NEW-07 | 🟡 中危 | inc/frame/functions/helpers.php |
备份导入 unserialize() PHP 对象注入 | ✅ 已修复 |
| NEW-08 | 🟡 中危 | inc/post-type.php |
分类排序保存缺少 nonce 验证(CSRF) | ✅ 已修复 |
详细漏洞说明见 SECURITY-AUDIT.md,修复方案见 SECURITY-FIX-SUMMARY.md。
VULN-01 / VULN-03 — inc/ajax.php 文件上传与附件删除
- 删除
wp_ajax_nopriv_*注册,上传/删除功能仅限已登录用户 - 添加
check_ajax_referer()nonce 验证,防止 CSRF - 扩展名白名单从"定义但不用"改为实际执行
in_array()校验 - 服务端用 PHP
finfo检测文件真实 MIME 类型,不信任客户端 Content-Type - 用
wp_handle_upload()替代裸rename(),经过 WordPress 内置安全过滤 - 附件删除增加所有权校验,用户只能删除自己上传的图片
VULN-02 / NEW-02 — 遗留直接访问脚本
inc/img-upload.php和inc/contribute-ajax.php均已从主题目录彻底删除
VULN-04 — go.php
- 用
filter_var(..., FILTER_VALIDATE_URL)验证解码后的 URL 合法性 - 用
parse_url()限制 scheme 只允许http/https,阻断javascript:等危险协议 - 用 WordPress
esc_url()对输出进行安全转义
VULN-05 — search-tool.php
- 将 JS Packer 混淆代码替换为功能等价的明文可读 JavaScript
NEW-01 — inc/ajax.php 投稿接口
- 添加
check_ajax_referer('contribute_nonce', 'nonce')验证 inc/register.php中通过wp_localize_script()将 nonce 输出到前端template-contribute.php中 AJAX 请求携带 nonce 字段
NEW-03 / NEW-04 — templates/site-card.php 和 single-sites.php 存储型 XSS
- 所有 post meta 输出(
_sites_sescribe、_thumbnail、_wechat_qr、_sites_link)统一加esc_html()、esc_attr()、esc_url()转义 onerror属性中移除javascript:前缀- 分类名称
$name加esc_html()转义
NEW-06 — template-contribute.php
$_SERVER['REQUEST_URI']改为esc_url()输出,防止反射型 XSS
NEW-07 — inc/frame/functions/helpers.php
- 备份导入/导出将
serialize()/unserialize()替换为json_encode()/json_decode(),消除 PHP 对象注入风险
NEW-08 — inc/post-type.php
save_term_order()添加wp_verify_nonce()校验,防止 CSRF- 排序值改用
intval()处理,防止非数字值写入
- 下载本仓库 ZIP 或
git clone - 将主题文件夹上传至 WordPress 的
wp-content/themes/目录 - 在 WordPress 后台「外观 → 主题」中启用 WebStack
- 按原版文档完成导航数据导入和配置
在 Nginx 中禁止 uploads 目录执行 PHP,作为纵深防御:
location ~* /wp-content/uploads/.*\.php$ {
deny all;
return 403;
}Apache .htaccess(放置于 wp-content/uploads/.htaccess):
<FilesMatch "\.php$">
Require all denied
</FilesMatch>- 原版仓库:owen0o0/WebStack
- 原版作者:iowen
- 主题版本:1.1824
遵循原版主题授权协议。安全修复部分以相同协议开源。