使用 servlet api 进行命令注入 bash

问题描述 投票:0回答:1

我正在尝试测试命令注入漏洞

我使用一个执行命令 ls 的 servlet,然后我尝试在 url 中传递另一个命令来暴露命令注入漏洞,但是当我传递新命令时什么也没有发生,这是我的 servlet 代码和我用来传递新命令。 `

@WebServlet("/command")
public class CommandInjectionServlet extends HttpServlet {

    

    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            String comm = "/bin/bash -c ls " + request.getParameter("parameter");
            Process process = Runtime.getRuntime().exec(comm);
            BufferedReader stdInput = new BufferedReader(
                    new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8));

            String s = null;
            while ((s = stdInput.readLine()) != null) {
                response.getWriter().println(s);
            }
        } catch (IOException e) {
            e.printStackTrace(); 
            System.out.println("Error executing command");
        }
    }
    
}

以及我使用的网址

http://localhost:8080/myproject/command?parameter=;ifconfig
`

java api security code-injection commandinjection
1个回答
0
投票

您试图通过在构造的命令字符串中注入分号 (

;
) 来运行两个命令来代替一个命令。
;
对于分隔命令的重要性是 shell 的一个功能,因此如果命令通过 shell 运行,则可能会起作用,类似于 C 的
system()
函数。

但是

Runtime.exec()
不是这样工作的。尽管从其他一些重载中可以更清楚地看出,但这一系列方法是按照
execve()
函数及其各种包装函数进行模式化和工作的。分号对他们来说没有特殊意义。一元
Runtime.exec()
使用
StringTokenizer
将提供的字符串拆分为数组。第一个元素将被视为命令的名称,其余所有元素将被视为命令行参数。这不会受到您尝试执行的命令注入模式的影响。

© www.soinside.com 2019 - 2024. All rights reserved.