文件上传原理
原理:文件上传就是对服务端上传文件,因服务端对文件类型过滤不严格导致恶意文件被解析,导致服务端的权限泄露。
文件上传的条件:
1.可以上传文件
2.上传的文件可以被服务器解析
3.可以找到上传文件的路径
dvwa练习
LOW
我们先看看low级别的代码
1.首先使用isset()函数进行变量测试们是否点击了upload
2.然后进行一个变量上传路径的定义。用.=进行连续变量定义。
3.对文件是否上传到临时目录进行判断
从源代码我们可以看出并没有对上传文件进行任何过滤
我们直接上传一个一句话<?php @eval($_POST['1']); ?>
然后是使用中国菜刀进行连接
连接成功
MEDIUM
我们试着上传一下,可以看出对我们上传文件的类型进行了一个规定
来看一看源码
1.basename规定了上传路径和拓展名
2.进行变量的赋值,然后进行过滤
3.根据上传文件是否匹对,返回结果
4.没有对拓展名进行过滤
Content-Type: application/octet-stream改为image/jpeg
上传成功。使用菜刀解析php文件。
方法二
在php版本小于5.3.4时可以利用00截断
1.我们更改文件名,‘1.phpX.jpeg’ X可以为任意符号,然后我们查找一下他的十六进制数,再到拦截包里的hex数组中找到进制数,用00进行替换,我们就可以看到文件名的jpeg被截断。
2.直接对文件名进行截断‘1.php%00.jpeg’,brup截断后再convert用url编码进行解码。
HIGH
从源代码我们可以看出uploaded_ext被赋值,文件拓展名被进行过滤。
getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息。
语法格式:
array getimagesize ( string KaTeX parse error: Expected 'EOF', got '&' at position 19: …ename [, array &̲imageinfo ] )
getimagesize() 函数会判定文件内容是不是图片,所以我们再更改拓展名后还需要再php文件里加入图片的头部。
getimagesize() 函数绕过
使用cpoy命令把一句话写入图片底部。
copy /b 1.jpg+1.php
也可以再我们的php文件加入jpg或者png头部。也可以绕过。
最后利用文件包含进行php格式的运行。
菜刀连接
在菜刀里进行登录,拿到cookie。
再去菜刀的文件管理就可以拿到webshell了。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210404095621385.png?x-oss-process=imagtnt e/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUxODIyMjMw,size_16,color_FFFFFF,t_70)
总结一下我们绕过类型
1.黑名单的拓展名绕过(穷举法,brup)
2.content-type绕过
3.js验证绕过(一般抓不到网络包的,都是前端过滤)
①可以直接在网页源代码中去除js过滤,或者把源码拷贝出来,写入html文件,加入action绑定源网址。
②可以抓包,修改后缀名或者在jpg内容中添加php一句话。
4.头部验证绕过
5.iis6的文件夹解析漏洞和文件名漏洞
6.00截断
7.系统特性
①上传文件1.php:.jpg的时候,会在目录下声称空白文件,我们在进行一个文件输入。filename.<<<