• 【转】记一次曲折的WAF绕过


    题记

        今天在公众号看到一篇文章,本来以为是以前那种特别没劲的文件上传姿势(因为这类文章太多了),看完之后发现,膜拜大佬,果然不能只看标题啊。

    本文转自https://xz.aliyun.com/t/10459

    0x00:前言

      做之前没想过有这么难。

    0x01:后缀绕过

      首先看一下waf咋工作的,当数据包匹配到waf规则后,数据包就会被丢弃掉,就像这样

      waf是拦截后缀的,首先fuzz一波。

    1 换行

    失败

    2 多个等于号

    失败

    3 单双引号替换

    失败

    4 去掉引号

    失败

    5 溢出Content-Disposition字段


    失败

      而且不清楚是因为服务器性能原因还是规则有这个,当此字段太长的时候(具体多长不清楚),正常上传图片数据包也会被丢弃。

    6 多个Content-Disposition字段

    失败

    6 畸形协议

    失败

    7 boundary前加减空格

    失败

      而且操作这边服务器会不识别上传,导致正常文件传不上去。

    8 删除Content-Type: image/jpeg

    失败

    9 溢出文件名

    失败

      而且这里也有限制,太长也会导致正常上传失效。

    10 Accept-Encoding:

    Accept-Encoding: gzip
    Accept-Encoding: compress
    Accept-Encoding: deflate
    Accept-Encoding: br
    Accept-Encoding: identity
    Accept-Encoding: *
    失败

    11 分块传输

    失败

      似乎waf拦截的就是 Transfer-Encoding: chunked ,但是去掉chunked会请求异常。

      等等等后面又试了一堆,均失败。

    柳暗花明

      后面看了一眼服务器 是windows的,尝试用windows文件命名规范来绕过,众所周知,win的文件名是不能包含以下字符的。

      但是上传的时候我们可以构造,尝试使用斜杠绕过。

      结果有点出乎意料,最后到服务器的居然是.jpg,正反斜杠都这样。

      换一个符号,尝试星号,被拦,都试了一遍后,发现只有冒号可以。

      访问一下看看是否存在www.php

      文件确实传上去了,可是问题又来了,没写入内容...

      后来才知道,冒号会将文件内容置空,一时间又没了头绪

      姑且后缀名绕过了吧。

    0x02:内容绕过

      只传个0kb和不传不是一样吗,所以还是要把数据写进去,

      怎么写呢?起初我是不知道的,旁边的好兄弟说三个左尖括号可以写入文件

      类似这样

      但是 也被waf加入规则了

      ......

      天无绝人之路,三个不行 我用四个

      没想到四个也能写 笑了 都不知道为什么

      但是问题又来了 文件名咋整,www.php会被拦截,加个冒号又会将文件置空,似乎陷入了死循环,一顿瞎操作后,发现这样居然写进去了,虽然也不知道为什么,可能是什么奇奇怪怪的正则机制?

      既然能写文件了,那我本来以为就简简单单了,没想到噩梦才是刚刚开始

      首先我之前整的一堆花里胡哨的马一个都没过去,唯一一个能过去的,之前绕过的马还不能运行(这是个坑,后面会讲),虽然这个马在我本地是可以运行的,可能这就是玄学吧哈哈。

      首先正常的变量他就过不去,然后<?php 标签和某些场景混合时也过不去,成对的括号它也拦截,总之就是变态

      举个例子:

      所以才有了上面那个奇怪的马

      内容绕过也是在这个基础上去过去的,本来我准备直接传这个马梭哈,但是传是传上去了,执行不了,会一直等待,但是这个等待又不是被waf拦截了,后面才知道,这是因为php内容报错了,导致不能正常运行,就会一直卡在那里,

      那为什么会报错呢,fuzz了一波后才发现,这个服务器上必须闭合尖括号,要不然就会直接炸,明明是同样的php版本,也不知道为什么会这样,只传递第一个标签没问题,

      少个闭合就炸:

      但是末尾的两个标签也不能去掉,是用来混淆的,去掉直接waf都过不去。

      场面陷入了胶着,此时将一个完整的马传上去似乎不太现实了,一步一步来吧,先尝试能不能执行命令

      之前讲过,规则是不允许成对括号出现的,所以连phpinfo都执行不了

      真的执行不了吗?

    $a =<<< aa
    
    assasssasssasssasssasssasssasssasssasssasssassss
    
    aa;

      这种赋值手法是php的一种特性,用于解决字符串中既有单引号又有双引号这种特殊情况,aa名称没意义,起什么都可以,在某些php版本中,末尾的aa后不能加其他语句,否则会报错。

      因为会报错,所以waf不会拦截,所以在aa;后是可以添加php代码的

      好巧不巧,这服务器可以执行。

      既然能执行phpinfo,那system()肯定也行

      传完后又转起来了

      这里又一个坑,因为system中可以用双引号也可以不用,用双引号的时候一般是类似 ls -l 这种有空格的情况,但是whoami这种的是不需要引号的,但是这里访问一直转明显是语法错误,那我加上就是了。

      属实是天坑

      命令执行没问题了,尝试写一句话,

      果不其然被拦截了

      尝试加点注释

      没问题过去了,访问一下

      又转起来了

      本地试了一下,发现eval这句不能在aa;后面,又是语法错误

      既然如此,那我只能放大招了,那就是fopen大法,也就是通过php脚本文件向服务器写新文件,达到绕过流量层waf检测。

      先写个txt试试水,所有字符能放开的最好直接用注释分开,

      访问一下www.php

      没问题,说明确实执行了我们的代码。

      那既然如此就好办多了,直接传个一句话

      可惜,明文传输直接挂,流量还得过。

    0x03:流量绕过

      流量绕过就比较简单了,多次编码即可,这里上传了一个三次base64解密的马

      但是蚁剑编码器出现了问题,可能是多次编码导致不知道哪里出了问题,直接上传冰蝎(这里需要把冰蝎分两段传,用fopen的a参数拼接脚本)

      over

  • 相关阅读:
    【python】【pycharm】+python工程打包成exe+在windows下自动定时运行
    技术备忘
    【Linux】—常用命令(测试人员)
    【python】【pycharm】+pip解析
    【python】【pycharm】+封装&导入
    C# 之程序退出的方法
    C# 之值类型和引用类型
    C# 之数组
    找靓机AppUI自动化测试延伸
    初、中、高级程序员的区别有哪些?
  • 原文地址:https://www.cnblogs.com/sunny11/p/15540172.html
Copyright © 2020-2023  润新知