文章目录

  • 前言:
  • Less-11(get型 %00截断)
  • Less-12(post型 00截断)
  • Less-13(图片马绕过)
  • Less-14(getimagesize检测)
  • Less-15(exif_imagetype图片马)
  • Less-16(二次渲染绕过)
  • Less-17(条件竞争)
  • Less-18(条件竞争)
  • Less-19(post型 00截断)

前言:

接着上篇的总结 (= ̄ω ̄=) 上篇链接:点这


Less-11(get型 %00截断)

这关采用的防御手法是白名单过滤,只允许上传jpg、png和gif类型,并且将上传的文件给重命名为了白名单中的后缀。

查看源码:

    $is_upload = false;$msg = null;if(isset($_POST['submit'])){$ext_arr = array('jpg','png','gif');$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);if(in_array($file_ext,$ext_arr)){$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;if(move_uploaded_file($temp_file,$img_path)){$is_upload = true;} else {$msg = '上传出错!';}} else{$msg = "只允许上传.jpg|.png|.gif类型文件!";}}

处理上传文件的方式

$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

看起来这样防御并没有什么问题,但是这一关的上传目录是可控的,所以可以先上传一个后缀名为.jpg,然后修改上传目录为.php后缀,之后在.php后,截断后面的拼接内容。注意这里需要关掉magic_quotes_gpc这个php扩展,否则00会被转义。

$_GET['save_path']这里使用00截断."/".rand(10, 99).date("YmdHis").".".$file_ext;

截断的条件:

  1. php版本必须小于5.3.4
  2. 打开php的配置文件php-ini,将magic_quotes_gpc设置为Off

关闭 magic_quotes_gpc 函数:在php.ini文件内找到 magic_quotes_gpc = On 将其改为 magic_quotes_gpc = Off



配置好后,上传 shell.jpg,抓包,添加shell.php%00

上传成功。

Less-12(post型 00截断)

和 Less-11不同,这关的save_path是通过 post 传进来的,我们还利用00截断,但这题需要在十六进制中进行修改,因为post不会像get对%00进行自动解码。

步骤:上传 webshell.jpg 然后 send to repeater

添加文件 wenshell.php(空格)

空格的十六进制为20然后找到20 改为00

然后点击send 发包就好了

发包成功。

Less-13(图片马绕过)

PS:这关需要将服务器版本改到PHP5.3及以上才行,不然运行文件包含漏洞会报错

查看源码:

function getReailFileType($filename){$file = fopen($filename, "rb");$bin = fread($file, 2); //只读2字节fclose($file);$strInfo = @unpack("C2chars", $bin);    $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);    $fileType = '';    switch($typeCode){      case 255216:            $fileType = 'jpg';break;case 13780:            $fileType = 'png';break;        case 7173:            $fileType = 'gif';break;default:            $fileType = 'unknown';}    return $fileType;
}
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){$temp_file = $_FILES['upload_file']['tmp_name'];$file_type = getReailFileType($temp_file);if($file_type == 'unknown'){$msg = "文件未知,上传失败!";}else{$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$file_type;if(move_uploaded_file($temp_file,$img_path)){$is_upload = true;} else {$msg = "上传出错!";}}
}

发现主要是取上传文件的头两个字节判断文件类型,因此直接上传图片马即可;

图片马制作方法:

copy 1.jpg /b + shell.php /a webshell.jpg

解释:参数/b指定以二进制格式复制、合并文件(图片),参数/a指定以ASCII格式复制、合并文件(php文件)。

制作成功

然后直接上传

上传成功,得到文件名,如果是上传的是一句话木马就能连接菜刀了;但我们上传的是图片马,可以利用文件包含漏洞进行测试。

先新建一个包含文件漏洞的页面upload.php,将该文件放在根目录下:

<?php
$file = $_GET[ 'page' ];
include($file);
?>

测试使用,包含成功

http://127.0.0.1/upload-labs-master/upload/include.php?page=文件名


另外有时候对文件大小也有限制,所以绕过文件幻数最合适的方式是利用16进制编辑器自己制作一个伪图片马,这里利用winhex创建shell.jpg伪图片马

Less-14(getimagesize检测)

查看关键代码:

