2026.7.31(3)【日志分析】2026CCF-被入侵的数据库

📌 题目信息

项目内容
题目名称2026CCF-被入侵的数据库
题目来源玄机靶场
题目类型日志分析 / Web 攻击溯源
子分类SQL 注入、access.log 分析
考点Web 中间件日志分析、SQL 注入流量识别、数据库名提取
难度
最终 Flagflag{login_db}

🛠️ 使用工具

  • 文本编辑器 / 日志查看
  • Python 3

📝 解题思路

题目给了一份 Web 中间件日志 access.log(3677 行,Nginx/Apache 格式)。日志里有大量扫描噪音(404 探测),真正的攻击者是执行 SQL 注入 的源 IP。核心思路:从注入流量中找出攻击者 → 定位其提取数据库数据的语句 → 数据库名就写在 FROM 库名.表名 里。

第 1 步:识别 SQL 注入流量,锁定攻击者

先使用python脚本判断哪一个IP是访问量最多的。

import re
from collections import Counter
data = open('access.log', encoding='utf-8').readlines()
ip_counter = Counter()
for line in data:
    line = line.strip()  # 去掉首尾空白
    if not line:  # 跳过空行
        continue
    ip = line.split()[0]
    ip_counter[ip] += 1
print("=== 各 IP 访问量 Top10 ===")
for ip, c in ip_counter.most_common(10):
    print(f"{ip}: {c}")


发现123.13.22.45、192.168.1.100这两个IP访问量最多,因此怀疑这两个IP的其中一个为攻击者。

先查看123.13.22.45的相关日志,发现这个IP在探测敏感路径,但考虑到这个IP的访问量有3167次,不可能是手工探测,因此推测为使用扫描器探测。

然后看192.168.1.100的相关日志,发现 192.168.1.100 在 /test/login.php 上发起大量 SQL 注入,因此判断攻击者为192.168.1.100(因为访问量只有189次,人类能做到,且题目名称有提到数据库,因此判定为攻击者)。

总结:123.13.22.45(扫描器)和 192.168.1.100(注入攻击者)是主要流量;其中 192.168.1.100 的请求全部是对 /test/login.php 的注入,是真正的攻击者。

⚠️ 注意123.13.22.45 访问量虽大(3167 次),但它是在探测 /druid/sql.html/dump/heapdump 等敏感路径(返回 404),属于信息收集/扫描,并没有成功注入拿到数据;而 192.168.1.100 是对 login.php 的实际 SQL 注入

第 2 步:定位注入成功、提取数据的请求

通过查看日志,发现注入手法多样(UNION 联合注入、布尔盲注、时间盲注、EXTRACTVALUE 报错注入),最终攻击者成功读到了数据。

使用python脚本,筛选攻击者 192.168.1.100 的请求,URL 解码后需要匹配 FROM 库名.表名 结构,输出成功查询数据表的注入语句,从而定位数据库名。

import re
from urllib.parse import unquote
data = open('access.log', encoding='utf-8').readlines()
# 只筛攻击者 IP 192.168.1.100
# 匹配 "FROM 库名.表名"(不区分大小写),并对整行做 URL 解码
pat = re.compile(r'FROM\s+\w+\.\w+', re.IGNORECASE)
seen = set()  # 用于去重
print("\n"+"注入语句中带\"FROM 库.表\"这个特征日志行如下:"+"\n")
for line in data:
    line = line.strip()
    if not line:
        continue
    ip = line.split()[0]
    if ip != '192.168.1.100':
        continue
    decoded = unquote(line)  # URL 解码整行,还原 SQL 语句
    if pat.search(decoded):
        if decoded in seen:  # 去掉重复的注入请求
            continue
        seen.add(decoded)
        print(decoded)

第 3 步:提取数据库名

注入语句中,数据表以 库名.表名 形式被引用

  • FROM login_db.secret → 表 secret
  • FROM login_db.users → 表 users
    两者都隶属于同一个库:login_db

⚠️ 注意:题目要的是数据库名,不是表名!login_db 是库名,secret 和 users 是库里的表。

攻击过程还原

  1. 攻击者 192.168.1.100 对 /test/login.php 的用户名字段发起 SQL 注入
  2. 通过 UNION / 报错 / 盲注确认存在注入点
  3. 枚举 information_schema 找到数据库结构
  4. 从 login_db 库的 secretusers 表提取敏感数据,造成泄露

🏁 最终 Flag

flag{login_db}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值