我正在尝试测试命令注入漏洞
我使用一个执行命令 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
`
您试图通过在构造的命令字符串中注入分号 (
;
) 来运行两个命令来代替一个命令。 ;
对于分隔命令的重要性是 shell 的一个功能,因此如果命令通过 shell 运行,则可能会起作用,类似于 C 的 system()
函数。
Runtime.exec()
不是这样工作的。尽管从其他一些重载中可以更清楚地看出,但这一系列方法是按照 execve()
函数及其各种包装函数进行模式化和工作的。分号对他们来说没有特殊意义。一元 Runtime.exec()
使用 StringTokenizer
将提供的字符串拆分为数组。第一个元素将被视为命令的名称,其余所有元素将被视为命令行参数。这不会受到您尝试执行的命令注入模式的影响。