5.File Upload

1.File Upload(Low)

相关代码分析

<?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
        $html .= '<pre>Your image was not uploaded.</pre>';
    }
    else {
        // Yes!
        $html .= "<pre>{$target_path} succesfully uploaded!</pre>";
    }
}

?>

basename(path,suffix)

函数返回路径中的文件名部分,如果可选参数suffix为空,则返回的文件名包含后缀名,反之不包含后缀名。

可以看到,服务器对上传文件的类型、内容没有做任何的检查、过滤,存在明显的文件上传漏洞,生成上传路径后,服务器会检查是否上传成功并返回相应提示信息。

文件上传漏洞的利用是有限制条件的,首先当然是要能够成功上传木马文件,其次上传文件必须能够被执行,最后就是上传文件的路径必须可知。

上传文件1.php(一句话木马)

上传成功并且返回了路径

蚁剑连接,拿到shell

2.File Upload(Medium)

相关代码分析

可以看到,Medium级别的代码对上传文件的类型、大小做了限制,要求文件类型必须是jpeg或者png,大小不能超过100000B(约为97.6KB)。

第一种方法,修改文件类型为image/png

放包,成功上传

第二种方法,将木马文件写成.png后缀上传,然后修改文件后缀为.php

放包,成功上传

第三种方法,%00截断上传,将文件名改为shell.php%00.png

在php版本小于5.3.4的服务器中,当Magic_quote_gpc选项为off时,可以在文件名中使用%00截断,所以可以将文件名改为shell.php%00.png,

可以看到,包中的文件类型为image/png,可以通过文件类型检查。

上传成功

而服务器会认为其文件名为shell.php,顺势解析为php文件。由于本次实验环境的php版本为5.5.9,所以无法进行验证。

3.File Upload(High)

相关代码分析

strrpos(string,find,start)

函数返回字符串find在另一字符串string中最后一次出现的位置,如果没有找到字符串则返回false,可选参数start规定在何处开始搜索。

getimagesize(string filename)

函数会通过读取文件头,返回图片的长、宽等信息,如果没有相关的图片文件头,函数会报错。

可以看到,High级别的代码读取文件名中最后一个”.”后的字符串,期望通过文件名来限制文件类型,因此要求上传文件名形式必须是”*.jpg”、”*.jpeg” 、”*.png”之一。同时,getimagesize函数更是限制了上传文件的文件头必须为图像类型。

尝试上传一个一句话后门的图片格式脚本 shell.png

发现即使图片类型为png的, 但是当内容非图片格式的时候, 也不能上传

第一种方法,可以通过添加jpg图片的格式头到脚本文件里进行绕过

首先在文本文档里写入<?php phpinfo();?>文件后缀修改为.jpg

上传文件,抓包,在脚本文件前加上GIF89,放包

成功上传

第二种方法,在图片文件内容后添加<?php phpinfo();?>

命令行输入copy 1.jpg/b + shell.php/a 2.jpg

点击上传

文件上传成功

上传之后的脚本是图片格式的, 不能当做php解析,

webshell管理工具的原理是向上传文件发送包含参数的post请求,通过控制参数来执行不同的命令,而这里服务器将木马文件解析成了图片文件,因此向其发送post请求时,服务器只会返回这个“图片”文件,并不会执行相应命令。

如果让让我们的图片以 php 格式运行,可以借助High级别的文件包含漏洞来获取webshell权限,让我们的图片格式的一句话木马以php格式运行。

第一种方法,构造url:

/vulnerabilities/fi/?page=file:////var/www/html/hackable/uploads/phpinfo.jpg

成功解析phpinfo文件

第一种方法,构造url:

/vulnerabilities/fi/?page=file:////var/www/html/hackable/uploads/2.jpg

可以看到, jpg的木马图片被当做php解析了

4.File Upload(Impossible)

相关代码分析

imagecreatefromjpeg ( filename )

函数返回图片文件的图像标识,失败返回false

imagejpeg ( image , filename , quality)

从image图像以filename为文件名创建一个JPEG图像,可选参数quality,范围从 0(最差质量,文件更小)到 100(最佳质量,文件最大)。

imagedestroy( img )

函数销毁图像资源

可以看到,Impossible级别的代码对上传文件进行了重命名(为md5值,导致%00截断无法绕过过滤规则),加入Anti-CSRF token防护CSRF攻击,同时对文件的内容作了严格的检查,导致攻击者无法上传含有恶意脚本的文件。

文笔生疏,措辞浅薄,望各位大佬不吝赐教,万分感谢。

免责声明:由于传播或利用此文所提供的信息、技术或方法而造成的任何直接或间接的后果及损失,均由使用者本人负责, 文章作者不为此承担任何责任。

转载声明:儒道易行 拥有对此文章的修改和解释权,如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经作者允许,不得任意修改或者增减此文章的内容,不得以任何方式将其用于商业目的。

点击收藏 | 1 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