记一次绕过waf的文件上传
2023-12-3 12:1:17 Author: 白帽子左一(查看原文) 阅读量:6 收藏

 扫码领资料

获网安教程

免费&进群

在某次渗透测试中,发现了一个通用上传的点,但经过测试发现,该网站存在waf,但是最终绕过waf,成功拿到shell

在对某网站进行渗透测试时,偶然发现一个未授权接口,并且通过接口名可以判断出该接口可能存在文件上传,

当上传正常后缀名时,会提示200,并且文件可以成功上传

当上传jsp等后缀时,会请求失败返回空

从这里可以判断出改网站存在waf,当检测到请求包检测到威胁时会自动拦截丢弃。

既然是从waf层面检测的,那我们绕过的思路就是构造一个畸形的语句或者其他无法被waf识别但是能够被后端解析方法,比如通过MIME编码进行绕过

(注意,这里说的MIME编码可不是将Content-Type修改为image/png等类似的方式进行绕过的,这种方式修改的是MIME type。而我们今天所说的是MIME编码。)

Multipurpose Internet Mail Extensions (MIME) ,通常也称为多用途互联网邮件扩展,从字面意思可以看出,他的出现是为了扩展了电子邮件的格式,支持 ASCII 字符集以外二进制数据(例如图像、音频、视频或其他文件)转换为文本数据,以便能够安全地传输和处理。从commons-fileupload库版本 1.3 开始,FileUpload 可以处理 RFC 2047编码的标头值。

对于后端的解析,不同的库对这一部分的解码大同小异但是都可以自动识别并对MIME编码后的数据进行解码,这里我们通过对commons-fileupload库的分析,来看看后端是如何自动解析MIME编码后的数据的:

Commons Fileupload是一个用于处理文件上传开源的Java库,可以在Apache官方网站上下载到最新版本。它的文档和示例代码也提供了详细的使用说明,方便开发人员快速上手,提供了一组简单易用的API,用于在Web应用程序中处理文件上传操作。它支持多种文件上传的方式,包括通过表单提交、通过HTTP POST请求以及通过Multipart请求等方式。

在ParameterParser中会对请求的参数进行解析

其中这里调用了MimeUtility.decodeText()对参数进行解析,继续跟进decodeText方法

他会自动判断是否以=?开头的,如果不是直接返回原字符,否则进入else语句

然后去除开头和结尾的[space]\t\r\n,继续判断是否以=?开头,接着进入decodeWord进行解码

decodeWord中,会解析MIME编码,具体做法是通过?(ascii码值为63)进行分割,分别提取出charset(字符集),encoding(编码方式),encodedText(编码后的文本)

然后判断编码方式,当编码方式为B时,是将encodedText的值进行base64编码,当编码方式为Q时,会进入QuotedPrintableDecoder.decode(encodedData, out)方法

=后的两个两个十六进制数字,并将其转换为ascii码值对应的字符。

所以MIME编码的格式为=?charset?encoding?encoded text?=

下面是对这个格式的详细解释

  1. =?:编码的起始标记,表示编码的开始。

  2. charset:表示字符集,即非ASCII字符所使用的字符编码集。这通常是一个标识字符集的文本字符串,例如UTF-8或ISO-8859-1。

  3. encoding:表示编码方式,即用于将字符编码为ASCII字符的具体方法。常见的编码方式包括"Q"和"B"。

    • "Q"表示Quoted-Printable编码,它将非ASCII字符编码为"="后跟两个十六进制数字的形式。

    • "B"表示Base64编码,它将数据编码为一系列ASCII字符。

  4. encoded text:是实际编码后的文本,即包含非ASCII字符的原始文本的编码版本。

  5. ?=:编码的结束标记,表示编码的结束。

举个栗子:

如果将shell.jsp通过Quoted-Printable编码方式为

=?utf-8?Q?=73=68=65=6c=6c=2e=6a=73=70?=

如果将shell.jsp通过Base64编码方式为=?utf-8?B?c2hlbGwuanNw?=

这里的绕过waf的方式也是将文件名或将所有参数都通过MIME编码后发送:
将filename和name的值进行MIME编码后进行发送:

依然返回空被waf拦截了,难道是waf还会检测上传文件的内容?

于是将上传的内容修改为其他结果,上传成功,果然waf会对上传的内容也会进行检测,那我们还需要对内容进行免杀

这里的绕过方法很多,这里用jspx利用命名空间进行绕过

由于jspx实际上是以xml形式编写的jsp,因此它继承了xml的各种特性,包括CDATA和HTML实体编码,同时也包括了命名空间的特性。

这是jspx的helloword

<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">
<jsp:directive.page contentType="text/html" pageEncoding="UTF-8"/>
<jsp:scriptlet>
out.println("Hello World!");
</jsp:scriptlet>
</jsp:root>

这里使用yzddMr6师傅的方法,在jsp:scriptlet这个标签中,jsp就是默认的命名空间,但是实际上可以随意替换成其他名字,这样就绕过了对jsp:scriptlet的过滤

上传成功,然后访问上传的shell,成功解析

来源: https://forum.butian.net/share/2560

声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权

@
学习更多渗透技能!体验靶场实战练习

hack视频资料及工具

(部分展示)

往期推荐

【精选】SRC快速入门+上分小秘籍+实战指南

爬取免费代理,拥有自己的代理池

漏洞挖掘|密码找回中的套路

渗透测试岗位面试题(重点:渗透思路)

漏洞挖掘 | 通用型漏洞挖掘思路技巧

干货|列了几种均能过安全狗的方法!

一名大学生的黑客成长史到入狱的自述

攻防演练|红队手段之将蓝队逼到关站!

巧用FOFA挖到你的第一个漏洞

看到这里了,点个“赞”、“再看”吧

文章来源: http://mp.weixin.qq.com/s?__biz=MzI4NTcxMjQ1MA==&mid=2247603546&idx=1&sn=d1dfeb8dbe65947c8c6f84aa6c538e6c&chksm=ebeb1c77dc9c9561669bb03e9b5f7fd680b8cdcf1ca270ee86510881eb12b2d72733c494f983&scene=0&xtrack=1#rd
如有侵权请联系:admin#unsafe.sh