File Upload:即文件上传漏洞,通常是由于对上传文件的类型、内容没有进行严格的过滤、检查, 使得攻击者可以通过上传木马获取服务器的webshell权限,因此文件上传漏洞带来的危害常常是毁灭性的。Apache、Tomcat、Nginx等都曝出过文件上传漏洞。
相信看到文件上传四个大字,大家都知道要干什么,那就是上传文件呗,话不多说,直接就是干起来,既然是文件上传,那咱就直接上传个一句,拿下服务器的webshell。
首先,编辑一句话jerry.php:
然后,直接上传试试,发现可以直接上传,所谓只允许上传图片都是幌子:
接着,访问一下上传的jerry试试,发现没有报错:
然后,上菜刀,直接连接,拿下webshell:
接下来,就可以再提权,获取system权限,蹂躏拿到的服务器了。
首先,直接上传咱的小jerry,不好了发现报错,这次看来真的限制了只能上传规定的格式了:
然后,咱直接发jerry格式强制改变为.jpg,上传看看,发现上传成功了:
接着,访问一下jerry,看能否触发咱的一句话,报错了:jpg格式无法直接显示:
然后,不管他报错了,反正只是浏览器无法显示图片格式的文件,直接上刀连接,把菜刀的格式改为php:
结果,一首凉凉,送给你,报错了,果然上传的木马没有被执行:
怎么办呢,这时,回想起文件包含,它不是能把任意文件当做PHP文件执行么,这里可以利用一下;再回到文件包含漏洞去执行一下咱的木马,这里直接使用low级别文件包含(更多关于文件包含的学习:https://blog.csdn.net/weixin_40950781/article/details/99705039)
构造文件包含URL:
URL:?page=D:\phpStudy\PHPTutorial\WWW\DVWA\hackable\uploads\jerry.jpg
然后再用菜刀连接一下,注意三个位置的参数:
获取webshell
action two:使用burpsuite进行绕过
首先,设好代理,开启拦截
直接将filename改为“jerry.php”,让后放行:forword
发现上传成功,此时,上传到目标服务器的文件到底是什么格式呢???答案:是jerry.php
之后访问jerry.php,使得一句话被执行,再上刀连接即可。
action three:还是通过burpsuite抓包,这次使用%00截断
首先,依旧是设好代理,开启拦截:
.然后,右键发送至重放:
之后,对file那么修改,改为jerry.php%00jpg,并对%00进行url编码:
然后,放行:go,上传成功,那么通过%00截断上传的文件格式是什么呢?答案是:jerrp.php,因为在进行截断时,对%00进行了url编码。之后,访问jerry.php,再上刀连接即可。
如果在%00截断时,没有对%00进行编码,则上传的文件名为:jerry.php%00jpg,服务器会默认在%00截断,不在解析后面的部分直接解析为php文件,所以直接执行后上刀即可。
首先看几个函数:
strrpos(string,find,start):函数返回字符串find在另一字符串string中最后一次出现的位置,如果没有找到字符串则返回false,可选参数start规定在何处开始搜索。
strtolower(string):把字符串转换为小写。
getimagesize(string filename):getimagesize()函数用于获取图像大小及相关信息,成功则返回一个数组,失败则返回FALSE并产生一条E_WARNING级的错误信息。
High级别的过滤:取文件名中最后一个”.”后的字符串,通过文件名来限制文件类型因此要求上传文件名形式必须是.jpg、.jpeg 、*.png三者之一。getimagesize()函数更是限制了上传文件的文件头必须为图像类型,该级别增添了对文件头的判断。
首先,制作木马,随便找张图片,图片的大小尽量小:打开画图随便画两笔保存为a.png,通过copy制作木马
cmd命令: copy a.png/b+jian.php/a jerry.png (其中/b:表示二进制编码;/a:表示追加)
action two:这里再提供一种方法,直接将生成的jerry.png文件上传,然后回想到命令注入,可以通过命令注入,强行将jerry.png再copy到jerry.php,试一下看行不行的来。
首先,查看一下当前目录:
cmd: 127.0.0.1&&dir
然后,cd到我们上传目录并cop文件,发现真的执行成功了,现在已经获取jerry.php,只需要访问执行再上刀连接即可:
cmd :127.0.0.1&&cd D:\phpStudy\PHPTutorial\WWW\DVWA\hackable\uploads&© jerry.png jerry.php
in_get(varname):函数返回相应选项的值
imagecreatefromjpeg ( filename ):函数返回图片文件的图像标识,失败返回false
imagejpeg ( image , filename , quality):从image图像以filename为文件名创建一个JPEG图像,可选参数quality,范围从 0(最差质量,文件更小)到 100(最佳质量,文件最大)。
imagedestroy( img):函数销毁图像资源
可以看到,Impossible级别的代码对上传文件进行了重命名(为md5值,导致%00截断无法绕过过滤规则),加入Anti-CSRF token防护CSRF攻击,同时对文件的内容作了严格的检查,导致攻击者无法上传含有恶意脚本的文件。
1.直接上传;
2.通过%00截断上传;
3.文件上传+文件包含:通过文件上传规定格式,然后通过文件包含执行(默认当做php文件执行)
4.文件上传+命令注入:通过文件上传规定格式,然后通过命令注入改变文件的格式为php
1.能够成功上传木马文件;
2.上传的文件必须被执行才能被利用;
3.上传的路径必须可知
向上传文件发送包含密码参数(所谓密码就是连接木马设置的密码)的post请求,通过控制密码参数来执行不同的命令,而如果服务器将木马文件解析成了图片文件,因此向其发送post请求时,服务器只会返回这个“图片”文件,并不会执行相应命令。所以当我们用菜刀连接图片格式的木马时,总是失败。
1.设置项目目录权限:可写目录不执行,执行目录不可写
2.使用白名单机制对文件类型(mine-type)和文件后缀进行限制
3.对上传文件大小进行限制
4.文件存储到服务器时文件名称随机化,禁止使用用户上传指定的文件名称
5.针对图片文件使用压缩或重设图片像素大小
6.上传文件存放在独立服务器使用