一、注入
注入攻击漏洞,例如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地址格式。