前言

​ 这次彻底的从头到尾分析了一下源码的执行过程,大致的写一下,以防以后再看的时候不知道题目是什么情况。

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {if (file_exists(UPLOAD_PATH)) {//这里下面是过滤$deny_ext = array(".php",".php5",".php4",".html", ......);$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 . '文件夹不存在,请手工创建!';}
}

过滤部分:

  • $deny_ext是一个过滤的后缀数组,只要是在里面的后缀都是被禁止上传的。

  • $file_name = trim($FILES['upload_file']['name'])这段代码有两个点需要说:

    1. $FILES['upload_file']['name']是获取上传文件的名称,PHP中$FILES是一个预定义的数组,用来获取通过 POST 方法上传文件的相关信息。如果为单个文件上传,那么 $FILES 为二维数组;如果为多个文件上传,那么 $FILES 为三维数组。贴一个参考的博客:PHP $_FILES函数详解。
    2. trim()函数的作用就是去除文件名称前后的空格换行符等。
  • $file_name = deldot($file_name)这个注释中很清楚,是删除文章末尾的点。

  • $file_ext = strrchr($file_name, '.')strrchr(string s1,char c1)函数查找字符或字符串c1在另一个字符串s1中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。说白了就是获取文件的后缀名。

  • $file_ext = strtolower($file_ext)注释上转换小写。

  • $file_ext = str_ireplace('::$DATA', '', $file_ext)去除字符串::$DATA。第八题讲了原理

上传部分:

  • in_array($file_ext, $deny_ext)判断文件的后缀(第一个参数)是不是在黑名单数组(第二个参数)中。
  • $_FILES['upload_file']['tmp_name']文件被上传后在服务端储存的临时文件名,一般是系统默认。可以在php.ini的upload_tmp_dir 指定。
  • $img_path = UPLOAD_PATH.'/'.$file_name这个变量是设置需要保存到的路径
  • move_uploaded_file($temp_file, $img_path)本函数检查并确保指定的文件(第一个参数)是合法的上传文件(即通过 PHP 的 HTTP POST 上传机制所上传的)。如果文件合法,则将其移动为由指定的文件路径(第二个参数)。

Pass-06

源码:

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {if (file_exists(UPLOAD_PATH)) {$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".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",".htaccess");$file_name = $_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);//去除字符串::$DATAif (!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 = '此文件不允许上传';}} else {$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';}
}

​ 看源码发现少了trim()函数对文件名前后的空格处理,所以我们可以在上传文件时在后缀名后面添加空格使其成为.php (有空格)绕过黑名单数组。

​ 上传以后访问文件执行成功。完工

​ 这里说明一下,我前面是在BUUCTF在线靶场上做的linux环境下的题目,但是这道题用了上面的方法怎么都访问不到,所以我在本地windows环境上搭建了一个靶机进行上传(而且后面有道题必须是在windows环境下才可以通过)。在github上下载的源码题目比在线靶场上的题目多了一道,对应的题目为 在线靶机pass-06–>github下载的pass-07。默认使用的都是linux环境下的题目,有改变会提前说明。

Pass-07

