File Upload
File Upload,即文件上传漏洞,通常是由于对上传文件的类型、内容没有进行严格的过滤、检查,使得攻击者可以通过上传木马获取服务器的webshell权限。
因此文件上传漏洞带来的危害常常是毁灭性的,Apache、Tomcat、Nginx等都曝出过文件上传漏洞。
文件上传漏洞的利用是有限制条件:
目录
low级别源码分析
medium级别源码分析
high级别源码分析
impossible级别源码分析
basename() 函数:返回路径中的文件名部分。
服务器对上传文件的类型、内容没有做任何的检查、过滤,存在明显的文件上传漏洞,生成上传路径后,服务器会检查是否上传成功并返回相应提示信息。
漏洞利用
该漏洞完全满足其限制条件
上传一句话木马
上传成功,并返回了服务器的上传路径如下:
打开中国菜刀,右键添加,地址栏填入上传文件所在路径,http://192.168.109.140/dvwa/hackable/uploads/hack.php
参数名(一句话木马口令)为a
然后菜刀就会通过向服务器发送包含a参数的post请求,在服务器上执行任意命令,获取webshell权限。
可以下载、修改服务器的所有文件。
打开服务器的模拟终端:
从源码中很明显可以看出,函数对上传文件的类型和大小作了限制,上传文件类型必须是image/jpeg或者image/png,且上传文件大小不能超过100000B(大约等于97.6KB)
漏洞利用
可采用打组合拳的方式(文件包含+文件上传)
采用一句话木马,文件大小基本不会超过最大限制,至于文件类型的检查,可以尝试修改文件名为hack.png或者hack.jpeg
上传成功
菜刀连接
连接失败
中国菜刀的原理:向上传文件发送包含参数的post请求,通过控制参数来执行不同的命令,而这里服务器将木马文件解析成了图片文件,因此向其发送post请求时,服务器只会返回这个“图片”文件,并不会执行相应命令。
为了让服务器将其解析为php文件,我们可以采用文件包含的方式,将地址栏内容改为如下所示:
http://192.168.109.140/dvwa/vulnerabilities/fi/?page=hthttp://tp://192.168.109.140/dvwa/hackable/uploads/hack.png
菜刀连接:连接失败,下面均显示html格式代码,经多次尝试,方法没错,是平台问题
通过burpsuite抓包,修改文件类型,绕过
上传文件hack.png,打开代理和开启burpsuite,单击upload,进行抓包
修改成功!
截断绕过
在php版本小于5.3.4的服务器中,当magic_quote_gpc选项为off时,可以在文件名中使用%00截断
可以把上传文件命名为hack.php%00.png,上传,抓包
显示上传成功,但不知道为什么%00没有过滤掉,猜测可能是phpstudy环境问题
这里有能成功做出来的小伙伴,希望可以请教一下,谢谢!
与medium级别相比,增加了strrpos()函数和getimagesize()函数,从源码中发现对文件上传的格式做了更加严格的限制,要求上传文件名形式必须是”*.jpg”、”*.jpeg” 、”*.png”其中之一,而且限制了上传文件的文件头必须为图像类型。
strrpos() 函数:查找字符串在另一字符串中最后一次出现的位置。在这里是从文件名中找到含"."的字符
getimagesize()函数:用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息。
漏洞利用
由于对文件类型和格式有了严格的限制,我们可以尝试将 一句话木马文件与图片合并成一个图片类型的文件,具体如下:
copy 图片名/b+文件名/a 合并后的图片名
查看合并后的图片文件
上传、抓包
点击forward,发现一句话马图片上传成功
使用菜刀连接
注意:URL使用(文件包含+文件上传)的high级别绕过
http://192.168.109.139/dvwa/vulnerabilities/fi/?page=file:///C:\phpStudy\PHPTutorial\WWW\dvwa\hackable\uploads\hack2.png
菜刀连接依旧失败!原因未知……
与high级别相比,增加了Anti-CSRF token防护CSRF攻击,对上传文件进行了重命名(为md5值,导致%00截断无法绕过过滤规则),同时对文件的内容作了严格的检查,导致攻击者无法上传含有恶意脚本的文件。
md5() 函数:计算字符串的 MD5 散列
DIRECTORY_SEPARATOR()
是一个显示系统分隔符的命令,在这里显示"."
ini_get(string $varname):string 成功是返回配置选项的值,这里嵌套在判断语句,判断上传的tmp目录是否为空
imagejpeg ( image , filename , quality):从image图像以filename为文件名创建一个JPEG图像,可选参数quality,范围从0(最差质量,文件更小)到100(最佳质量,文件最大)。