$types = '.jpeg|.png|.gif';if(file_exists($filename)){$info = getimagesize($filename);$ext = image_type_to_extension($info[2]);1234

这里用 getimagesize 获取文件类型,还是直接就可以利用图片马就可进行绕过,绕过方法同Less13 ,这里就不演示了。

补充:

getimagesize() 函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型和一个可以用于普通 HTML 文件中 IMG 标记中的 height/width 文本字符串。

Less-15(exif_imagetype图片马)

关键源码:

function isImage($filename){//需要开启php_exif模块$image_type = exif_imagetype($filename);switch ($image_type) {case IMAGETYPE_GIF:return "gif";break;case IMAGETYPE_JPEG:return "jpg";break;case IMAGETYPE_PNG:return "png";break;    default:return false;break;}
}

利用php_exif模块判断文件类型,还是直接利用图片马就可以绕过。(查看下你的php_exif模块是否打开,没有的话就勾上)

然后直接上传图片马,仍和 less-13一样

上传成功。

Less-16(二次渲染绕过)

查看源码:

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])){// 获得上传文件的基本信息,文件名,类型,大小,临时文件路径$filename = $_FILES['upload_file']['name'];$filetype = $_FILES['upload_file']['type'];$tmpname = $_FILES['upload_file']['tmp_name'];$target_path=UPLOAD_PATH.'/'.basename($filename);// 获得上传文件的扩展名$fileext= substr(strrchr($filename,"."),1);//判断文件后缀与类型,合法才进行上传操作if(($fileext == "jpg") && ($filetype=="image/jpeg")){if(move_uploaded_file($tmpname,$target_path)){//使用上传的图片生成新的图片$im = imagecreatefromjpeg($target_path);if($im == false){$msg = "该文件不是jpg格式的图片!";@unlink($target_path);}else{//给新图片指定文件名srand(time());$newfilename = strval(rand()).".jpg";//显示二次渲染后的图片(使用用户上传图片生成的新图片)$img_path = UPLOAD_PATH.'/'.$newfilename;imagejpeg($im,$img_path);@unlink($target_path);$is_upload = true;}} else {$msg = "上传出错!";}}else if(($fileext == "png") && ($filetype=="image/png")){if(move_uploaded_file($tmpname,$target_path)){//使用上传的图片生成新的图片$im = imagecreatefrompng($target_path);if($im == false){$msg = "该文件不是png格式的图片!";@unlink($target_path);}else{//给新图片指定文件名srand(time());$newfilename = strval(rand()).".png";//显示二次渲染后的图片(使用用户上传图片生成的新图片)$img_path = UPLOAD_PATH.'/'.$newfilename;imagepng($im,$img_path);@unlink($target_path);$is_upload = true;               }} else {$msg = "上传出错!";}}else if(($fileext == "gif") && ($filetype=="image/gif")){if(move_uploaded_file($tmpname,$target_path)){//使用上传的图片生成新的图片$im = imagecreatefromgif($target_path);if($im == false){$msg = "该文件不是gif格式的图片!";@unlink($target_path);}else{//给新图片指定文件名srand(time());$newfilename = strval(rand()).".gif";//显示二次渲染后的图片(使用用户上传图片生成的新图片)$img_path = UPLOAD_PATH.'/'.$newfilename;imagegif($im,$img_path);@unlink($target_path);$is_upload = true;}} else {$msg = "上传出错!";}}else{$msg = "只允许上传后缀为.jpg|.png|.gif的图片文件!";}
}

通过源码可以看到对文件后缀名和 MIME 类型进行了检查,而且用到了php的imagecreatefromjpegimagecreatefrompngimagecreatefromgif这几个图片处理函数对上传的图片进行了二次渲染生成了新的图片,所以如果在这里上传的是一个普通的图片马,虽然图片马可以上传成功,但是上传的图片马在经过二次渲染后,图片尾部的php代码就会被删除掉,所以在这里不能使用直接在图片尾部添加一句话木马的方式去合成图片马。

但是这一关的代码有一个明显的逻辑漏洞,如果这几个二次渲染函数处理的不是一个图片,就会使这几个函数报错,因为这几个二次渲染的函数只会去处理一个图片内部格式正确的图片,所以在这里只需要上传一个后缀名为jpg、png、gif的一句话木马,这样的话上传的一句话木马会绕过后缀名和 MIME 类型的检查,通过move_uploaded_file上传至服务器,但是遇到二次渲染时,由于上传的不是一个真正的图片,所以二次渲染函数在处理时会因为图片的内部格式报错,从而突破了对图片的二次渲染,这时候页面虽然会显示图片格式不允许,但是上传的一句话木马已经上传到了服务器

上传后缀名为jpg、png、gif的图片马:
可以看到上传成功,但是我的并没有成功解析;

wenHex打开发现并查找不到我们的木马

无奈 翻翻大佬们的blog发现是在二次渲染的时候被替换了,至于解决办法请看这位大佬写的点这我就不再描述(●’◡’●)

Less-17(条件竞争)

本关考察的是条件竞争,查看代码:

$is_upload = false;
$msg = null;if(isset($_POST['submit'])){$ext_arr = array('jpg','png','gif');$file_name = $_FILES['upload_file']['name'];$temp_file = $_FILES['upload_file']['tmp_name'];$file_ext = substr($file_name,strrpos($file_name,".")+1);$upload_file = UPLOAD_PATH . '/' . $file_name;if(move_uploaded_file($temp_file, $upload_file)){if(in_array($file_ext,$ext_arr)){$img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;rename($upload_file, $img_path);$is_upload = true;}else{$msg = "只允许上传.jpg|.png|.gif类型文件!";unlink($upload_file);}}else{$msg = '上传出错!';}
}

