免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。本次测试仅供学习使用,如若非法他用,与平台和本文作者无关,需自行负责。
|
大家可以把安全绘景设为星标,这样就可以及时看到我们最新发布内容啦!
一、简介
雷池Web应用防火墙是一款免费的WAF,它具备简单易用、强大可靠的特点。该系统基于业界领先的语义引擎检测技术,并以反向代理接入方式提供服务。长亭科技耗时近十年打造了这一产品,核心检测能力依托智能语义分析算法驱动。雷池的安装配置非常简单,同时提供卓越的防护效果。因此,越来越多的网站选择接入雷池,尤其受益于其社区版的免费优势。
二、环境
安装
在线安装:bash -c “$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/setup.sh)”
牧云助手安装:https://rivers.chaitin.cn/
安装部分比较简单,不做详细演示。
配置
有两处需要配置,一个是防护的站点,另一个是防护的等级。
防护站点配置:域名可以使用通配符,端口是雷池的访问端口,上游服务器就是后端真实业务的地址,因为雷池工作方式是反向代理,所以需要转发到后端真实业务地址上。
防护等级配置:根据实际需求配置防护等级即可。
测试环境:Linux(Centos)+雷池最新版+最高防护。
注意:因为雷池社区版不支持Windows和Mac,所以所有的测试都是基于Linux。
Web环境:docker搭建(java-sec-code),jdk/1.8.0_102、Apache Tomcat/8.5.11,不同版本之间可能会存在测试结果不一致的情况。
测试时间:2023/11/25
三、测试
绕过
先正常上传jsp文件看看防护是否生效,可以看到设置的防护已生效,被拦截了。
对于文件上传的绕过,主要为Content-Type请求头和Content-Disposition描述行。
Content-Type请求头可以使用双写、大小写、特殊字符(空格、制表符)等进行绕过,测试发现双写、大小写无法绕过,但添加特殊字符(空格、制表符)可以绕过。
利用在boundary=后面添加空格绕过:
利用在boundary=后面添加制表符绕过:
Content-Disposition描述行可以利用的绕过方式较多,例如多属性名、多描述行、切换属性名引号、属性名添加特殊字符、语言特性、容器特性、系统特性等。测试发现多filename、分词符(;)、容器特性均可绕过。
利用双写filename绕过:
利用分词符截断绕过:
利用容器解析特性绕过:
拓展
当使用了commons-fileupload组件且版本>1.3时,可以通过Base64编码和QP编码来绕过上传文件名的限制。简单来说就是:当filename以=?开头时,就会通过传入的不同方式进行解析,格式为=?charset?B/Q?xxx?=,其中charset是编码,B代表Base64编码,Q代表QP编码,xxx则是对应的编码值。例如:=?gbk?Q?=74=65=73=74=2e=6a=73=70?=
这里借用y4tacker师傅的脚本来快速生成对应编码后的值:
import base64
name = "test.jsp"
encode = name.encode("utf-8")
b = base64.b64encode(encode)
print("=?utf-8?B?"+b.decode()+"?=")
res = ""
for i in encode.decode("gbk"):
tmp = hex(ord(i)).split("0x")[1]
res += f"={tmp}"
print("=?gbk?Q?"+res+"?=")
利用QP编码绕过:
注:docker中没有对应的解析库导致文件名无法解码,但思路可行。
命令执行
上传后缀绕过后必须要shell可用才是真正的绕过,这里提供一种绕过内容检测的思路,通过jspx的CDATA和HTML实体化编码特性绕过。
注:因为靶场将文件上传到/tmp/目录下无法解析,这里我直接在测试服务器上的tomcat目录中新建了一个1.jspx文件(文件内容一致)进行测试。
文件正常解析并执行命令:
因为在公网服务器上直接放一个webshell太吓人,所以截了图就关掉了,重新启动了一个靶场环境(docker还是相较于更安全且需要登录)来测试命令执行。
雷池社区版目前只能部署在Linux服务器上,而Linux系统中执行命令的绕过方式有非常多的方式,我这里简单列举几个:单引号、双引号、反引号、括号、其他符号、环境变量等。本地测试如下:
直接执行命令肯定是拦截的。
在命令中间随便加一点不影响解析的符号即可绕过。
读取敏感文件时,直接读肯定被拦截。
可以通过通配符、垃圾字符等绕过。
四、总结
本次测试时间比较匆忙,如有错误,请师傅们斧正。整体测试结果显示,雷池WAF相较传统的WAF更为强大,并且通过语义分析变得更智能化,增加了绕过的难度。在综合本次整体测试的观察中,主要利用了一些特性(例如语言、中间件、系统等)来绕过WAF的解析,从而使恶意文件、内容和命令得以逃逸。然而,文章中所提及的思路只是这些特性中的一小部分,其他的思路留给师傅们自行挖掘。
参考链接:
https://y4tacker.github.io/2022/02/25/year/2022/2/Java%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E5%A4%A7%E6%9D%80%E5%99%A8-%E7%BB%95waf(%E9%92%88%E5%AF%B9commons-fileupload%E7%BB%84%E4%BB%B6)/
推广一波自己的星球:
安全绘景:持续更新0/1day的poc、红队技巧、实战文章、实用工具等资源,欢迎各位师傅来扰,不满意直接退款。最后祝愿各位师傅天天高危!
原文始发于微信公众号(安全绘景):最新版雷池WAF文件上传绕过-jsp篇