(1)文件上传
File Upload,即文件上传漏洞,通常是由于对上传文件的类型、内容没有进行严格的过滤、检查,使得攻击者可以通过上传木马获取服务器的webshell权限;
这里上传的文件可以是木马,病毒,恶意脚本等。这种攻击方式是最为直接和有效的,“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果;
(2)文件上传漏洞的前提条件
能上传木马
上传的木马能执行
还要清楚上传后的路径
实验环境
(1)Windows服务器:Windows Server 2003,IP地址:192.168.37.136;
(2) Linux服务器:192.168.37.135
(3) 测试机:Windows7物理机(开启代理,代理服务器为burpsuite)
(4) 工具:抓包工具:Burpsuite; 中国菜刀:Cknife
实验过程——Windows
安全级别:Low
(1)设置安全级别
(2)查看源码
(3)源码分析
basename(path,suffix) 函数返回路径中的文件名部分。Path是必须参数,规定要检查的路径;suffix是可选参数,规定文件的扩展名,如果文件有 suffix,则不会输出这个扩展名;
服务器对用户上传的文件没有做筛选和检查
生成上传路径后,服务器会检查是否上传成功;
(4)实验操作
4.1> 上传一句话木马(low.php)
木马文件上传的路径为:http://192.168.37.136/DVWA/hackable/uploads/low.php
4.2> 使用中国菜刀查询,获取webshell权限
添加一个新的shell;
可以下载、修改服务器的所有文件;
模拟终端
安全级别:Medium
(1)设置安全级别
(2)查看源码
(3)源码分析
限制了文件类型必须是jpeg或者或者png;
限制了文件大小必须100000字节;
(4)实验过程
4.1> 方式一:组合拳(文件包含+文件上传)
创建一句话木马low.png;
上传low.png文件,获取文件上传的路径;
注:木马的上传路径:http://192.168.37.136/DVWA/hackable/uploads/low.png
使用中国菜刀,获取webshell权限;
查看添加shell的结果
虽然成功上传了文件,但是并不能成功获取webshell权限;
中国菜刀的原理是向上传文件发送post请求,通过控制cmd参数来执行不同的命令,而这里服务器将木马文件解析成了图片文件,因此向其发送post请求时,服务器只会返回这个“图片”文件,并不会执行相应命令;
那么如何让服务器将图片文件解析为PHP文件呢?我们可以借助文件包含漏洞(不管文件后缀是否是php,都会尝试当做php文件执行,如果文件内容为php,则会正常执行并返回结果,如果不是,则会原封不动地打印文件内容,所以文件包含漏洞常常会导致任意文件读取与任意命令执行;)
我们可以借助文件包含漏洞来获取webshell权限,打开中国菜刀,右键添加,在地址栏中输入:
http://192.168.37.136/dvwa/vulnerabilities/fi/?page=hthttp://tp://192.168.37.136/dvwa/hackable/uploads/low.png
在中国菜刀重新添加一个文件路径如下的shell
理论上是可以成功的,但由于版本等问题,没有成功;
4.2>方式二: BurpSuite抓包修改content-type
上传木马文件low.png,抓包后修改后缀名;可以看到文件类型为image/png,尝试修改filename为low.php
查看上传结果
使用中国菜刀查询,获取webshell权限
4.3> 方式三:%00截断绕过
%00截断绕过,此时,服务器会将low.php%00.png认为其文件名为low.php,解析为PHP文件(仅限于PHP版本小于5.3.4的版本),本次实验实验的PHP版本为5.5.53,所以结果不会成功;但过程和思路如下:
创建low.php%00.png;
上传文件;
通过Burpsuite抓包查看文件类型;文件类型为image/png
上传成功;
使用中国菜刀查看,并获取webshell权限;
由于版本平台问题(本次实验的PHP版本为5.5.53),没有成功;
4.4> 方式四:系统本身存在解析漏洞
有的系统会将带有木马文件的图片解析为PHP文件执行;
安全级别:High
(1)设置安全级别
(2)查看源码
(3)源码分析
substr():返回字符串的一部分;
$uploaded_ext:等于文件的后缀名;
getimagesize(string filename):函数会通过读取文件头,返回图片的长、宽等信息,如果没有相关的图片文件头,函数会报错。
getimagesize():函数限制了上传文件的文件头(限制了文件的大小及图片尺寸)。
High安全等级采用白名单过滤,只允许上传的文件后缀名为jpg、jpeg、png且文件大小小于100000字节。High安全等级仍然采用白名单过滤,只允许上传的文件后缀名为jpg、jpeg、png且文件大小小于100000字节。
(4)实验过程
用记事本打开1.jpeg,在末尾添加一句话木马;
上传图片;
上传成功;
使用中国菜刀,获取webshell权限
安全级别:Impossible
(1)设置安全级别
(2)查看源码
(3)源码分析
Impossible级别的代码对上传的文件进行了重命名(MD5值,导致%00截断无法绕过过滤规则),加入Anti-CSRF token防护CSRF攻击,同时对文件的内容的内容进行了严格的检查,拒绝了文件上传漏洞;
实验过程——Linux
安全级别:Low
(1)设置安全级别
(2)查看源码
(3)源码分析
服务器对上传文件的类型,内容没有做任何的限制;
文件上传之后,服务器会检查文件是否上传成功,显示回应信息;
安全级别:Medium
(1)设置安全级别
(2)查看源码
(3)源码分析
服务器限制了上传文件的类型必须是jpeg;
限制了文件大小必须小于100000字节;
安全级别:High
(1)设置安全级别
(2)查看源码
(3)源码分析
High级别限制了上传的文件后缀名为jpg/JPG/jpeg/JPEG,可以通过Burpsuite抓包,在文件名后面添加jpg/JPG/jpeg/JPEG后缀名即可绕过,也可以通过%00阶段绕过;