这题我是蒙蔽的,好在看了大佬的操作才后知道了些;这里先将文件上传到服务器,然后判断文件后缀是否在白名单里,如果在则重命名,否则删除,因此我们可以上传 webshell 只需要在它删除之前访问即可。可以利用burp的intruder模块不断上传,然后我们不断的访问刷新该地址。

  • unlink() 函数是用来删除文件的

  • 什么是条件竞争:

条件竞争漏洞是一种服务器端的漏洞,由于服务器端在处理不同用户的请求时是并发进行的,因此,如果并发处理不当或相关操作逻辑顺序设计的不合理时,将会导致此类问题的发生。

1、抓包:

Send to lntruder,设置参数

设置Payloads选项参数:

点击 Start attack

访问 http://127.0.0.1/upload-labs/upload/1.php 并不断刷新:

访问成功!

Less-18(条件竞争)

本关需要上传图片马,查看代码:

$is_upload = false;
$msg = null;
if (isset($_POST['submit']))
{require_once("./myupload.php");$imgFileName =time();$u = new MyUpload($_FILES['upload_file']['name'], $_FILES['upload_file']['tmp_name'], $_FILES['upload_file']['size'],$imgFileName);$status_code = $u->upload(UPLOAD_PATH);switch ($status_code) {case 1:$is_upload = true;$img_path = $u->cls_upload_dir . $u->cls_file_rename_to;break;case 2:$msg = '文件已经被上传,但没有重命名。';break; case -1:$msg = '这个文件不能上传到服务器的临时文件存储目录。';break; case -2:$msg = '上传失败,上传目录不可写。';break; case -3:$msg = '上传失败,无法上传该类型文件。';break; case -4:$msg = '上传失败,上传的文件过大。';break; case -5:$msg = '上传失败,服务器已经存在相同名称文件。';break; case -6:$msg = '文件无法上传,文件不能复制到目标目录。';break;      default:$msg = '未知错误!';break;}
}
//myupload.php
class MyUpload{......
......
...... var $cls_arr_ext_accepted = array(".doc", ".xls", ".txt", ".pdf", ".gif", ".jpg", ".zip", ".rar", ".7z",".ppt",".html", ".xml", ".tiff", ".jpeg", ".png" );
......
......
......  /** upload()**** Method to upload the file.** This is the only method to call outside the class.** @para String name of directory we upload to** @returns void**/function upload( $dir ){    $ret = $this->isUploadedFile();if( $ret != 1 ){return $this->resultUpload( $ret );}$ret = $this->setDir( $dir );if( $ret != 1 ){return $this->resultUpload( $ret );}$ret = $this->checkExtension();if( $ret != 1 ){return $this->resultUpload( $ret );}$ret = $this->checkSize();if( $ret != 1 ){return $this->resultUpload( $ret );    }// if flag to check if the file exists is set to 1if( $this->cls_file_exists == 1 ){$ret = $this->checkFileExists();if( $ret != 1 ){return $this->resultUpload( $ret );    }}// if we are here, we are ready to move the file to destination$ret = $this->move();if( $ret != 1 ){return $this->resultUpload( $ret );    }// check if we need to rename the fileif( $this->cls_rename_file == 1 ){$ret = $this->renameFile();if( $ret != 1 ){return $this->resultUpload( $ret );    }}// if we are here, everything worked as planned :)return $this->resultUpload( "SUCCESS" );}
......
......
......
};

本关对文件后缀名做了白名单判断,然后会一步一步检查文件大小、文件是否存在等等,将文件上传后,然后再
$ret = $this->renameFile();,进行了一次更改文件名;同样存在条件竞争的漏洞。可以不断利用burp发送上传图片马的数据包,由于条件竞争,程序会出现来不及rename的问题,从而上传成功。

Less-19(post型 00截断)

查看源码:

$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 = $_POST['save_name'];$file_ext = pathinfo($file_name,PATHINFO_EXTENSION);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 . '文件夹不存在,请手工创建!';}
}

分析,move_uploaded_file()函数中的img_path是由post参数save_name控制的,因此可以在save_name利用00截断绕过。

首先上传一个图片马,后缀名改为php+jpg

然后再16进制中把加号的2b 改为 00 fordward发包就行了。

上传成功!

然后我又发现,这题可以直接加空格绕过


上传成功。

好了,到这暂时就结束了至于Less20,需要审计代码,目前自己还做不了。

上传漏洞学习——upload-labs 闯关(二)相关推荐

  1. DVWA靶机-文件上传漏洞(File Upload)

    DVWA靶机-文件上传漏洞(File Upload) 文件上传漏洞的四个等级,low,medium,high,impossible,今天我们针对于不同的等级进行基于文件上传漏洞的攻击 DVWA靶机-暴 ...

  2. 上传漏洞学习——upload-labs 闯关(一)

    文章目录 一.漏洞介绍: 1.什么是文件上传漏洞: 2.什么样的网站会有文件上传漏洞: 3.文件上传漏洞的危害: 4.webshell介绍: 4.1.webshell的分类: 4.2.几种经典的web ...

  3. java 文件上传漏洞_文件上传漏洞(File Upload)

    简介 File Upload,即文件上传漏洞,通常是由于对用户上传文件的类型.内容没有进行严格的过滤.检查,使得攻击者可以通过上传木马,病毒,恶意脚本等获取服务器的webshell权限,并进而攻击控制 ...

  4. 文件上传漏洞——upload-labs(11-20)

    前言:上次文件上传漏洞学习到第十关,这次继续学习 第十一关 分析源码 前面几行代码都是对后缀名进行限制,最重要的就是这一句代码 $img_path = $_GET['save_path']." ...

  5. 【Web安全】中国蚁剑+DVWA(本地文件上传漏洞Upload)

    文章目录 1 中国蚁剑 2 文件上传漏洞(Upload) 2.1 准备hack.php 2.2 从DVWA上传hack.php 3 使用蚁剑来连接获得webshell 1 中国蚁剑 中国蚁剑是一款开源 ...

  6. 文件上传漏洞——DVWA练习

    前言:文件上传漏洞是很常见的漏洞,也非常有趣,接下来就在DVWA靶场中边学边练. 文件上传漏洞: 文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向 ...

  7. Web安全 文件上传漏洞的 测试和利用.(上传一个图片或文件 拿下服务器最高权限.)

    文件上传漏洞的概括 现在大多的网站和Web应用系统都会有上传功能(比如:文档,图片,头像,视频上传等.),而程序员在开发文件上传功能时,没有对代码做严格校验上传文件的后缀和文件类型. 此时攻击者就可以 ...

  8. 文件上传漏洞 (上传知识点、题型总结大全-upload靶场全解)

    文件上传漏洞 什么是文件上传漏洞 什么是webshell 一句话木马大全 产生文件上传漏洞的原因 文件上传漏洞的攻击与防御方式 1.前端限制 2.检查扩展名 1.黑名单策略, 2.白名单策略 3.检查 ...

  9. 文件上传漏洞靶场upload-labs学习(pass1-pass5)

    Upload-Labs学习 0x00 upload-labs简介 0x01 upload-labs环境搭建 0x02 Pass1(前端判断绕过) 0x03 Pass2(content-type类型绕过 ...

最新文章

  1. WMI技术介绍和应用——查询时间信息
  2. P5714 【深基3.例7】肥胖问题--python3实现
  3. 基础编程题之查找组成一个偶数最接近的两个素数
  4. 18 File Duplication and Pipes
  5. 深入理解Tomcat系列之一:系统架构(转)
  6. Eclipse中JSP生成的class文件去了哪里?(转)
  7. PPT+VBA实现计时(倒计时)展示
  8. Revit二次开发记录
  9. java 获取当前经纬度_求java代码,手机获取当前GPS的经纬度。
  10. matlab实现macd策略,经典MACD交易策略
  11. php里pluck,Pluck CMS后台另两处任意代码执行
  12. 雷蛇zGold与Nexon America建立全球合作伙伴关系
  13. 【深度学习】环境搭建—TensorFlow 2.0环境搭建
  14. 【Git】如何实现部分提交
  15. 导购网站服务器,服务器导购:选购服务器应看哪些配置参数
  16. Connor学Android - Bitmap的加载和缓存策略
  17. cifar10数据集下载及图片格式解析
  18. JS的三种弹出提示框(alert、confirm、prompt)
  19. 使用Python完成一套优美的中秋节代码
  20. 钢结构常用节点种类有哪些?

热门文章

  1. 八、深入JavaScript的条件语句和循环语句(四)
  2. 七十七、SpringBoot整合Rabbitmq
  3. R语言实现描述性统计
  4. 探寻AI未来式,百度AI Studio两周年寻最强锦鲤送超大惊喜
  5. NLP预训练模型学习全攻略(内附前沿论文解读直播)
  6. ECCV 2018 | 美图云联合中科院提出基于交互感知注意力机制神经网络的行为分类技术...
  7. 每天接触大量论文,看看他们是怎样写笔记的 | PaperDaily #09
  8. poj 3264 Balanced Lineup RMQ问题 线段树
  9. 微信小程序页面间传递json数据
  10. Spring Boot Admin:微服务应用监控