半小时速通的医院脱库应急响应

Posted by Closure on May 7, 2025

记时35min的一个简单应急响应,复健。医院系统疑似被攻击,攻击者常规手段获取到了后台账号密码,在此之前攻击者使用多个IP进行扫描,作为安全服务工程师需要分析其流量包和日志来快速审计,每个IP的扫描特征并快速归类,并思考在常规渗透中,攻击者是怎么获取到的管理员密码进行登录的后台。

xfreerdp连上远程桌面,桌面如图,拿wireshark看看,题目都说是常规了那可能是nmap的SYN,然后看看最开始的SYNip。

拿统计看扫描最多的。

看一下哪个IP用的AWVS,过滤特征。

看一下哪个IP进行了web登录爆破,看login.php。

数据库被批量注册了,看流量包发现都是在4.30,本地看数据库也能看到email都是qq邮箱注册的垃圾用户,命令规则一致。

查看登陆前的最后一条包来得到登陆成功的账号密码IP,如图。

看登陆后的操作都集中在/admin/settings.php。查看返回包是sql注入,脱的数据是医院患者信息。

修复

先改下弱密码,再把后台管理路径限制成白名单。

看下漏洞点的setting.php,搜sql关键词定位到:

$sql = "SELECT id, username, email, role, created_at FROM users WHERE username LIKE '%" . $username . "%'";

语句没有预处理而是直接拼接用户输入,给他改成prepared statement处理

$stmt = $conn->prepare("SELECT id, username, email, role, created_at FROM users WHERE username LIKE ?");
$searchTerm = "%" . $username . "%";
$stmt->bind_param("s", $searchTerm);
$stmt->execute();
$result = $stmt->get_result();

而且还发现了所有操作表单都缺少CSRFToken,加上。

$_SESSION['csrf_token'] = bin2hex(random_bytes(32));

<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">

if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
    die('非法请求!');
}