精华内容
下载资源
问答
  • 所谓"data"类型的Url格式, 是在RFC2397中提出的,目的对于一些“小”的数据,可以在网页中直接嵌入,而不是从外部文件载入。例如对于img这个Tag,哪怕这个图片非常非常 的小,小到只有一个点,也是要从另外一个外部...

    所谓"data"类型的Url格式, 是在RFC2397中提出的,目的对于一些“小”的数据,可以在网页中直接嵌入,而不是从外部文件载入。例如对于img这个Tag,哪怕这个图片非常非常 的小,小到只有一个点,也是要从另外一个外部的图片文件例如gif文件中读入的,如果浏览器实现了data类型的Url格式,这个文件就可以直接从页面文 件内部读入了。

    data类型的Url格式早在1998年就提出了,时至今日,Firfox、Opera、Safari和Konqueror这些浏览器都已经支持,但是IE直到7.0版本都还没有支持,IE不支持的东西太多了,也不差这一个。

    小例子

    下面这个html代码可以在支持data类型Url的浏览器中运行,例如Firefox。运行后会看到一条蓝色渐变底色的标题。

    html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    .title {

    background-image:url(data:image/gif;base64,R0lGODlhAQAcALMAAMXh96HR97XZ98Hf98Xg97DX97nb98Lf97vc98Tg973d96rU97ba97%2Fe96XS9wAAACH5BAAAAAAALAAAAAABABwAAAQVMLhVBDNItXESAURyDI2CGIxQLE4EADs%3D);

    background-repeat:repeat-x;

    height:28px;

    line-height: 28px;

    text-align:center;

    }

    Hello, world!

    这个渐变的蓝色底色实际上是用一个1x28的小图片通过横行重复(repeat-x)形成的。这个图片很小,不过104个字节,直接嵌入到html或css文件还是很合适的。

    data格式的Url最直接的好处是,这些Url原本会引起一个新的网络访问,因为那里是一个网页的地址,现在不会有新的网络访问了,因为现在这里是网页的内容。这样做,会减少服务器的负载,当然同时也增加了当前网页的大小。所以对“小”数据特别有好处。

    data类型Url的形式

    既然是Url,当然也可以直接在浏览器的地址栏中输入。

    data:text/html,

    Hello, world!

    在浏览器中输入以上的Url,会得到一个加粗的"Hello, world!"。也就是说,data:后面的数据直接用做网页的内容,而不是网页的地址。

    简单的说,data类型的Url大致有下面几种形式。

    data:,

    data:text/plain,

    data:text/html,

    data:text/html;base64,

    data:text/css,

    data:text/css;base64,

    data:text/javascript,

    data:text/javascript;base64,

    data:image/gif;base64,base64编码的gif图片数据

    data:image/png;base64,base64编码的png图片数据

    data:image/jpeg;base64,base64编码的jpeg图片数据

    data:image/x-icon;base64,base64编码的icon图片数据

    因为Url是一种基于文本的协议,所以gif/png/jpeg这种二进制属于需要用base64进行编码。换句话说,引入base64以后,就可以支持任意形式的数据格式。下面是个png图片的例子,会在浏览器中显示一个Mozilla的图标。

    data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg==

    data格式Url的种种应用举例

    可以在Html的Img对象中使用,例如

    可以在Css的background-image属性中使用,例如

    div.image {

    width:100px;

    height:100px;

    background-image:url(data:image/x-icon;base64,AAABAAEAEBAAAAAAAABoBQAAF...);

    }

    可以在Html的Css链接处使用,例如

    href="data:text/css;base64,LyogKioqKiogVGVtcGxhdGUgKioq..." />

    可以在Html的Javascript链接处使用,例如

    完整的语法定义

    在RFC中,完整的语法定义如下。

    dataurl    := "data:" [ mediatype ] [ ";base64" ] "," data

    mediatype  := [ type "/" subtype ] *( ";" parameter )

    data       := *urlchar

    parameter  := attribute "=" value

    urlchar指的就是一般url中允许的字符,有些字符需要转义,例如"="要转义为"%3D",不过我测试下来,至少在Firefox里面,不转义也是可以的。

    parameter可以对mediatype进行属性的扩展,常见的是charset,用来定义编码格式,在多语言情况下需要用到。例如下面的例子。

    data:text/plain;charset=UTF-8;base64,5L2g5aW977yM5Lit5paH77yB

    这个例子会显示出"你好,中文!"。如果吧charset部分去掉,就会显示乱码,因为我用的是UTF-8编码。

    Firefox有一个data类型Url的测试页面,列出了各种格式的data类型Url的测试Url,和测试结果说明。

    base64编码和内容的隐秘

    把二进制数据转换成为Base64不是什么难事,比如Total Commander就有这样的功能。还有一些在线资源,

    http://www.greywyvern.com/code/php/binary2base64

    http://www.kawa.net/works/js/data-scheme/base64-e.html

    有些在线转换把base64里面的“=”转换成为%3D,这个在Url中和“=”是一样的,不转换也没什么问题。

    展开全文
  • php中文网最新课程每日17点准时技术干货分享本文为php中文网认证作者:“wpj”投稿,欢迎加入...封装ThinkPHP6.0通用文件上传教程一、打开项目在config文件夹下创建upload.php配置文件用来管理文件上传的后缀和大小...
    abe817a880c4eed32eeb6029e7a565e3.png

    php中文网最新课程

    每日17点准时技术干货分享

    1f67776813334f53252a356d929cfdd7.png

    a3105521558035f7df5b8ca03431874b.gif

    本文为php中文网认证作者:“wpj”投稿,欢迎加入php中文网有偿投稿计划!

    本文实例讲述了封装ThinkPHP6通用文件上传方法,上传功能使用的是LayUI的upload组件。

    封装ThinkPHP6.0通用文件上传教程

    一、打开项目在config文件夹下创建upload.php配置文件用来管理文件上传的后缀和大小

    <?php return [    //定义允许上传文件后缀的数组    'suffix_arr'    =>  [        //允许图片上传的后缀        'image'     =>  'jpg,jpeg,png,gif',        //允许上传文件的后缀        'file'      =>  'zip,gz,doc,txt,pdf,xls',        //...    ],    //定义允许上传文件大小的数组    'size_arr'      =>  [        //允许图片上传的大小        'image'     =>  10,        //允许文件上传的大小        'file'      =>  50    ],];

    二、修改config\filesystem.php配置文件配置上传根目录及上传规则

    <?php return [    // 默认磁盘    'default' => env('filesystem.driver', 'local'),    // 磁盘列表    'disks'   => [        'local'  => [            'type' => 'local',            'root' => app()->getRuntimePath() . 'storage',        ],        'public' => [            // 磁盘类型            'type'       => 'local',            // 磁盘路径            'root'       => app()->getRootPath() . 'public/uploads',            // 磁盘路径对应的外部URL路径            'url'        => '/uploads',            // 可见性            'visibility' => 'public',        ],       // 更多的磁盘配置信息    ],];

    三、 在app\controller目录下创建Upload.php类并编写upload()文件上传方法

    <?php namespace app\controller;use think\exception\ValidateException;class Upload{    //上传    public function upload(){        //判断是否是POST请求,如果是处理上传逻辑        if (request()->isPost()){            //接收文件上传类型            $type = request()->param('type','','trim');            $name = request()->param('name','','trim');            //获取表单上传文件            $file = request()->file('file');            //组装文件保存目录            $upload_dir = '/'.$type.'/'.$name;            try {                //从config/upload.php配置文件中读取允许上传的文件后缀和大小                $suffix_config = config('upload.suffix_arr');                $size_config = config('upload.size_arr');                if (empty($size_config[$type]) || empty($size_config[$type])){                    return false;                }else{                    $suffix = $suffix_config[$type];                    $size = $size_config[$type];                }                //验证器验证上传的文件                validate(['file'=>[                    //限制文件大小                    'fileSize'      =>  $size * 1024 * 1024,                    //限制文件后缀                    'fileExt'       =>  $suffix                ]],[                    'file.fileSize' =>  '上传的文件大小不能超过'.$size.'M',                    'file.fileExt'  =>  '请上传后缀为:'.$suffix.'的文件'                ])->check(['file'=>$file]);                //上传文件到本地服务器                $filename = \think\facade\Filesystem::disk('public')->putFile($upload_dir, $file);                if ($filename){                    $src = '/uploads/'.$filename;                    return json(['code'=>1,'result'=>$src]);                }else{                    return json(['code'=>0,'msg'=>'上传失败']);                }            }catch (ValidateException $e){                return json(['code'=>0,'msg'=>$e->getMessage()]);            }        }else{            return json(['code'=>0,'msg'=>'非法请求']);        }    }}

    四、 打开app\controller\Index.php类并修改index方法

    <?php namespace app\controller;use app\BaseController;class Index extends BaseController{    public function index(){        //渲染前端页面        return view();    }}

    五、在app\view\index目录下创建index.html文件

            文件上传                    #avatar_thumb {            position: absolute;            left: 50%;top: 50%;            width: 168px;            height: 168px;            margin: -50px 0 0 -84px;            border-radius: 100%;        }
    上传头像
    layui.use(['form', 'upload'], function() { var upload = layui.upload; //图片上传 common_upload('avatar'); //文件上传 //common_upload('avatar','file'); });

    六、在public\static\lib\js目录下创建common.js

    /** * @desc 通用文件上传 * @param name  文件存储文件夹 * @param type 文件类型:默认为图片类型(image) */function common_upload(name,type='image') {    layui.use(['form', 'upload'], function() {        var upload = layui.upload;        //选完文件后自动上传        upload.render({            elem: '#'+name,            url: "/upload/upload",            auto: true,            accept: 'file', //普通文件            data:{name:name,type:type},            done: function(data) {                console.log(data);                //上传完毕回调                if (data.code == 0) {                    return layer.msg(data.msg,{icon:2});                } else {                    $("#"+name+"_thumb").attr('src',data.result).show();                    $('input[name='+name+']').val(data.result);                }            }        });    });}

    七、测试图片上传

    7.1、为了方便,本文就不在本地部署项目了,采用ThinkPHP内置的服务器

    进到项目根目录,执行以下命令:

    php think run

    9c09045d0bfa8d3006775cd3d52e77cd.png

    7.2、在浏览器地址栏中输入访问地址,发现报错?

    03c2a96c9f328338527975bec6c4d2af.png

    7.3、遇到错误不要慌,我们打开ThinkPHP的调试功能,看看具体错误信息

    353c6ad2a91415a35a1c7f18a05075a3.png

    7.4、通过开启调试模式,发现报错原因是我们没有安装模板引擎,在ThinkPHP6.0中默认只能支持PHP原生模板,如果需要使用thinkTemplate模板引擎,需要安装think-view扩展

    f0941057c3bacd71d24aacfe3191991c.png

    7.5、进到项目根目录下,输入以下命令进行安装think-view模板

    composer require topthink/think-view

    7.6、再次访问,访问成功。不过图片显示的是破裂的,如果觉得不好看,小伙伴们可以自行设置一个默认图片。

    50464d420e16f1e6fbff2642b6229c15.png

    7.7、测试图片上传。从GIF图中可以看出上传图片大小和后缀不符合配置文件中设置的值,会给出相应的提示信息,只有上传符合配置文件中设置的值的图片才会在页面中显示并存储到本地。

    cec83f81fd8e139fccbba54f4bccea8b.gif

    7.8、如果需要上传文件,视频或音频,只需要修改以下两个地方,这里就不演示了,小伙伴们下去自己试下。

    5d094f840c04d82437bfb6c3a38bf473.png

    八、新图片上传成功后自动删除原图,有效地减少垃圾信息的累积

    8.1、在app\controller\Upload.php中添加delImg() 方法

    <?php  namespace app\controller; use think\exception\ValidateException; class Upload{    //上传    public function upload(){        //判断是否是POST请求,如果是处理上传逻辑        if (request()->isPost()){             //接收文件上传类型            $type = request()->param('type','','trim');            $name = request()->param('name','','trim');            //获取表单上传文件            $file = request()->file('file');            //组装文件保存目录            $upload_dir = '/'.$type.'/'.$name;             try {                //从config/upload.php配置文件中读取允许上传的文件后缀和大小                $suffix_config = config('upload.suffix_arr');                $size_config = config('upload.size_arr');                 if (empty($size_config[$type]) || empty($size_config[$type])){                    return false;                }else{                    $suffix = $suffix_config[$type];                    $size = $size_config[$type];                }                //验证器验证上传的文件                validate(['file'=>[                    //限制文件大小                    'fileSize'      =>  $size * 1024 * 1024,                    //限制文件后缀                    'fileExt'       =>  $suffix                ]],[                    'file.fileSize' =>  '上传的文件大小不能超过'.$size.'M',                    'file.fileExt'  =>  '请上传后缀为:'.$suffix.'的文件'                ])->check(['file'=>$file]);                 //上传文件到本地服务器                $filename = \think\facade\Filesystem::disk('public')->putFile($upload_dir, $file);                if ($filename){                    $src = '/uploads/'.$filename;                    return json(['code'=>1,'result'=>$src]);                }else{                    return json(['code'=>0,'msg'=>'上传失败']);                }            }catch (ValidateException $e){                return json(['code'=>0,'msg'=>$e->getMessage()]);            }        }else{            return json(['code'=>0,'msg'=>'非法请求']);        }    }     //删除旧图片    public function delImg(){        if (request()->isPost() && request()->isAjax()){            //获取旧图片地址            $img_url = input('img_url','','trim');            //如果旧图片地址为系统默认图片地址直接返回true; 这里的系统默认地址小伙伴可以自行设置            if($img_url == '/uploads/image/avatar/default/user_avatar.jpg'){                return true;            }            //ROOT_PATH常量建议定义在入口文件index.php或中间件中,这里为了演示方便就先定义在这里。            define('ROOT_PATH',dirname(str_replace("\\",'/',$_SERVER['SCRIPT_FILENAME']))."/");            //如果接收的图片地址不为空,循环删除            if (!empty($img_url)){                $old_image = array(ROOT_PATH.$img_url);                foreach ($old_image as $img){                    if (file_exists($img)){                        @unlink($img);                    }                }            }            return json(['code'=>1,'msg'=>'图片删除成功']);        }else{            return json(['code'=>0,'msg'=>'图片删除失败']);        }    }}

    8.2、在common.js中的common_upload()方法中定义before()

    /** * @desc 通用文件上传 * @param name  文件存储文件夹 * @param type 文件类型:默认为图片类型(image) */function common_upload(name,type='image') {     layui.use(['form', 'upload'], function() {        var upload = layui.upload;         //选完文件后自动上传        upload.render({            elem: '#'+name,            url: "/upload/upload",            auto: true,            accept: 'file', //普通文件            data:{name:name,type:type},             before: function(obj) {                var img_url = $('input[name='+name+']').val();                // 删除老数据                if (img_url != '') {                    $.ajax({                        url: "/upload/delImg",                        type: 'POST',                        data: {                            img_url: img_url                        },                    });                }            },             done: function(data) {                console.log(data);                //上传完毕回调                if (data.code == 0) {                    return layer.msg(data.msg,{icon:2});                } else {                    $("#"+name+"_thumb").attr('src',data.result).show();                    $('input[name='+name+']').val(data.result);                }            }        });    });}

    0baa5c48e79478d329914c1c4263d8b4.png

    b2a4c85ed2e91ff847f2810a2298dd40.png

    展开全文
  • 说明一下如果在开放中程序员对文件上传忽略了对文件后缀名进行::$DATA 处理的话那么测试人员可以根据 windows 文件流特征来绕过限制我们通过抓包修改上传文件的后缀名,在后缀名后面添加::$DATA 来进行绕过。...

    71ea7bb706a37bb09c9f71d117294096.gif

    最近小白一直在学习代码审计,对于我这个没有代码审计的菜鸟来说确实是一件无比艰难的事情。但是今天不是说代码审计的事情,而是文件上传的东东 小白在对 writeup 上传靶机中发现,通审查源代码能够让我们更清晰的了解文件上传漏洞。话不多说,下面我们就开干。在下面的实验中可能会与这个靶机的顺序不一样。有什么不足,还望大佬多多指教。

    首先我们先准备一下实验环境:

    1、win10

    2、wamp

    3、一句话木马文件

    4、burp 抓包工具

    文件上传–前端 JS 绕过

    e485ed3b944f9e99322e870b33f4fcce.png

    我们通过查看源代码的第 8 行代码 var allow_ext = “.jpg|.png|.gif”可以知道前端 JS 对文件的上传的缀名做了限制,但是未向服务器端发送验证消息 故造成我们可以通过抓包修改后缀名来绕过前端的限制。

    首先我们先写一个 php 的小马文件,然后将一句话木马保存为 shell.jpg,内容如下:

    <?php  eval($_GET['cmdback']);?>

    我们通过抓包修改上传文件后缀可以成功绕过限制,文件路径也在返回包中显示,这样我们就可以使用菜刀进行连接,从而获取到服务器的 webshell进一步对服务器进行提权。

    833e4c1271b788df08fd630a8cc98de2.png

    前端绕过后缀名

    1ea6a5811320fd215a456c8501834d2d.png

    通过审查源代码在第 5 行和第 7 行的代码中,对于上传的文件 MIME 类型进行了验证判断。writeup 对于上传后的文件的路径是 UPLOAD_PATH/上传的文件名拼接而成的。我们可以通过修改截断上传数据包,修改 Content-Type 为 image/gif,然后放行数据包, 这样的话我们就可以绕过限制。

    04731a5560fd346e066ca3d8188ebf71.png

    绕过黑名单验证

    首先我们还是先来看一下代码通过代码我们来判断文件上传是否存在被绕过的可能性。

    4af51ce69d0e6437e11f8350fed662e9.png

    代码中第 4 行到第 11 行程序对上传的文件名、文件上传路径做了一下过滤,值得注意的是第 5 行代码中定义了一个文件上传后缀名黑名单的数组不允许.asp\.aspx\.php\.jsp 的后缀名的文件进行上传,如果上传的是这些后缀名的文件,第 22 行代码中就会提示不允许上传。13 行到 15 行是对上传后的文件名称的命名的一个规则通过代码我们可以知道命名规则是以日期10000-9999 随机数拼接而成的。

    既然我们知道了上传文件的限制我们可以通过抓包修改文件后缀为.php4只要能绕过后面的是什么就不重要这样我们就可以成功绕过黑名单限制。

    d1f69b7748a71b51c7626428a04e7365.png

    重写文件解析规则绕过限制

    c6c5f03cd1f5beecbafdeb4dfbd8f2bf.png

    通过代码中可以看出程序对于文件上传的后缀名的过滤增加了.php4 的后缀名的文件,这样的话我们再上传.php4 文件名后缀的文件就行不通,那么还可以通过重写文件解析规则来绕过限制 , 创建一下一个.htaccess 文件,内容如下:


    SetHandler application/x-httpd-php

    我们先创建一个 php 的图片马,创建的方法命令:

    使用 dos 命令制作一句话图片木马。

    /a 指定以 ASCII 格式复制、合并文件。用于 txt 等文档类文件;

    /b 指定以二进制格式复制、合并文件; 用于图像类/声音类文件;

    copy 1.jpg/b+1.php 2.jpg   //将 1.jpg 以二进制与 1.php 合并成 2.jpg;

    生成后的 2.jpg 就是图片木马了。

    a052584f0d710f88d3014f1a9a3cbc3d.png

    首先我们先上传.htaccess 文件:

    1061e3f6d3a882fd2a9be80a59c5530a.png

    .htaccess 文件上传成功后,我们将 2.jpg 上传到服务器。

    063b32abac0fa98b291a0842600ce665.png

    f725374381c4fe5b412f83290c959580.png

    这里说一点:通过.htaccess 文件调用 php 解析器去解析一个文件名中只要包含”1.jpg”这个字符串的任意文件,无论扩展名是什么,都以 php 的方式来解析。

    如果不用.htaccess 文件调用 php 解析器去解析的话,就算是图片马,服务器也不会去解析的:如图:

    d9440a4e852c359325da8801d5947897.png

    文件后缀大小写绕过限制

    030f497b3b17354d59c31129c8d01abf.png

    通读代码还是看第 4 行到第 10 行的内容,主要是对上传文件的后缀以及内容进行过滤,.htaccess 后缀也做了限制。但是我们发现对文件的上传的限制貌似少了一条规则:$file_ext = strtolower($file_ext);  //将后缀名转换为小写那么我们可以通过修改后缀名为大写来绕过这个漏网之鱼。

    88791419d263ca94120e0ca439db2cc5.png

    a7ab666aed569dc823412460a3ecc6e5.png

    利用 Windows 系统的文件名特性来绕过文件上传限制

    e2d0b3f7e84ebecf9ce84817ac51d4d2.png

    通过查看代码发现对文件上传的后缀类型增加了.phP 之类的文件,也不能利用::$DATA 绕过。那么我们可以利用 Windows 系统的文件名特性来绕过限制,通过. 以及_和空格。

    087354f7363007e436a517c705c9e534.png

    4bd165f065e5d5880251a5d3f64e8f6d.png

    Windows 文件流特性绕过

    446d9bd1a3e96d3df98ffde5aab9e097.png

    $file_ext = str_ireplace(‘::$DATA’, ”,$file_ext);//去除字符串::$DATA,在限制上传文件的代码中少了这个限制我们可以通过 windows 文件流特征来绕过限制。

    说明一下如果在开放中程序员对文件上传忽略了对文件后缀名进行::$DATA 处理的话那么测试人员可以根据 windows 文件流特征来绕过限制我们通过抓包修改上传文件的后缀名,在后缀名后面添加::$DATA 来进行绕过。

    2194aebe2dd4e2aeee63947bf0c9dbb6.png

    240a220ff41ab15d1d54021318a48041.png

    双文件名绕过限制

    8d73dfe70684bdc71d82bc7dac0a29ac.png

    通过代码可以看出在第 10 行代码中可以看到上传后的文件名是$file_name 直接拼接而成的第 8 行代码中对上传的文件后缀只进行了一次过滤可以通过抓包双写文件后缀进行绕过限制。

    689b8043a2709e97f2eaf71bc2beb9a5.png

    9e3a130ecb219d0be0a8bc8cbf075af6.png

    %00 截断绕过上传限制

    通过代码我们可以知道服务端对于上传文件名后缀做了限制 第 8 行代码中我们可得知上传路径命名的规则是当用户 get 请求的 save_path 的值拼接而成的,这个%00 截断需要的权限比较大,把上传的文件名写成 2.jpg, save_path 改成../upload/1.php%00,最后保存下来的文件就是 2.php。说明一下,第 8 行代码中可以看到是用户是通过 get 请求的,如果是 post 请求的话需要另一个办法上传路径 0×00 绕过。利用 Burpsuite 的 Hex 功能将 save_path 改成../upload/1.php【二进制 00】形式。

    绕过文件头

    febe359ed7dba6a7da9ff4cde8841000.png

    在测试过程中经常会遇到文件头检查,只要代码检测到上传的文件头与代码中所规定的不一致的时候会禁止上传文件,但是我们可以通过修改文件头来绕过文件头检查。

    3a21d2d99519b176e3cd728b27a68789.png

    在代码中 8–20 行代码利用 switch 进行对变量$typeCode 判断文件头是否符合代码中的规定,如果符合就跳出循环否则会返回一个提示为 unknown。

    我们成功上传到了服务器,但是我们拿不到 webshell,这个漏洞一般都是配合通常图片马配合%00 或者 0×00 截断上传,或者配合解析漏洞。

    961b1749d39d22cdca46d6d49baa76df.png

    总结:

    在小白看来大部分的文件上传漏洞产生的原因为以下两点:

    1、Web 应用程序未对用户上传文件的格式以及内容未做严格的过滤;

    2、Web 服务器的解析漏洞来配合上传突破防护。

    防护建议:

    1、检查文件上传的路径避免解析漏洞%00 截断等;

    2、文件的扩展名检测;

    3、文件 MIME 的验证;

    4、对上传文件的目录做限制比如上传的文件不能解析。

    5、对于上传文件的路径限制返回信息或者对返回信息进行多重加密。

    ea0d217b29b30f2134f426ab94d3712c.gif

    展开全文
  • 1.3 文件后缀名 用aac编码的文件可能使用这三种后缀名:aac,m4a,mp4. AAC:以aac为后缀的文件无文件头,由一些列的帧组成文件,帧头分ADIF和ADTS两种。 M4A:用MP4作为container,这种MP4文件里面只有音频帧,无视频帧...

    1 文件格式

    1.1 概述及分类

    AAC“Advanced Audio Coding”的缩写,中文称为“高级音频编码”,被手机界称为“21世纪数据压缩方式”,AAC所采用的运算方式是与MP3的运算有所不同,AAC同时可以支持多达48个音轨,15个低频音轨,更多种取样率和比特率与及有多种言语的兼容能力,更高的译码效率,总括来说,AAC可以在对比MP3文件缩小30%的前题下提供更好的音质。

    AAC帧与帧之间编码完全独立,所以其广泛运用于流媒体。

    由于对AAC有重要贡献的公司比较多,如Fraunhofer,Dolby, Sony和AT&T,导致AAC子格式多,很容易搞混。他们是共分为9种规格,以适应不同场合的需要:

    a) MPEG-2 AAC LC 低复杂度规格 (Low Complexity)

    b) MPEG-2 AAC Main 主规格

    c) MPEG-2 AAC SSR 可变取样率规格 (Scaleable Sample Rate)

    d) MPEG-4 AAC LC 低复杂度规格(Low Complexity),现在的手机比较常见的MP4文件中的音频部份就包括了该规格音频文件

    e) MPEG-4 AAC Main 主规格

    f) MPEG-4 AAC SSR 可变取样率规格 (Scaleable Sample Rate)

    g) MPEG-4 AAC LTP 长时期预测规格(Long Term Predicition)

    h) MPEG-4 AAC LD 低延迟规格(Low Delay)

    i) MPEG-4 AAC HE 高效率规格(High Efficiency)(即AAC+,含SBR)

    上述的规格中,主规格“Main”包含了除增益控制之外的全部功能,其音质是最好,而低复杂度规格则是比较简单,没有了增益控制,但提高了编码效率,至“SSR”对“LC”规格大体是相同,但是多了增益的控制功能,另外,MPEG-  4/AAC/LTP/LD/HE,都是用在低码率下编码,特别是“HE”是有Nero ACC编码器支持,是近来多用的一种编码率种,不过通常来说,Main规格和LC规格的音质相差是不大。

    以上规格的划分是比较官方的分发,wiki上也是如此划分。事实上MPEG-4与MPEG-2 AAC流除了在文件头(header)上并没有什么区别。只是一些应用软件象QuickTime并不承认MPEG-2 AAC。Real的解码程序中,并未对这2种进行区分。所以从编解码来看,按如下划分更清晰:

    a)LC profile:最简单的profile,苹果iTune使用这种格式(iTune也使用Apple LosslessAAC ,不过似乎没有划分到AAC家族中,一个文件通常上20M)。

    b) MAIN profile: LC profile + 后向预测(backwards prediction)

    c) SRS: sample-rate scalability,submitted by Sony and reportedly

    d) LTP:long term prediction, main profile + forward prediction

    e)HE-AAC: high efficiency AAC,又叫aacPlus,使用SBR,可能使用PS.AAC + SBR(Spectral Band Replication)aacPlusv1, AAC + SBR + PS(Parametric Stereo)aacPlus v2.  如图所示:

    其中,aacPlus v1已被运动图像专家组MPEG指定为其标准MPEG-4 HE AAC.

    1.2 AAC的编码器

    a) FhG Fraunhofer IIS研发的权威编码器,拥有很好的音质,不对外开放。

    b) Nero AAC可能是目前最完美的AAC编码器了,同时支持"LC AAC/HE AAC"规格,Nero AAC编码器提供了品质最好的"VBR LC AAC"格式,同时亦对面"HE AAC"规格保证了在低码率下也有良好的表现,千千静听 + Nero插件,就可以编码AAC文件了,我当初就这么做测试向量的,哈哈。

    c) QuickTime/iTune Apple公司的两款Media软件都提供了AAC编码功能,其编码技术来自“DolbyLaboratories”,是目前音质最好的中码编率编码器,它编码的48kbps立体声音质比其它AAC编码器好20 - 25%,甚至64 kbps的Dolby AAC音效可媲美128 kbps的MP3。

    d) FAAC:免费,开源,郑重推荐。

    1.3 文件后缀名

    用aac编码的文件可能使用这三种后缀名:aac,m4a,mp4.

    AAC:以aac为后缀的文件无文件头,由一些列的帧组成文件,帧头分ADIF和ADTS两种。

    M4A:用MP4作为container,这种MP4文件里面只有音频帧,无视频帧。由MP4文件头+一系列的帧组成,帧头比AAC为后缀的文件要短。所以在保持压缩数据不变的情况下,将AAC转为M4A,文件会小一些,因为每帧省几个字节,合起来省下的字节数通常比MP4文件头还大。

    MP4:可以同时有视频帧和音频帧,也可以只有音频或视频帧。

    注:在下面的1.5节中,会详细说一下AAC为后缀的文件格式,MP4 container的格式可以参照我的另一篇文章,MPEG4-Part14 -- MP4 file format。

    1.4 编码工具推荐

    FAAC 和 千千静听+nero插件

    1.5 File format specification--以aac为后缀名的文件格式

    AAC没有文件头,由帧序列组成。一共有2种格式的帧头,ADTS和ADIF。一个文件中通常不会2种帧共存,并且大多数AAC文件包含的帧为    ADTS。

    ADIF:Audio Data Interchange Format 音频数据交换格式。这种格式的特征是可以确定的找到这个音频数据的开始,不需进行在音频数据流中间开始的解码,即它的解码必须在明确定义的开始处进行。故这种格式常用在磁盘文件中。

    ADTS:Audio Data Transport Stream 音频数据传输流。这种格式的特征是它是一个有同步字的比特流,解码可以在这个流中任何位置开始。

    //以下对文件格式说明使用的表格来自ISO-IEC-13818-7

    1.5.1 ADIF

    ADIF的帧序列按如下方式组成一个文件:

    Table 2– Syntax of adif_sequence()

    Syntax

    No. of bits

    Mnemonic

    adif_sequence()

    {

    adif_header();

    byte_alignment();

    raw_data_stream();

    }

    其中Header结构如下:

    Table 3 – Syntax of adif_header()

    Syntax

    No. of bits

    Mnemonic

    adif_header()

    {

    adif_id;

    32

    bslbf

    copyright_id_present;

    1

    bslbf

    if (copyright_id_present) {

    copyright_id;

    72

    bslbf

    }

    original_copy;

    1

    bslbf

    home;

    1

    bslbf

    bitstream_type;

    1

    bslbf

    bitrate;

    23

    uimsbf

    num_program_config_elements;

    4

    bslbf

    if (bitstream_type == ‘0’) {

    adif_buffer_fullness;

    20

    uimsbf

    }

    for (i = 0; i < num_program_config_elements + 1; i++) {

    program_config_element();

    }

    }

    1.5.2 ADTS

    ADTS文件有帧序列组成,如下表所示:

    Table 4 – Syntax of adts_sequence()

    Syntax

    No. of bits

    Mnemonic

    adts_sequence()

    {

    while (nextbits() == syncword) {

    adts_frame();

    }

    }

    每帧除去最前面的同步字后,结构如下:

    Table 5 – Syntax of adts_frame()

    Syntax

    No. of bits

    Mnemonic

    adts_frame()

    {

    adts_fixed_header();

    adts_variable_header();

    if (number_of_raw_data_blocks_in_frame == 0) {

    adts_error_check();

    raw_data_block();

    }

    else {

    adts_header_error_check();

    for (i = 0; i <= number_of_raw_data_blocks_in_frame; i++) {

    raw_data_block();

    adts_raw_data_block_error_check();

    }

    }

    }

    其中,ADTS头分两部分,固定头和可变头,固定头每帧一样,可变头帧与帧可以不同。

    Table 8 – Syntax of adts_fixed_header()

    Syntax

    No. of bits

    Mnemonic

    adts_fixed_header()

    {

    syncword;

    12

    bslbf

    ID;

    1

    bslbf

    layer;

    2

    uimsbf

    protection_absent;

    1

    bslbf

    profile;

    2

    uimsbf

    sampling_frequency_index;

    4

    uimsbf

    private_bit;

    1

    bslbf

    channel_configuration;

    3

    uimsbf

    original/copy;

    1

    bslbf

    home;

    1

    bslbf

    }

    Table 9 – Syntax of adts_variable_header()

    Syntax

    No. of bits

    Mnemonic

    adts_variable_header()

    {

    copyright_identification_bit;

    1

    bslbf

    copyright_identification_start;

    1

    bslbf

    frame_length;

    13

    bslbf

    adts_buffer_fullness;

    11

    bslbf

    number_of_raw_data_blocks_in_frame;

    2

    uimsfb

    }

    2 解码流程

    to be continued....

    展开全文
  • standardmidifileformatwww.EC66.comdustincaldwellthestandardmidifileformatisaverystrangebeast.whenviewedasawhole,itcanbequiteoverwhelming.ofcourse,nomatterhowyoulookatit,...
  • 1、新接口 (1)Base64编码 from base64 import b64encode data_bin=b'Winter to spring be far behind.’ b64encode(data_bin,altchars=None) #返回b'V2ludGVyIHRvIHNwcmluZyBiZSBmYXIgYmVoaW5kLg==' #备选参数...
  • 导包并设置csv文件目录等 import pandas as pd import os # 根据需要修改以下部分 path = os.path.abspath('自己的文件路径') # 文件夹路径 filename_extenstion = '.csv' # 文件后缀 new_file_name = 'data.csv' #...
  • 1.2 Data Object Data Packet 0 Data Packet 1 …… Data Packet N Data Packet’s length is fixed. Data Packets are devided based on the time. 1.3 Index Object(skiped) 2 解码原理及流程 3 附录
  • int read(byte[] data):一次读取多个字节,最多读取data.length个,把读取的数据放到data中,从data[0]开始存储,如果流中没有data.length个,那么有几个读取几个,返回实际读取的字节的个数。如果流中没有数据了...
  • Trying to decode gzip compressed and base64 encoded data to a readable format in Python3.4.import base64import zliboriginal_data = '...jU2X0NCQ19TSEEAAAABAAA=' #Data cut short.decoded64 = base64.b...
  • } 2.2 加密部分 //给文件加密的函数 BOOL CEcfileDlg::ecfile(LPCTSTR fpath) { char *data; CFile *file; DWORD flen; m_password = epass(); file = new CFile; if ( !file->Open(fpath, CFile::shareDenyNone|...
  • 用DataFrame合并Series # pd.DataFrame(data,index) # 如果Series表示的是一个人的一行数据,那么生成DataFrame的时候使用[] pd.DataFrame([Tom,Jerry]) 2、使用字典创建{} Chinese = pd.Series([88,78,90],index=['...
  •  第一次接触到TFrec文件,我也是比较蒙蔽的其实: 可以看到文件是.tfrec后缀的,而且先记住这个文件是186.72MB大小的。 1 为什么用tfrec文件 正常情况下我们用于训练的文件夹内部往往会存着成千上万的图片或文本等...
  • .jsv,.jspf Coldfusion:.cfm,.cfml,.cfc,.dbm 另外可以配合操作系统的文件命名规则: .php.,.php空格,.php:1.jpg,.php::$DATA等 这些后缀的文件会被windows系统自动去掉不符合规则符号后面的内容,从而只留下.php。...
  • asterix/.git/COMMIT_EDITMSGasterix/.git/configasterix/.git/descriptionasterix/.git/FETCH_HEADasterix/.git/HEADasterix/.git/hooks/applypatch-msg.sampleasterix/.git/hooks/commit-msg.sampleasterix/.git/h...
  • 4.multipart/form-data 窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分,上传附件用到。在使用包含文件上传控件的表单时,必须使用该值。 5.application/json 数据以json形式进行编码。 6....
  • 目录下有一个20多MB的*.data文件,那所谓的安装程序,也就是把这个文件解压吧。 用WinHEX看了一下文件内容,不是什么常规的zip,rar,7z等文件格式,是一种自定义的文件结构。 作为一名程序猿!能被这种安装程序...
  • 比如在data中声明的show1、show2、show3、show4,会有场景使用时是showX需要 需要用到一个变量去赋值1、2、3、4… let index = 1/2/3/4 this[`show${index}`]
  • Python 规范化LinkedIn用户的联系人所在公司后缀data normalization)
  • 描述 我们熟悉的表达式如a+b、a+b*(c+d)等都属于中缀表达式。...ACM队的“C小加”正在郁闷怎样把一个中缀表达式转换为后缀表达式,现在请你设计一个程序,帮助C小加把中缀表达式转换成后缀表达式。为简化问题,操...
  • 在使用Berkely db数据库时可以将所有的日志文件和数据库文件全部存入进这个文件里面,不知道是不是任意格式名的文件都可以存储Berkely db数据库的所有文件
  • default1.jpg map[Content-Disposition:[form-data; name="image1"; filename="default1.jpg"] Content-Type:[application/octet-stream]] 45814 转载于:https://www.cnblogs.com/cdyboke/p/7345066.html
  • 最后发现是密码文件有.ora后缀导致的。应该是orcle不人性的一个地方或者一个bug吧。   主备库上分别重建下密码文件,一切正常了: Java代码 [oracle @master  bdump]$ rm $ORACLE_...
  • copy源表空间对应的文件到目标服务器上 --7,在目标服务器上执行导入 --transport_datafiles表示从源数据库服务器上拷贝过来的数据文件路径,逗号隔开,最好拷贝到希望存放的地方 impdp "'system/abc123 as sysdba'" ...
  • 后缀算法

    2019-03-20 21:29:00
    #include<iostream>using namespace std;#include<malloc.h>#include<...#define MaxSize 50typedef struct{ char data[MaxSize]; int top;}A;void InitStack(A *&L){ L=(A *)m...
  • 数据文件的后缀

    千次阅读 2015-12-14 19:53:30
    路径加对了,但是数据文件的后缀名加错了! 原来的数据文件名: +data/datafile/xxxxxx.dat 我加的数据文件: +data/datafile/xxxxxx.dbf 业务不会就这样跪了吧???? 果断做了测试: 创建一个包含.
  • ect file (dBASE Application Generator).bch datafile (Datalex EntryPoint 90).bco outline font description (Bitstream).bcp Borland C++ makefile.bdf Bitmap Distribution Format font file (X11).bdf datafil...
  • 批量添加后缀

    2020-12-24 23:03:42
    python中经常遇到非常多变量有规律的添加后缀,这...ret_data ={ 'board1': { 'total_paying': {'num': 0, 'rate_day': 0, 'rate_week': 0, }, # 总付费人数 {num:人数,rate_day:环比,rate_week:周环比} 'trainin
  • 今天看到生产系统表空间99了,果断给...原来的数据文件名:+data/datafile/xxxxxx.dat我加的数据文件:+data/datafile/xxxxxx.dbf业务不会就这样跪了吧????果断做了测试:创建一个包含.dbf和.dat的表空间,并在该...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,740
精华内容 1,096
关键字:

data后缀