前言

这篇博客为本人CSDN博客同步至此,感谢支持!绕过方法有很多,这里只是讲几种我知道的方法,本人也是菜鸟一枚,写的不正确的地方欢迎大佬纠正,本篇博客也是为了记录一下自己踩到的坑,记录自己成长的点滴,以后方便查看,同时也希望能够帮到各位朋友,感谢!

环境

Windows10 DVWA

工具

burp suite、蚁剑(中国菜刀也可以)

难度等级以及绕过方法

low:

先看源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

if( isset( $_POST[ 'Upload' ] ) ) {
// Where are we going to be writing to?
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );

// Can we move the file to the upload folder?
if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
// No
echo '<pre>Your image was not uploaded.</pre>';
}
else {
// Yes!
echo "<pre>{$target_path} succesfully uploaded!</pre>";
}
}

?>

$target_path这个变量就是获取上传文件路径,move_uploaded_file函数移动文件上传位置,文件上传的时候会存到放临时目录,当脚本运行结束后就会销毁,所以要更改存放目录,可以看到,这个等级的上传完全没有限制,所以随便上传一个php木马就可以连接。

medium:

同样看一下源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php

if( isset( $_POST[ 'Upload' ] ) ) {
// Where are we going to be writing to?
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );

// File information
$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
$uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];

// Is it an image?
if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&
( $uploaded_size < 100000 ) ) {

// Can we move the file to the upload folder?
if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
// No
echo '<pre>Your image was not uploaded.</pre>';
}
else {
// Yes!
echo "<pre>{$target_path} succesfully uploaded!</pre>";
}
}
else {
// Invalid file
echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
}
}

?>

可以看到,这个等级中用**$_FILES**函数获取了文件名、类型和文件大小,($_FILES函数相关问题请自行百度),而且还需要上传的文件为jpeg或者png且文件大小小于100000字节才可以成功上传。有三种方法可以绕过:

  1. 可以上传后缀名为.php的木马文件使用burpsuite修改Content-Type类型进行绕过:

    burpsuite1

    修改Content-Type字段为image/jpeg可以看到成功上传:

    upload

    使用蚁剑成功连接:

    antsword

  2. 木马文件后缀名命名为.jpg图像文件格式,然后使用burpsuite修改文件后缀名进行绕过:

    burpsuite2

    可以看到修改以后成功绕过:

    得到所上传的文件的路径,同上使用蚁剑连接即可。

  3. 上传muma.php.jpg文件,使用00截断的方法进行绕过:

    burpsuite3

    可以看到对应的文件名所在行的16进制.jpg小数点所对应的16进制字符为2e,修改为00即可:

    burpsuite4

    这个是因为阿帕奇的上传文件机制默认为读取小数点后三个字符,所以上传上去截断三个字符以后的内容那么文件名刚好变为muma.php,同样使用蚁剑连接即可。

  4. 命令行使用copy 文件1/b + 文件2/a 生成文件名例:copy 1.jpg/b + 1.php/a muma.jpg使用jpg文件和php文件合成为jpg文件,同样可以上传绕过,方法都差不多,这里不再上图(这个方法是按照书上写的,我试验的时候并没有成功,在下面high等级会讲到原因)。

    high:

    同样先分析源码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <?php

    if( isset( $_POST[ 'Upload' ] ) ) {
    // Where are we going to be writing to?
    $target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
    $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );

    // File information
    $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
    $uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
    $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
    $uploaded_tmp = $_FILES[ 'uploaded' ][ 'tmp_name' ];

    // Is it an image?
    if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) &&
    ( $uploaded_size < 100000 ) &&
    getimagesize( $uploaded_tmp ) ) {

    // Can we move the file to the upload folder?
    if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) {
    // No
    echo '<pre>Your image was not uploaded.</pre>';
    }
    else {
    // Yes!
    echo "<pre>{$target_path} succesfully uploaded!</pre>";
    }
    }
    else {
    // Invalid file
    echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
    }
    }

    ?>

这个等级个人觉得起最大作用的是getimage函数,这个函数大致就是获取上传文件内容,因为要检查内容所以相比medium等级来说要难很多,看一下代码中主要函数作用:

strrpos(string , find ,start) 查找find字符在string字符中的最后一次出现的位置,start参数可选,表示指定从哪里开始
substr(string,start,length) 返回string字符中从start开始的字符串,length参数可选,表示返回字符的长度
strtolower(string) 返回给定字符串的小写
getimagesize(string) :函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP
图像文件的大小并返回图像的尺寸以及文件类型和一个可以用于普通 HTML 文件中 IMG 标记中的 height/width
文本字符串。如果不能访问 filename 指定的图像或者其不是有效的图像,getimagesize() 将返回 FALSE 并产生一条
E_WARNING级的错误。所以 getimagesize函数的作用是判断上传的文件是不是有效的图片

绕过方法:

使用medium等级的合成木马,但是合成的木马的图片文件要尽可能小,我就因为这个坑困惑了很久,今天才让大佬帮忙解决,因为php一句话木马在文件内容的末尾,但是解析出来的图片码部分代码会让浏览器误判为php语句,然而因为浏览器执行了不是php代码的图片码,所以必然会报出Error,从而造成真正的php语句解析不到的问题。但是如果木马写的太前面getimagesize函数就会识别出来,不过可以在BurpSuite中使用Repeater功能在合适的地方放置木马(一点一点的试),到最后也能成功上传。