文件上传漏洞和绕过
文件上传漏洞:
指文件上传功能没有对上传文件做合格的过滤,导致用户可以任意上传恶意文件,从而可以链接webshell 控制后台。
文件上传功能验证流程:
客户端javascript的验证 : 即浏览器jiavascript代码对文件上传做的一次限制。
这里上传一个.php的文件,但他提示我们只能上传.gif .jpg....的文件
而burp 也并未抓取到任何的流量包,就证明 并没有发送数据给服务器,而是在客户端js代码里进行了一个文件上传的限制。
通过查看源代码发现,js对上传的文件格式做了限制,那要如何上传js文件呢?
方法1.可以使用插件 Noscript,这个插件是禁用网页中的js代码的。而我们上传文件的限制也是用js代码写的。这样我们就成功的上传我们想要上传的小马了。
方法2.既然js代码进行了上传文件格式的限制,那我们就顺着他们允许的格式进行上传,然后在bp里面做些手脚
像这样,当我们把格式该为jgp的时候,就会通过浏览器端js代码的限制,当我们把包发送至服务端的时候,利用bp的抓包,将我们发送请求拦截下来,进行修改。并发送出去,这样就会绕过js代码的限制,成功将小马传入服务器。
服务端MIME类验证:
Content-Type : 标头告诉客户端实际返回的内容的内容类型
因为Content-Type,是根据上传文件的格式来进行生成的MIME类型 例如:
然而在在服务端会对MIME进行验证,验证是否为图片(也可能是其他格式)。所以我们要对MIME进行修改为服务器认为可上传的格式
例如: 这里上传格式为.php 生产的Content-Type为:application/octet-stream,那么服务端检测到MIME格式错误,则不会允许上传。
这里我们将MIME修改为images/gif ,则成功上传了.php的文件
服务器文件内容验证:
指服务器会检查你文件内容是否存在恶意代码。
文件头: 是文件开头的一段二进制,不同的图片类型,文件头是不同的。文件头又称为文件幻数
常见的文件幻数:
如果 客户端验证 和MIME验证 都没有问题,但还是上传不了怎么办呢?
这时候就要想到服务器可能会对你的文件内容进行检测并检测出有恶意代码。所以要怎么进行绕过呢?
1.伪造文件头。
服务端文件扩展名验证:指文件后缀名的限制
黑名单: 不允许上传的文件类型
后缀名大小写绕过pHp
重写绕过phphpp
特殊可解析后缀绕过 php2 | php3 | php4 | pht | phtm | pthml
.htaccess绕过
白名单:你指允许上传的文件类型