一、注入
注入攻击漏洞,例如SQL,OS 以及 LDAP注入。这些攻击发生在当不可信的数据作为命令或者查询语句的一部分,被发送给解释器的时候。攻击者发送的恶意数据可以欺骗解释器,以执行计划外的命令或者在未被恰当授权时访问数据。
-
命令注入
- 漏洞利用演示
- 漏洞危害说明
攻击者可以通过当前用户权限执行任意的操作系统命令,并获取返回结果。如当前服务是管理员账号,则危害更为严重。命令执行漏洞危害包括:增加、修改、删除系统账号和密码,上传、下载机密文件或木马后门文件等。
- 漏洞代码分析
后台主要代码:
<%
Stringparams = request.getParameter("cmd");
Runtime rt =Runtime.getRuntime();
String[] cmd= new String[3];
cmd[0] = "cmd.exe" ;
cmd[1] = "/C";
cmd[2] = "ping" + params;
out.println("<br/>执行命令:" + cmd[0] +cmd[1]+" "+cmd[2]);
Process p =rt.exec(cmd);
BufferedReaderbr = new BufferedReader(newInputStreamReader(p.getInputStream()));
String line= null;
StringBuffersb = new StringBuffer();
while ((line =br.readLine()) != null) {
sb.append(line).append('n');
}
br.close();
out.println(sb.toString().replaceAll(" ",""));
%>
最终服务端执行的命令格式:cmd /c IP,其中IP是用户的输入。
如果用户输入127.0.0.1 && whoami,最终执行的是cmd /cping 127.0.0.1 && whoami,即在一个新的shell下通过&&连接符执行了2条命令。&&表示ping 127.0.0.1成功后继续执行后一个命令whoami。同样也可通过其它命令连接字符串如& | || 等进行攻击。
- 漏洞代码修复
防止命令注入可使用:
a. 如果使用语言提供的API或函数执行命令,需要理解API或函数是否调用了shell来执行命令。如java中的Runtine类的静态方法exec,执行命令时默认不会调用shell。所以在当前场景下可以直接使用Runtime.exec直接执行ping命令。
修复代码参考:
<%
String params = request.getParameter("cmd");
Runtime rt = Runtime.getRuntime();
Process p = rt.exec("ping " +params);
BufferedReader br = newBufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
StringBuffer sb = newStringBuffer();
while ((line =br.readLine()) != null) {
sb.append(line).append('n');
}
br.close();
out.println(sb.toString().replaceAll(" ",""));
%>
类似地,nodejs的exec命令会先进行Shell语法解析,因此用exec函数也会导致命令注入的问题。
b.如果使用系统shell命令执行,则需根据使用场景对用户输入进行验证
本场景可以使用正则表单判断输入是否是IP地址格式。