区分日志中109618和109619的攻击痕迹,核心在于检查请求的http方法、参数结构以及响应状态码。通常这两个id对应不同的漏洞利用阶段或类型,例如一个是探测(如get请求),另一个是执行(如post请求)。通过解析日志中的url路径、查询参数和payload内容,可以明确判断攻击者是在进行信息收集还是实际注入操作。

如何根据HTTP方法区分探测与执行
在Web应用防火墙或服务器访问日志中,109618往往代表针对特定参数的探测行为,而109619则可能代表随后的利用尝试。要区分它们,最直接的方法是查看HTTP动词。如果日志显示为GET请求且参数中包含明显的测试字符(如单引号、注释符),这通常是109618类型的扫描行为。若后续出现POST请求且包含复杂的SQL语句或命令注入字符串,则极有可能是109619类型的利用。此外,注意观察时间戳,探测行为通常发生在利用行为之前几秒到几分钟内。

import re
from datetime import datetime
def analyze_log_entry(line):
# 模拟解析一行Apache/Nginx日志
pattern = r'(?P<ip>\S+) \S+ \S+ \[(?P<time>[^\]]+)\] "(?P<method>\w+) (?P<url>\S+) HTTP/\S+" (?P<status>\d+) (?P<size>\d+)'
match = re.match(pattern, line)
if not match:
return None
data = match.groupdict()
url = data['url']
method = data['method']
status = int(data['status'])
# 假设109618对应GET探测,109619对应POST利用
# 这里需要根据实际WAF规则或IDS签名进行调整
attack_type = None
if 'id=' in url and method == 'GET':
# 检查是否包含常见探测特征
if any(char in url for char in ["'", '"', '--', ';']):
attack_type = '109618_Probe'
elif method == 'POST':
# POST请求通常携带更复杂的payload
# 在实际场景中需要解析body,这里简化处理
attack_type = '109619_Exploit'
return {
'ip': data['ip'],
'time': data['time'],
'method': method,
'url': url,
'status': status,
'attack_id': attack_type
}
# 示例日志行
log_line = '192.168.1.100 - - [10/Oct/2023:13:55:36 +0000] "GET /search?id=1\' AND 1=1-- HTTP/1.1" 200 1234'
analysis = analyze_log_entry(log_line)
print(analysis)</size></status></url></method></time></ip>
如何通过Payload内容确认攻击意图
除了HTTP方法,Payload的具体内容是区分109618和109619的关键。109618通常涉及简单的语法错误触发,旨在确认漏洞存在,其Payload较短且特征明显,如常见的SQL注入布尔盲注测试。而109619则可能涉及数据提取或系统命令执行,Payload更长且逻辑更复杂。通过分析URL编码后的参数值,可以发现攻击者是否在尝试绕过过滤机制。例如,如果看到经过多次编码的恶意代码,或者使用了特定的函数调用(如`load_file`、`exec`),这通常指向更高危的利用阶段。

def parse_payload(url):
from urllib.parse import unquote, parse_qs
# 提取查询参数
parsed_url = unquote(url)
query_string = parsed_url.split('?')[1] if '?' in parsed_url else ''
params = parse_qs(query_string)
payload_details = []
for key, value in params.items():
val = value[0]
# 检测常见注入模式
if re.search(r"(union|select|insert|update|delete|drop).*(from|into|table)", val, re.I):
payload_details.append('SQL_Structural')
if re.search(r"(or|and).*(1=1|true)", val, re.I):
payload_details.append('Boolean_Blind')
if re.search(r"(;|\||&&).*cat|ls|whoami", val, re.I):
payload_details.append('OS_Command')
return payload_details
# 测试不同Payload
url_probe = '/search?id=1%27%20OR%201=1--'
url_exploit = '/api/data?q=admin%27;%20DROP%20TABLE%20users;--'
print("Probe Analysis:", parse_payload(url_probe))
print("Exploit Analysis:", parse_payload(url_exploit))
基于响应状态码和返回长度的进一步验证
在确定了攻击类型后,还需要结合服务器的响应来最终确认攻击是否成功。对于109618类型的探测,服务器通常会返回200 OK,但返回内容可能与正常请求有细微差别,或者在某些配置下返回500 Internal Server Error。而对于109619类型的利用,如果成功,可能会返回包含敏感数据的页面,或者导致服务无响应。通过比较正常请求和攻击请求的响应长度(Content-Length)和时间差,可以更准确地识别异常。如果某个请求的响应时间显著长于其他请求,可能意味着正在进行耗时较长的盲注或资源耗尽攻击。











