文件上传漏洞 | 您所在的位置:网站首页 › 202009/W020200910601586071158.jpg › 文件上传漏洞 |
前言:之前在DVWA靶场上了解了upload文件上传漏洞,并进行了学习,现在来安装upload-labs来打一下靶场。 本文目录 搭建靶场开始闯关Pass-01Pass-02Pass-03黑名单验证普通方法使用burpsuite爆破黑名单 Pass-04Pass-05Pass-06Pass-07Pass-08Pass-09Pass-10Pass-11Pass-12 %00截断GetPass-13 00截断POSTPass-14图片马Pass-15Pass-16Pass-17二次渲染 搭建靶场phpstudy集成环境。 upload-labs项目地址upload-labs,下载压缩包解压到本地phpstudy的www文件夹下,将文件夹命名为upload-labs(个人选择),也可以不改。 打开phpstudy,开启环境在浏览器中访问127.0.0.1/upload-labs就可以进入靶场。 第一步查看源码 function checkFile() { var file = document.getElementsByName('upload_file')[0].value; if (file == null || file == "") { alert("请选择要上传的文件!"); return false; } //定义允许上传的文件类型 var allow_ext = ".jpg|.png|.gif"; //提取上传文件的类型 var ext_name = file.substring(file.lastIndexOf(".")); //判断上传文件类型是否允许上传 if (allow_ext.indexOf(ext_name + "|") == -1) { var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name; alert(errMsg); return false; } }可以看出可以传入的是.jpg/.png/,gif类型的图片。因为第一关嘛,限制比较简单,有以下几种方法。 1.禁用js 谷歌浏览器禁用js,可以百度搜索,不再多说。 火狐浏览器推荐一个插件noscript,禁用js后就可以上传php文件了。 2.burp抓包修改后缀, 先将要上传的shell.php后缀改成图片格式,比如jpg。 然后上传,抓包,修改回shell.php放包。上传成功。 3.直接传图片马 Pass-02查看源码 $is_upload = false; $msg = null; if (isset($_POST['submit'])) { if (file_exists(UPLOAD_PATH)) { if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) { $temp_file = $_FILES['upload_file']['tmp_name']; $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name'] if (move_uploaded_file($temp_file, $img_path)) { $is_upload = true; } else { $msg = '上传出错!'; } } else { $msg = '文件类型不正确,请重新上传!'; } } else { $msg = UPLOAD_PATH.'文件夹不存在,请手工创建!'; } }这个是对Content-type的MIME类型进行限制。 在DVWA中尝试过了已经, 抓包,对Content-type进行修改,改为image/jpeg或者其他两种类型。不再赘述。 Pass-03黑名单验证 普通方法查看源码 $is_upload = false; $msg = null; if (isset($_POST['submit'])) { if (file_exists(UPLOAD_PATH)) { $deny_ext = array('.asp','.aspx','.php','.jsp'); $file_name = trim($_FILES['upload_file']['name']); $file_name = deldot($file_name);//删除文件名末尾的点 $file_ext = strrchr($file_name, '.'); $file_ext = strtolower($file_ext); //转换为小写 $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA $file_ext = trim($file_ext); //收尾去空 if(!in_array($file_ext, $deny_ext)) { $temp_file = $_FILES['upload_file']['tmp_name']; $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext; if (move_uploaded_file($temp_file,$img_path)) { $is_upload = true; } else { $msg = '上传出错!'; } } else { $msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!'; } } else { $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!'; } }这个原本不知道该怎么操作,看了大佬的博客才知道了这个是黑名单过滤,服务器把后缀为.asp .aspx .php .,jps 的文件给过滤了,要想办法绕过这些。可以上传其他任意后缀。比如说:.phtml .phps .php5 .pht,但如果上传的是.php5这种类型文件的话,如果想要被当成php执行的话,前提条件是Apache的httpd.conf有如下配置代码 AddType application/x-httpd-php .php .phtml .php5 .pht .phps让Apache能够解析这些后缀的文件。 配置路径 D:\phpStudy\PHPTutorial\Apache\conf我的是phpstudy集成环境,所以在phpstudy目录下。找到(httpd.conf)这个文件打开 了解到一种方法,可能比较少见,现在分享一下 不改名,直接上传php文件 这一关,传phtml文件不行了,也被加入了黑名单,所以先查看下源码, 查看源码: $is_upload = false; $msg = null; if (isset($_POST['submit'])) { if (file_exists(UPLOAD_PATH)) { $deny_ext = array(".php",".php5",".php4",".php3",".php2",".php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".ini"); $file_name = trim($_FILES['upload_file']['name']); $file_name = deldot($file_name);//删除文件名末尾的点 $file_ext = strrchr($file_name, '.'); $file_ext = strtolower($file_ext); //转换为小写 $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA $file_ext = trim($file_ext); //收尾去空 if (!in_array($file_ext, $deny_ext)) { $temp_file = $_FILES['upload_file']['tmp_name']; $img_path = UPLOAD_PATH.'/'.$file_name; if (move_uploaded_file($temp_file, $img_path)) { $is_upload = true; } else { $msg = '上传出错!'; } } else { $msg = '此文件不允许上传!'; } } else { $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!'; } }好多被限制的额,但是没有限制.htaccess文件。然后就可以上传这个文件。 这之前,需要进行一些改动,在apache解析那个文件中,检查mod_write模块是否开启,还有AllowOverride All 先上传一个1.htaccess文件, AddType application/x-httpd-php .jpg然后上传shell.jpg就可以尝试用蚁剑菜刀等工具连接了。 伤心事一笔带过。=_= Pass-05这个再上传htaccess文件已经不可以了,也被过滤了,所以看看源码。 呃呃呃,我发现这个是大小写过滤,,,怎么到后面来了, 这个就是将shell.php上传抓包改后缀为Php就可以绕过了。 Pass-07空格绕过,这个在shell.php后加个空格就OK了, 抓包改成shell.php上传。 Pass-08点过滤,抓包,修改后缀为shell.php.,即可进行点过滤。 Pass-09::$DATA绕过, 在php+windows的情况下:如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名.且保持"::$DATA"之前的文件名。利用windows特性,可在后缀名中加” ::$DATA”绕过 这是网上的大佬给的解释,简单明了。容易理解。 还是抓包修改 eeee,第十关好像跟第五关一样了,??? 查看源码可以看出,这里使用了替换函数。
然后改为图片格式的后缀。 上传……
继续上传刚才的图片马(上一关上传的我已经删除了) 成功了,测试连接,也可以 已久传了我百传不厌的“图片”,发现依旧管用。 这一关有所变化, 就可以生成图片马了。 上传…… 到此先停下,这个二次渲染已经不会了,后面的也先不看了。看不定还浪费时间。等水平提高一点了再把这个靶场过完。 文末寄语: 有时想想,独居斗室和天涯浪迹好像是一件事情,身处寂寞和身处喧嚣其实也没什么两样,身外的整个世界都是镜子,我们必须自己认得自己。 ——马良《人间卧底》 |
CopyRight 2018-2019 实验室设备网 版权所有 |