命令注入详解|OWASP Top 10安全风险实践(三)

本文为一些列连载文章之一,不定期更新,计划目录如下:

命令注入

XML外部实体注入

XPATH注入

反射式、DOM及存储XSS

失效的身份认证和会话管理

不安全的直接对象引用

安全配置错误

敏感信息泄露

功能级访问控制缺失

跨站请求伪造

服务端请求伪造

文件上传漏洞

未验证的重定向和转发

不安全的反序列化

使用含有已知漏洞的组件

一、注入

注入攻击漏洞,例如SQL,OS 以及 LDAP注入。这些攻击发生在当不可信的数据作为命令或者查询语句的一部分,被发送给解释器的时候。攻击者发送的恶意数据可以欺骗解释器,以执行计划外的命令或者在未被恰当授权时访问数据。

  1. 命令注入

  • 漏洞利用演示

命令注入详解|OWASP Top 10安全风险实践(三)

  • 漏洞危害说明

攻击者可以通过当前用户权限执行任意的操作系统命令,并获取返回结果。如当前服务是管理员账号,则危害更为严重。命令执行漏洞危害包括:增加、修改、删除系统账号和密码,上传、下载机密文件或木马后门文件等。

  • 漏洞代码分析

后台主要代码:

 <%        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("&nbsp",""));%>

最终服务端执行的命令格式: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("&nbsp",""));%>

类似地,nodejs的exec命令会先进行Shell语法解析,因此用exec函数也会导致命令注入的问题。

b.如果使用系统shell命令执行,则需根据使用场景对用户输入进行验证

本场景可以使用正则表单判断输入是否是IP地址格式。