• 命令注入详解|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地址格式。

    «
    »
以专业成就每一位客户,让企业IT只为效果和安全买单

以专业成就每一位客户,让企业IT只为效果和安全买单