相关代码分析
<?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
相关代码分析
可以看到,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,所以无法进行验证。
相关代码分析
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解析了
相关代码分析
imagecreatefromjpeg ( filename )
函数返回图片文件的图像标识,失败返回false
imagejpeg ( image , filename , quality)
从image图像以filename为文件名创建一个JPEG图像,可选参数quality,范围从 0(最差质量,文件更小)到 100(最佳质量,文件最大)。
imagedestroy( img )
函数销毁图像资源
可以看到,Impossible级别的代码对上传文件进行了重命名(为md5值,导致%00截断无法绕过过滤规则),加入Anti-CSRF token防护CSRF攻击,同时对文件的内容作了严格的检查,导致攻击者无法上传含有恶意脚本的文件。
文笔生疏,措辞浅薄,望各位大佬不吝赐教,万分感谢。
免责声明:由于传播或利用此文所提供的信息、技术或方法而造成的任何直接或间接的后果及损失,均由使用者本人负责, 文章作者不为此承担任何责任。
转载声明:儒道易行 拥有对此文章的修改和解释权,如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经作者允许,不得任意修改或者增减此文章的内容,不得以任何方式将其用于商业目的。
博客:
先知社区:
SecIN:
https://www.sec-in.com/author/3097
CSDN:
https://blog.csdn.net/weixin_48899364?type=blog
公众号:
FreeBuf: