一、概念
文件上传漏洞,通常是由于对上传文件的类型,内容没有进行严格的过滤、检查,是的可以通过上传webshell获取服务器权限,因此文件上传漏洞带来的危害常常是毁灭性的。
二、Low级别
1.代码审计
basename(path,suffix)函数的功能:返回path中的文件名部分,如果可选参数suffix为空,则返回文件名包含后缀名,反之不包含后缀名。
我们发现,这里的代码对于文件没有做任何的审查。
2.漏洞利用
我们创建一个test.php文件
尝试上传
发现出现相对路径,…/…/表示向上两个文件夹,那么我们对链接进行拼装
http://192.168.3.133/DVWA-master/vulnerabilities/upload/#
…/…/hackable/uploads/test.php
-》http://192.168.3.133/DVWA-master/hackable/uploads/test.php
尝试访问该链接,发现成功执行上传的文件。
三、medium级别
1.代码审计
if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&
( $uploaded_size < 100000 ) )
发现代码判断文件类型描述为jpeg或png且文件小于100000字节的文件,可以通过上传。
2.漏洞利用
我们将test.php文件的后缀改为.jpg
上传文件时,我们使用Burpsuite修改上传的数据包
修改完毕,点击Foeward放行数据包。
访问以下的链接
http://192.168.3.133/DVWA-master/hackable/uploads/test.php
成功进行文件上传
四、high级别
1.代码审计
// 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' ];
if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) &&
( $uploaded_size < 100000 ) &&
getimagesize( $uploaded_tmp ) )
文件名要jpg、jpeg且后缀名要jpg。
$uploaded_ext变量存储的为文件的后缀名
其中getimagesize(变量)判断是否为图片文件,检测文件头是不是有GIF98,然后检测图片文件大小。
我们可以在代码的头部加入GIF98进行绕过。
2.漏洞利用
将test.jpg里的内容修改如下
将文件上传,发现可以成功上传
我们在服务器中发现该文件为jpeg类型的文件
我们尝试直接进行访问
http://192.168.3.133/DVWA-master/hackable/uploads/test.jpg
发现这里默认是以jpg图片的格式进行解析的。
我们需要将jpg文件的内容按php的格式进行执行。
这时候我们就需要将文件包含漏洞进行利用,文件包含是将所有的文件先以php的形式进行执行,如果执行不成功,则返回文件内容。
我们使用high级别的文件包含,输入以下链接
http://192.168.3.133/DVWA-master/vulnerabilities/fi/?page=file://C:\PHPTutorial\WWW\DVWA-master\hackable\uploads\test.jpg
成功执行。
有的时候,一个低危的漏洞并不可怕,但几个低危的漏洞结合起来,有可能就会变成一个高危的漏洞。
五、impossible级别
1.代码审计
这里我们可以看到有token检测、将文件名重命名md5加密等,将文件名混淆。
判断文件后缀为jpg,判断是不是图片文件,然后检测图片大小。创建图片文件,如果报错则error,若创建成功,则删除这个文件。最终命名文件为md5加密混淆后的名字
六、防御
1.文件进行md5处理后作为文件名,可以使%00截断无法绕过
2.加入token
3.对文件内容进行严格检查。