Hello-Java-Sec 学习


免责声明

本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关.


  • 项目地址 : https://github.com/j3ers3/Hello-Java-Sec


部署

配置数据库连接 application.properties

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test
spring.datasource.username=root
spring.datasource.password=1234567

编译并运行

git clone https://github.com/j3ers3/Hello-Java-Sec
cd Hello-Java-Sec
mvn clean package -DskipTests
java -jar target/hello-1.0.2.jar

访问测试

  • http://127.0.0.1:8888

输入账号密码 admin/admin

记得在数据库中导入 db.sql


代码分析与漏洞利用的学习

SpEL 表达式注入

描述

SpEL(Spring Expression Language)表达式注入, 是一种功能强大的表达式语言、用于在运行时查询和操作对象图,由于未对参数做过滤可造成任意命令执行。

利用原理

  • SpEL注入

示例代码

@GetMapping("/vul")
public String spelVul(String ex) {
    ExpressionParser parser = new SpelExpressionParser();
    String result = parser.parseExpression(ex).getValue().toString();
    System.out.println(result);
    return result;
}

攻击 payload

# 算数运算
# http://127.0.0.1:8888/SPEL/vul?ex=100*2

# 对象实例化
# http://127.0.0.1:8888/SPEL/vul?ex=new%20java.util.Date().getTime()

# 执行命令
# T(java.lang.Runtime).getRuntime().exec(%22open%20-a%20Calculator%22)

编码建议

web view 层通常通过模板技术或者表达式引擎来实现界面与业务数据分离,比如 jsp 中的 EL 表达式。这些引擎通常可执行敏感操作,如果外部不可信数据未经过滤拼接到表达式中进行解析,则可能造成严重漏洞。

应避免外部输入的内容拼接到 EL 表达式或其他表达式引起、模板引擎进行解析。

白名单过滤外部输入,仅允许字符、数字、下划线等。