一、文件上传漏洞简介
二、使用php实现文件上传功能
三、普通上传型
我们可以看到upload先获取了file的变量,再获取了小写后的文件名获取后缀,匹配文件名后缀是不是.php,如果是就返回false,然后再设置上传限制。那么我们再通过判断文件源码发现只对上传文件的第一个file进行的过滤,如果我们上传两个文件,第一个为正常的文件,第二个为我们需要上传的文件,就可以绕过过滤,我们用python构造一个请求:
使用open读取两个文件,pure为正常文件,eval为我们想要的文件,再设置一个代理,这个代理是burp的代理,构造一个files来提交文件,通过post请求提交我们的文件,通过burp查看我们的请求有没有提交成功:
发现文件正常提交,服务器返回了file路径,但是却没有返回第二个文件的路径
uniqid()
uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID。
基于我们对php文件的了解,这个文件名应该是用时间戳来命名的,用的uniqid(),我们可以确定后缀是php,那么我们只需要爆破后三到四位就行,因为我们是同时上传的两个文件,那么两个文件的上传时间是差不多的,当uniqid两个时间差不多时,只有后几位会有变动如下图所示:
所以我们只需要爆破文件的后三到四位即可,丢进burp里面爆破了4万多次后成功获取到文件名:
也可以用python脚本一起上传后直接爆破,下面是代码: