zoukankan      html  css  js  c++  java
  • upload-labs

    最近一直再搞内网方面的知识,感觉自己越学越菜

    拿了一个学院的后台,有文件上传,但方法都试过了,还是没法成功,编辑器也是,于是就先交edusrc,感觉自己还是对文件上传不够熟悉,把靶场操作一遍,练练手

    这个靶场是upload-labs,github上有

    image-20210914150226278

    pass-01

    第一个前端

    老js脚本了

    去掉checkfile()

    或者禁用js都行

    pass-02

    对文件的类型抓包

    未知的是

    Content-Type: application/octet-stream
    

    正常的是

    Content-Type: image/jpeg
    

    这个又叫mime绕过验证

    pass-03

    trim 移除字符串两侧的空白字符或其他预定义字符。
    strrchr 来进行指定第二个参数对第一个参数的后面的截取读取
    

    黑名单的采用

    是不安全的,现在都采用白名单

    限制的不全,有php5、php3、phtml等可以上传

    这是需要在apahce的环境下才行

    因为是php环境,所以一定要上传相关php的脚本木马才可以兼容

    pass-04

    通过.htaccess的攻击

    因为没有过滤这个在黑名单

    <FilesMatch "shana">
    SetHandler application/x-httpd-php
    </FilesMatch>
    

    上传shana图片,就解析了shana.jpg

    那个htaccess是指定的文件解析

    还有一种全部解析为php的.htaccess

    SetHandler application/x-httpd-php
    

    只有apache有

    注意靶场环境

    这个.htaccess是为伪静态实现的

    但也可以通过来攻击

    pass-05

    大小写绕过

    这种只适合在win下,linux没有这个特殊的配置

    pass-06

    大小写,增加了当前时间和随机数的照片地址

    pass-07

    末尾增加空格,并且大小写同pass06

    少了trim函数

    pass-08

    少了之前的

    $file_name = deldot($file_name);//删除文件名末尾的点
    

    直接加在文件后.

    过滤掉黑名单

    并且计算机不会识别.

    就变成了php文件

    pass-09

    少了一个检查的

    $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
    

    直接在文件后加::$DATA

    原理:

    备用数据流允许文件包含多个数据流。每个文件至少有一个数据流。在Windows中,此默认数据流称为:$ DATA。

    加了后自己就就上传取消了这个,跟空格差不多

    pass-10

    对于过滤的文件名的后缀只执行一次

    所以可构造

    chenyouxiu.php. .
    

    从而上传

    pass-11

    str_ireplace是后面的参数跟前面的参数比较,如果跟前面的一样,就过滤

    但还是一次的

    直接
    .phphpp
    

    这个跟xss的那个绕过滤的差不多

    pass-12

    是个白名单

    相对黑名单比较安全

    substr() 函数返回字符串的一部分。

    strrpos() 函数查找字符串在另一字符串中最后一次出现的位置。

    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
    就是不断地对文件末尾的点进行去除
    

    白名单使用%00截断

    这个前提是

    1、PHP 版本 < 5.3.4

    2、php.ini 中 magic_quotes_gpc=off

    image-20210914170237245

    这个是get不用转换%00

    因为url会自动转换

    因为

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

    这行的意思是

    get路径然后/然后随机值加日期加文件名

    %00就是把url后的截断,从而使上传的jpg变成了php的代码

    pass-13

    这个跟上一个不同的是请求上的

    get变post了

    post不会自动转化,路径在下面,直接ctrl+shift+u

    然后进行

    其实有两种截断在post下

    可以输入%00然后ctrl+shift+u
    或者hex20改为00
    还可以输入+
    然后在hex找到对应的目录
    然后更改2b为00
    同样是截断的方法
    

    ps:还是burpsuite1.7.37好用,新的它的十六进制对%00和+有问题

    pass-14

    文件包含有个include的file参数进行,使用包含参数?file=xxx.jpg

    然后就把图片变成php格式的了

    这个是对文件头的识别

    jpg,png,gif都有相关

      switch($typeCode){      
            case 255216:            
                $fileType = 'jpg';
                break;
            case 13780:            
                $fileType = 'png';
                break;        
            case 7173:            
                $fileType = 'gif';
                break;
            default:            
                $fileType = 'unknown';
            }    
            return $fileType;
            
    1.Png图片文件包括8字节:89 50 4E 47 0D 0A 1A 0A。即为 .PNG。
    2.Jpg图片文件包括2字节:FF D8。
    3.Gif图片文件包括6字节:47 49 46 38 39|37 61 。即为 GIF89(7)a。
    4.Bmp图片文件包括2字节:42 4D。即为 BM。
    

    然后使用一句话木马,利用c32等16进制

    还可以使用ps的文件简介的文件标题那里插入一句话

    或者

    copy 图片/b+地址.php 图漂片别名.jpg
    

    然后还是上传一个图片

    利用解析漏洞

    image-20210914201244605

    pass-15

    这个高级了

    使用的getimagesize的php函数

    这个函数的意思就是获取图像,成功返回一个数组,返回失败产生错误

    所以要是要是一个图片在加马,不能只是光加头的马

    然后解析漏洞

    pass-16

    又来一个新的函数

    exif_imagetype 获取图片信息的函数

    一样文件包含

    pass-17

    一样

    pass-18

    二次渲染

    这个比较不清楚

    unlink函数是删除的作用
    

    利用条件竞争删除文件时间差绕过

    主要是把文件都先上传到指定的带自己当前的文件名的目录,然后判断后再进行重命名,如果占用就不会rename,所以这样就不断地访问上传的文件的图片的目录的路径的图片,然后使他无法重命名

    然后利用bp的null paylaod进行放包不断,使得访问成功,并且不会重命名和判断是否是正常文件,但是这有个问题,就文件一直一会消失一会出现...很好玩

    还有一个方法

    还可以使用apache的解析漏洞,apache默认情况下是从后往前解析,如果后面的不对,就会接着向前,但apache不解析7z

    所以还得向前

    就变成了

    x.php.7z
    x.php
    

    前提还是得不断发包,才行

    pass-19

    有两个文件

    利用require_once引用了myupload.php

    看翻译注释知道了这还是一个竞争上传

    先检查后缀、大小、然后上传

    不对就删除

    对了就改名

    在类中又定义了上传类型

     var $cls_arr_ext_accepted = array(
          ".doc", ".xls", ".txt", ".pdf", ".gif", ".jpg", ".zip", ".rar", ".7z",".ppt",
          ".html", ".xml", ".tiff", ".jpeg", ".png" );
    

    用7z上传,就可以利用apache的解析特性来绕过

    从而解析php文件

    pass-20

    还是黑名单

    但名字需要自己命名

    可以使用PHp来绕过

    还可以使用截断

    还可以使用php.来进行

    总之各种偏僻的空格.也中

    /.也行

    pass-21

    这个代码是白名单

    然后针对jpeg,png,gif的mime检查

    然后对文件填充自己输入的名字

    再取.后面的后缀

    并且判断是否为jpg类的格式

    在进行文件的命名

    还有ext=end($file)指的是对文件的最后一个元素进行存储到ext下

    然后验证和allow_suffix

    $file_name = reset($file) . '.' . $file[count($file) - 1];
    参考
    x.jpg
    分为三部分
    x
    .
    jpg
    然后可以当作数组为
    x[0]=x    x[1]=. x[2]=jpg
    然后count就是减去一,就是二,也就是后缀jpg
    其中reset指的就是第一个零数组
    count($file) - 1就是第二个数组的后缀
    

    然后就可以使用参数来进行

    根据原始抓包数据知道

    命名的文件叫save_name

    然后更改为save_name[0]和save_name[2],为什么没有1

    因为1的数组是文件的后缀,没有就为空,然后就为空

    从而构造为

    先用保存的文件名来绕过mime的检测

    然后构造数组

    image-20210914225702927

    然后构造后就是ma.php空

    就是ma.php

    总结

    实战下不知道上传的情况,因为没有源码,只能尝试,一般都是白名单,还需要不断的积累

    别人都在不停的努力,自己又怎么会停
  • 相关阅读:
    第一个Servlet项目(IDEA)
    Web交互基本流程以及HTTP协议详解
    mybatis中Mapper.xml配置详解
    认识mybatis
    SpringAOP
    Spring AOP
    70. Climbing Stairs
    位运算
    Leetcode分类
    21. Merge Two Sorted Lists
  • 原文地址:https://www.cnblogs.com/chenyouxiu/p/15270321.html
Copyright © 2011-2022 走看看