首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin/Spring:任意代码执行:此端点易受代码注入的影响吗?

Kotlin/Spring:任意代码执行:此端点易受代码注入的影响吗?
EN

Stack Overflow用户
提问于 2022-08-25 11:59:42
回答 1查看 45关注 0票数 0

假设下面的API端点控制器

代码语言:javascript
复制
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

代码语言:javascript
复制
val malicious_payload = "\"} malicious() logger.info {\"Code Injection Successful"
client.post(endpoint_of_the_function_above + malicious_payload )
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

响应:

代码语言:javascript
复制
{
  "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 (我主要使用的是反应性环境,但现在不相关了)。

代码语言:javascript
复制
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)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73487105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档