文件上传——WAF漏洞(此部分是以安全狗safedog为例)

发布于 2023-09-17  371 次阅读


1.1 上传参数

Content-Disposition: //表示来自表单的数据#一般可更改

name: //表示表单传递的名字,在前端的传递的名字#表单参数值,不可更改

filename: //上传的文件名称#文件名,可更改

Content-Type: //上传文件的格式(MIME类型)#文件MIME,根据情况更改

常见的绕过方法:

  1. 数据溢出-防匹配(XXX...)
  2. 符号变异-防匹配(' " ;)
  3. 数据截断-防匹配(%00;换行)
  4. 重复数据-防匹配(参数多次)

数据溢出:在拦截数据包之后,在请求头中添加大量的无关数据,一种情况是如果WAF对文件格式进行了拦截,那么我们可以将文件名制作成大量长度的文件名,但是该种方法并不能绕过WAF的检测,可能会让WAF崩溃,但是文件也无法上传。第二种情况就是在数据包的上传参数之间添加许多无关的垃圾数据进行绕过,从而造成WAF无法检测出文件异常,使得绕过WAF。如下图就是第二种情况。

符号变异:目的就是让WAF无法找到我们进行上传的文件格式。比如存在filename="a.php",这样的文件进行上传的时候会被拦截,那么为了防止被拦截,我们可以进行猜想对符号进行变换,首先我们从结构上进行猜测,可能WAF的匹配机制是在对”“内部的信息进行匹配,那么我们可以采取替换的方式,我们就通过将”“平替为‘’,则格式为filename='',那么存在绕过的可能。如果还是被检测到,那么我们再猜测是否可以通过不闭合的”来进行绕过,因为我们猜测,可能是对”“之间的内容进行匹配,那么如果我们不闭合“,是否可以进行绕过,我们就修改为filename="a.php或者filename=a.php",看是否能够绕过。另外还有方式就是,我们使用filename=""a.php进行绕过,因为既然其对“”内部内容进行匹配,那么其检测到就会是空,而我们的文件a.php还是能够上传成功的。如果还是不行,就可以查找其他方式。

数据截断:为了绕过WAF,我们还可以使用截断的方式进行绕过,一种方式就是采用%00进行截断,比如filename=“a.php%00.jpg”,就是利用截断的方式让WAF在对文件进行读取能够认为是.jpg的格式,但是在上传文件之后仍然是.php格式,因为通过%00进行截断了。第二种方式就是使用;进行截断,比如filename="a.jpg;.php",利用这种方式,也许WAF在对文件格式进行检测的时候,就会在;处停止,从而上传文件为a.jpg;.php,这也是php文件可执行。还有一种方式就是通过换行进行截断,原理就是在换行的时候,会默认添加“\n”在换行处,那么我们通过换行得到的文件就是filename="a.\np\nh\np",可能这样的方式就可以绕过WAF的检查。(另外类似于;,我们也可以使用/进行测试截断绕过)

重复数据:第一种情况,我们可以重复设置filename="a.jpg";filename="b.jpg",之后查看是a.jpg进行了上传还是b.jpg进行了上传,那么我们就可以通过查看到底是a.jpg进行了上传还是b.jpg进行了上传来分辨WAF检测的是前一个上传文件还是后一个上传文件,假设是后一个上传文件,那么我们就可以构建filename="a.jgp";filename="a.jgp";filename="a.jgp";filename="a.jgp";filename="a.jgp";filename="a.jgp";filename="a.jgp";filename="a.jgp";........;filename="a.php",那么可能就可以进行WAF绕过。另一种方式就是将前面参数中的内容复制进filename的参数值中,filename=“Content-Disposition:form-data;name="upload_file";a.php”。这种情况下也可能可以进行绕过。

注:常用的模糊测试dict——fuzz

下载网址:

  1. https://github.com/fuzzdb-project/fuzzdb
  2. https://gthub.com/TheKingOfDuck/fuzzDicts

文件上传安全修复方案

  1. 后端验证:采用服务端验证模式
  2. 后缀测试:基于白名单、黑名单进行过滤
  3. MIME检测:基于上传自带类型检测
  4. 内容检测:文件头,完整性检测
  5. 自带函数过滤:参考uploadlabs函数
  6. 自定义函数过滤:function check_file()
  7. WAF防护产品:宝塔,云盾,安全公司产品等。

一花一世界,一叶一菩提。