源码:

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {if (file_exists(UPLOAD_PATH)) {$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".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",".htaccess");$file_name = trim($_FILES['upload_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 . '文件夹不存在,请手工创建!';}
}

​ 这道题少了删除文件名末尾的点,我们可以通过构造2333.php. .(末尾加 点 空格 点),被解析后文件后缀就会成为". "(一个点一个空格),可以绕过黑名单,访问的文件名是2333.php. .

​ 我又参考了其他博客,讲到windows环境下可以利用系统会自动删除后缀中最后的一个".",尝试在windows靶机上测试只添加一个点,访问的文件名为2333.php、2333.php.都可以,因为windows会删除最后一个点。

​ 两种方式第一个在linux环境下的php服务器上,第二个在windows环境下的php服务器上,上传后都可以成功访问文件。完工

Pass-08

源码:

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {if (file_exists(UPLOAD_PATH)) {$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".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",".htaccess",".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 = 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 = '此文件类型不允许上传!';}} else {$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';}
}

​ 审查代码发现少了对::$DATA字符串的处理,这里就要用到前面提到的windows环境了,贴一下原理:

php在window的时候如果文件名+"::DATA"会把::DATA"会把::DATA"会把::DATA之后的数据当成文件流处理,不会检测后缀名.且保持"::$DATA"之前的文件名

​ 直接上传的时候抓包在文件名后面添加::$DATA

​ 上传访问。完工

Pass-09

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {if (file_exists(UPLOAD_PATH)) {$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".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",".htaccess");$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 . '文件夹不存在,请手工创建!';}
}

​ 这次题目和第七题差不多,代码会先剔除文件名前后的空格,然后删除末尾的点,再通过strrchr()函数截取后缀名转换小写。

​ 所以和第七题一样构造2333.php. .(末尾加 点 空格 点),被处理后的文件名后缀就成了一个点".",铁定不在黑名单后缀里,实现绕过后缀检查。

​ 但是这道题只能使用windows环境,因为执行了deldot()函数删除了最后一个点之后,文件名成了2333.php.,而linux环境下因为不会自动删除最后一个点而不能访问成功。

​ 图前面有了就不贴了。

Pass-10

源码:

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {if (file_exists(UPLOAD_PATH)) {$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");$file_name = trim($_FILES['upload_file']['name']);$file_name = str_ireplace($deny_ext,"", $file_name);$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 = UPLOAD_PATH . '文件夹不存在,请手工创建!';}
}

​ 这道题和前面不同的是$file_name = str_ireplace($deny_ext,"", $file_name),对于这个函数:str_ireplace(find,replace,string,count),find是要查找的值,replace是要替换成的值,string是被搜索的字符串,count 可选。一个变量,对替换数进行计数。所以这行代码的作用就是把文件名中所有包含在黑名单后缀里的字符串替换成空串,但是这个函数只会执行一次,所以我们可以构造一个双写绕过,即构造文件名2333.pphphp,只有一个"php"字符串被匹配到并被替换成空串,剩下的文件名就成了2333.php

上传并访问文件。完工

Upload-Labs(6-10)相关推荐

  1. Upload labs

    Pass -01(js检查) 题目基于前端js过滤,只能上传图片格式的文件,所以我们用一句话木马,改后缀上传后,用burp抓包,修改文件后缀为php,然后用蚁剑连接, 注意: 文件没有上传在具体题目中 ...

  2. (白帽子学习笔记)前渗透——文件上传upload labs

    读者需知 1.本文仅供学习使用,由于传播和利用此文所造成的损失均由使用者本人负责,文章作者不为此承担责任 2.本文参考了一些文章,如有侵权请联系本人删除 第一关--前端验证 1.将浏览器中的JS代码禁 ...

  3. upload -labs通关解析及上传类型总结和思考

    Pass-01(客户端JS绕过) 客户端JS判断方法:上传一个php文件,用bp抓包,如果没抓到包就弹框说不能上传,就说明是客户端JS检测 客户端JS绕过方法: 方法一: 上传一个图片马格式为jpg, ...

  4. Upload LABS Pass-10

    第十关在后端使用了黑名单 , 将匹配到的后缀名替换为空,使文件不能使用 , 但其只过滤了一遍 , 我们可以使用双写后缀名的方式绕过黑名单 准备一个 10.pphphp 文件 , 内容为一句话木马 &l ...

  5. Upload LABS Pass-11

    第十一关在服务端使用了白名单 , 但文件保存路径外漏 , 可以使用00截断 准备一个 11.php 文件 , 内容为一句话木马 <?php eval($_POST[-7]);?> 上传 1 ...

  6. Upload LABS Pass-9

    第九关在后端使用了黑名单,并过滤了大小写,空格,点以及数据流 , 但未对文件重命名并且只过滤了一遍点和空格 , 我们在文件后缀名添加 点空格点 , 来绕过黑名单 准备一个 9.php 文件 , 内容为 ...

  7. Upload LABS Pass-8

    第八关在后端使用了黑名单 , 并过滤了大小写,点以及空格 , 但并未过滤数据流 , 我们使用代理拦截请求,在文件后缀名中添加数据流,绕过黑名单 准备一个 8.php 文件 , 内容为一句话木马 < ...

  8. Upload LABS Pass-7

    第七关在后端使用了黑名单 , 并过滤了大小写,空格 , 但未过滤点 , 我们使用代理拦截请求,将后缀名添加点. , 来绕过黑名单 准备一个 7.php 文件 , 内容为一句话木马 <?php e ...

  9. Upload LABS Pass-6

    第六关在后端使用了黑名单 , 并过滤了大小写和点 , 但未过滤空格 , 我们使用代理抓包在后缀名中添加空格,即可绕过黑名单 准备一个 6.php 文件 , 内容为一句话木马 <?php eval ...

  10. Upload LABS Pass-5

    第五关在后端使用了黑名单 , 并过滤了空格,点 , 但未过滤大小写 , 我们修改文件后缀大小写来绕过黑名单 准备一个 5.PHP 文件 , 内容为一句话木马 <?php eval($_POST[ ...

最新文章

  1. mysql 5.7 修改root 密码
  2. 线上学python哪家好-广州学Python学校哪家好
  3. 配置Eureka高可用
  4. (转载)机器学习知识点(十七)Bagging与随机森林算法原理小结
  5. linux编译ace,Linux下编译ACE
  6. 深入OKHttp源码分析(二)----OkHttp任务调度核心类Dispatcher解析
  7. jquery mobile页面切换效果(Flip toggle switch)(注:jQuery移动使用的数据属性的列表。 )...
  8. Speerio Skinergy 'Image' is ambiguous 错误
  9. adrms移动设备扩展插件_如何在所有移动设备上扩展网站
  10. 工程数学(数值分析)第二讲:非线性方程求根
  11. 在 Ubuntu 14.04 中安装 Pepper Flash Player For Chromium-转
  12. JavaScript Date时间对象
  13. 人人商城前端小程序如何配置使用教程
  14. php 邮箱反垃圾机制,企业邮箱中的反垃圾邮件规则
  15. python 爬取财经新闻_python爬取路透社财经新闻
  16. JavaSE第二阶段之面向对象编程
  17. 对象、继承、封装、多态、抽象类的组合应用:编写工资系统,实现不同类型员工(多态)的按月发放工资。如果当月出现某个Employee对象的生日,则将在该雇员的工资上增加100元发给他。
  18. 36 选 7 彩票机选程序
  19. PhotonServer中日志的配置
  20. Laravel Provider用法

热门文章

  1. LeetCode 540. Single Element in a Sorted Array
  2. ubuntu 16.04 apache 开启Rewrite功能
  3. mysql服务的关闭与启动
  4. 异常的产生与传递 java 1615309080
  5. 如何制作歌单 0202 winform
  6. 07 熟练使用Console类实现从控制台输入输出数据 1214
  7. flask-应用对象的初始化参数
  8. vmware-设置共享文件夹
  9. 理解*arg 、**kwargs
  10. passive 的事件监听器