记时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('非法请求!');
}