假设下面的API端点控制器
enum class AccessMethod {
SSO,
BASIC;
}
internal open class SomeController {
[...]
@PostMapping("{accessMethod}")
open fun trigger(@PathVariable("accessMethod", required = true) accessMethod: AccessMethod) {
logger.info {"Is arbitrary code execution possible here in spring? $accessMethod"}
}
}我不太清楚Spring的验证机制。默认情况下,输入是否在enum情况下得到清理,即a.k.a将引发一个错误?
恶意PoC
val malicious_payload = "\"} malicious() logger.info {\"Code Injection Successful"
client.post(endpoint_of_the_function_above + malicious_payload )发布于 2022-08-25 13:11:57
我的第一个想法是,如果输入值不是ENUM值(字符串表示),它会生成一个错误。因此Enum启用了"SSO“和"BASIC”,并将所有其他内容抛回。
Kotlin (像Java)不是一种脚本语言,所以您不能直接使用kotlin或java语言进行注入,因为它必须构建字节码并在JVM上运行。因此,操作不能被操作。
Ofc,您可以操作生成任何查询语言(SQL、NoSQL或发送消息等),通过这些语言只能通过系统。当然,框架主要处理它,但是错误总是会发生的,对吗?(创建Log4Shell是因为Log4J处理启用了外部源,因此这里也不是操纵代码的情况。)示例:不正确地处理创建SQL查询的标识符。
我创建了一个小项目并使用了你的“秃鹫”字符串。只是它使用URL,所以这个字符串被转换成URL编码。
对于任何不是/SSO和/BASIC的URL,它都会说是/BASIC。根据定义,/asdasd也将有一个HTTP400结果。
\"} malicious() logger.info {\"Code Injection Successful到%5C%22%7D%20malicious%28%29%20logger.info%20%7B%5C%22Code%20Injection%20Successful
请求:
POST http://localhost:8080/%5C%22%7D%20malicious%28%29%20logger.info%20%7B%5C%22Code%20Injection%20Successful
响应:
{
"timestamp": "2022-08-25T12:51:23.092+00:00",
"path": "/%5C%22%7D%20malicious%28%29%20logger.info%20%7B%5C%22Code%20Injection%20Successful",
"status": 400,
"error": "Bad Request",
"requestId": "c3bf4acf-1"
}Source (我主要使用的是反应性环境,但现在不相关了)。
package com.example.demo
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RestController
import reactor.core.publisher.Mono
enum class AccessMethod {
SSO,
BASIC;
}
@SpringBootApplication
@RestController
class DemoApplication {
val logger: Logger = LoggerFactory.getLogger(this::class.java)
@PostMapping("{accessMethod}")
fun trigger(@PathVariable("accessMethod", required = true) accessMethod: AccessMethod): Mono<Void> {
logger.info("Is arbitrary code execution possible here in spring? $accessMethod")
return Mono.empty()
}
}
fun main(args: Array<String>) {
runApplication<DemoApplication>(*args)
}https://stackoverflow.com/questions/73487105
复制相似问题