参考文章:DVWA之File Upload (文件上传漏洞) | 新手指南:DVWA-1.9全级别之File Upload | File Inclusion

原理

File Upload,即文件上传漏洞,通常是由于对上传文件的类型、内容没有进行严格的过滤、检查,使得攻击者可以通过上传木马获取服务器的webshell权限,因此文件上传漏洞带来的危害常常是毁灭性的,Apache、Tomcat、Nginx等都曝出过文件上传漏洞

分析

LOW

先看代码,进行审计,找出可上传原因

可以看到,服务器对上传文件的类型、内容没有做任何的检查、过滤,存在明显的文件上传漏洞,生成上传路径后,服务器会检查是否上传成功并返回相应提示信息

如果上传成功,则会提示 路径+succesfully uploaded! 如果上传失败,则会提示 Your image was not uploaded
image.png

basename函数

basename(path,suffix)
函数返回路径中的文件名部分,如果可选参数suffix为空,则返回的文件名包含后缀名,反之不包含后缀名

move_upload_file函数

将上传的文件移动到新的位置中
image.png

所以这里,直接上传一句话木马,然后拼接路径,蚁剑进行连接
image.png

http://192.168.10.100:81/dvwa/hackable/uploads/php.php
image.png

Medium

老样子,先看代码,进行审计,找出可上传原因

代码对上传文件的类型、大小做了限制,要求type**类型必须是jpeg或者png,大小不能超过100000B**(约为97.6KB)

结合大佬们的文章,有3中方法可以绕过进行webshell,下面会一一写出
image.png

一:文件包含+文件上传

这里既然只能上传图片,那么可以用文件包含去包含这个文件,执行里面的代码

先上传具有木马代码的图片,获取路径
image.png

然后去文件包含模式下,绕过黑名单限制,进行文件包含
http://192.168.10.100:81/dvwa/vulnerabilities/fi/?page=hthttp://tp://192.168.10.100/dvwa/hackable/uploads/hackphp.jpg

xdm,这里我估计是软件坏了,连不上,就放个别的大佬成功的图吧
image.png

对了,文件包含不会的话,可以去看我之前的文章:File Inclusion

二:抓包修改文件的type

因为这里过滤的是文件的上传类型而不是文件的后缀名

所以我们直接上传 shell.php 的一句话木马
通过burpsuite抓包,看到默认type类型是application/octer-stream,不改值会报错
image.png

现在来Type值为image/jpeg,成功返回路径!
image.png

拼接路径,蚁剑直接连接
image.png

三:截断绕过

截断原理

php<5.3.4中,处理字符串的函数认为0x00是终止符

那么我们可以利用 00截断 漏洞来上传我们的一句话木马

00截断一

修改Type类型,添加空格,并将其十六进制改为00,进行截断

先将文件名改为这个,符合后缀名为jpg的格式
image.png

Hex查看,空格的十六进制是20,将其改为00
image.png
image.png

然后将Type类型改为image/jpeg,直接上传,返回了路径
image.png

拼接路径,蚁剑连接
image.png

00截断二

修改Type类型,直接添加%00,进行截断
image.png

拼接路径,蚁剑连接
image.png

High

老样子,先看代码,进行审计,找出可上传原因

这里 $uploaded_ext 表示的是上传文件的后缀名 ,这里限制上传的文件的后缀名必须以 jpg 、jpeg 或 png 结尾,同时大小<100000B,**同时上传的文件必须是有效的图片格式**(不只是以图片的格式结尾,**而且****文件内容****也必须****是图片格式的**)
image.png

strrpos函数

strrpos(string , find ,start)
查找find字符在string字符中的最后一次出现的位置,start参数可选,表示指定从哪里开始

substr函数

substr(string,start,length)
返回string字符中从start开始**的字符串**,length参数可选,表示返回字符的长度

strtolower函数

strtolower(string)
返回给定字符串的小写

getimagesize函数

getimagesize(string)
函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型和一个可以用于普通 HTML 文件中 IMG 标记中的 height/width 文本字符串。如果不能访问 filename 指定的图像或者其不是有效的图像,getimagesize() 将返回 FALSE 并产生一条 E_WARNING级的错误。所以 getimagesize函数的作用是判断上传的文件是不是有效的图片

试着上传一个jpg后缀名,但内容不是的看看,什么效果
image.png

一:添加文件头部信息

这里添加文件头部信息,如GIF89,用于绕过
image.png
image.png


二:图片马

copy shell.php/a+test.jpg/b hackphp.jpg
image.png

虽然我们的一句话木马上传成功了,但是它是以jpg为后缀的,菜刀不能直接连接,必须让它作为php解析

远控软件的原理是向上传文件发送包含参数的
post请求,通过控制参数来执行不同的命令,而这里服务器将木马文件解析成了图片文件,因此向其发送post请求时,服务器只会返回一个“图片”文件**,并不会执行相应命令

所以图片马必须配合解析漏洞或者文件包含一起使用,才能getshell,这里就以文件包含为例子

http://192.168.10.100:81/dvwa/vulnerabilities/fi/?page=file:///D:/PhpStudy/PHPTutorial/WWW/dvwa/hackable/uploads/hackphp.jpg

可以看到,成功包含了我们上传的一句话木马图片,把该图片当成php文件执行了
image.png

这里要浏览网站,要保存为session,然后才能getshell
image.png

Impossible

老样子,先看代码,进行审计,找出不可上传原因

这里对上传的文件进行了重命名(为md5值,导致00截断无法绕过过滤规则),

并且加入Anti-CSRF token防护CSRF攻击

同时对文件的内容作了严格的检查,导致攻击者无法上传含有恶意脚本的文件
image.png

imagecreatefromjpeg函数

imagecreatefromjpeg(filename)
从给定的文件或url中创建一个新的图片
**

imagejpeg函数

imagejpeg(image,filename,quality)
从image图像中以 filename 文件名创建一个jpeg的图片,参数quality可选,0-100 (质量从小到大)

imagedestroy函数

imagedestroy(image)
销毁图像