什么是Shell注入
Shell注入又被称之为OS命令注入,它指的是利用程序所存在的漏洞,构建含有恶意指令的字符串使目标程序执行攻击者的命令。Shell注入命名来自Unix shell,但大多数允许程序调用命令行接口的系统上运行的程序都可能在无意中引入Shell注入相关的漏洞。具有Shell注入潜在风险的接口包括有Java中的java.lang.Runtime.exec()
、.NET中的System.Diagnostics.Process.Start()
等。
相对于SQL注入等漏洞,Shell注入较少被提及,但由于其可以直接接触程序外的资源,通常会更为严重的影响。
写这篇文章是在朋友写的demo程序中发现了一个shell注入漏洞,于是就将该程序改写了一下作为开篇的示例。在下列Java代码中,前端传递docker镜像名至后端服务器,由后端服务器调用docker pull
命令拉取对应的镜像文件。
String imageName = (String) params.get("imageName");
String cmd = "docker pull " + imageName;
Process process = Runtime.getRuntime().exec(cmd);
// ...
当前端传入的imageName
参数值为正常的镜像名称时(如nginx
),会执行docker pull nginx
命令拉取nginx镜像。而当前端传入的imageName
参数值为nginx; echo hacked
,即带有恶意指令echo hacked
时