DVWA-5.2 File Upload(文件上传)-Medium-绕过文件类型限制
Medium Level
查看代码
<?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 $html .= '<pre>Your image was not uploaded.</pre>'; } else { // Yes! $html .= "<pre>{$target_path} succesfully uploaded!</pre>"; } } else { // Invalid file $html .= '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>'; } } ?>
可以看到,Medium级别的代码对上传文件的类型、大小做了限制,要求文件类型必须是jpeg或者png,大小不能超过100000B(约为97.6KB)。
漏洞利用
方法1 组合拳(文件包含+文件上传)
因为采用的是一句话木马,所以文件大小不会有问题,至于文件类型的检查,尝试修改文件名为hack.png。
上传成功
启用中国菜刀,右键添加
不幸的是,虽然成功上传了文件,但是并不能成功获取webshell权限,在菜刀上无论进行什么操作都会返回如下信息
中国菜刀的原理是向上传文件发送包含hello参数的post请求,通过控制hello参数来执行不同的命令,而这里服务器将木马文件解析成了图片文件,因此向其发送post请求时,服务器只会返回这个“图片”文件,并不会执行相应命令。
那么如何让服务器将其解析为php文件呢?我们想到文件包含漏洞。这里可以借助Medium级别的文件包含漏洞来获取webshell权限,打开中国菜刀,右键添加,在地址栏中输入
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=hthttp://tp://127.0.0.1/dvwa/hackable/uploads/hack.png
参数名为hello,脚本语言选择php。
按照原作者的文章,这里应该是点击添加,成功获取webshell权限。但是不知道为什么我这里并不能,会报如下问题
方法2 抓包修改文件类型
上传hack.png文件,抓包
可以看到文件类型为image/png,尝试修改filename为hack.php
上传成功
上菜刀,获取webshell权限
方法3 截断绕过规则
在php版本小于5.3.4的服务器中,当Magic_quote_gpc选项为off时,可以在文件名中使用%00截断,所以可以把上传文件命名为hack.php%00.png。
可以看到,包中的文件类型为image/png,可以通过文件类型检查。
上传成功
而服务器会认为其文件名为hack.php,顺势解析为php文件。遗憾的是,由于本次实验环境的php版本为5.5.12,所以无法进行验证。
参考:https://www.freebuf.com/articles/web/119467.html