文件上传漏洞-上

文件上传的各种类型
文件上传漏洞-上_第1张图片
环境搭建
使用phpstudy在windows下搭建
https://github.com/Tj1ngwe1/upload-labs
文件上传漏洞-上_第2张图片
将下载的upload-labs文件夹放入phpstudy网站www目录内
在浏览器中输入http://localhost:8081/upload-labs/文件上传漏洞-上_第3张图片
Pass-01关:客户端的JS检查
先上传一个php文件,提示该类型文件不符合要求:文件上传漏洞-上_第4张图片

开burpsuite的拦截:文件上传漏洞-上_第5张图片
并未拦截到东西,说明判断上传的地方是在前端js文件,只要绕过前端就可以上传成功php文件了。
有两种方法:禁用js文件,或者是先将php文件修改成jpg,再抓包修改回去。
第二种方法不一定会成功,要看程序是如何判断文件类型的,如果只根据文件后缀名判断,那可以直接修改后缀,如果是根据文件内容判断的,那修改文件后缀就不管用了。
通过查看源代码可知,只是判断了文件后缀名。文件上传漏洞-上_第6张图片
我们两种都试验一下,先禁用js文件。
Chrome浏览器禁用js文件的方式为:设置-隐私设置和安全-网站设置-JavaScript,关闭允许开关
火狐浏览器禁用js文件的方法:浏览器输入about:config,点击“我了解此风险!”后,搜索框中输入:javascript.enabled,双击当前页面或者右键即可修改。
禁用了js文件后,重新选择php文件并点击上传,没有提示,应该是已经上传成功了,看一下抓到的包:文件上传漏洞-上_第7张图片
上传成功了,位置在/upload/下,访问一下文件上传漏洞-上_第8张图片
再用第二种方式试验一下。
先把javascript的设置复原一下,设置好抓包工具,开启拦截,将原来的2008.php文件改为2008.jpg文件。文件上传漏洞-上_第9张图片
同样上传成功了:文件上传漏洞-上_第10张图片
Pass-02关:服务端-内容检查-白名单之MIME检查
服务端MIME类型检测是通过检测http请求包中的Content-Type字段中的值来判断上传文件是否合法。
直接上传php文件:文件上传漏洞-上_第11张图片
方法一:这一关,直接拦截请求修改文件后缀也同样能成功。
方法二:
当我们上传php文件时,可以看到请求包中的Content-Type为application/octet-stream文件上传漏洞-上_第12张图片
当我们上传jpg文件时,请求包中的Content-Type为image/jpeg文件上传漏洞-上_第13张图片
那第二种方法也出来了,直接上传php文件,但是拦截请求包,修改文件类型即可。

Pass-03:服务端-内容检查-黑名单-上传特殊后缀
直接上传php文件:文件上传漏洞-上_第14张图片
我们再使用抓包拦截修改后缀名的办法试试:文件上传漏洞-上_第15张图片
还是失败了,看来是使用了黑名单方法,那我们就绕过这些方式。
使用其他后缀名:如php1,phtml
注意,这个漏洞需要结合Apache配置不当的漏洞:将后缀为phtml的文件解析为php文件文件上传漏洞-上_第16张图片
上传:文件上传漏洞-上_第17张图片
访问成功:文件上传漏洞-上_第18张图片
Pass-04:服务端-内容检查-黑名单-上传.htaccess
直接上传php文件:文件上传漏洞-上_第19张图片
查看源码发现已经禁止了各种后缀:文件上传漏洞-上_第20张图片
这个黑名单已经很全了,但是它没有包括.htaccess文件。
.htaccess文件是什么?它的作用是什么?
.htaccess叫分布式配置文件,是Apache服务器的一个配置文件,提供了针对目录改变配置的方法。我们就利用这个文件来使得所有文件都被解析为php文件。
上传SetHandler application/x-httpd-php
意思是使该.htaccess文件所在目录及其子目录中的所有文件被Apache当做php文件。文件上传漏洞-上_第21张图片
上传后再将后缀为jpg的php文件上传,访问即可:文件上传漏洞-上_第22张图片
Pass-05:后缀大小写绕过
这一关黑名单中已经禁止了.htaccess文件:文件上传漏洞-上_第23张图片
文件上传漏洞-上_第24张图片 但是,前面的后缀都有大小写组合,.htaccess文件没有,所以可以大小混淆绕过文件上传漏洞-上_第25张图片
Pass-06:空格绕过
这一关中,已经对黑名单中的文件名大小写做了限制(统统转换为小写):文件上传漏洞-上_第26张图片
但是这关代码相对第五关少了一行代码,
f i l e e x t = t r i m ( file_ext = trim( fileext=trim(file_ext);//首尾去空
这一关没有对后缀名做去空处理:文件上传漏洞-上_第27张图片
上传后的文件名后面的空格已经自动去掉了。
Pass-07:点绕过文件上传漏洞-上_第28张图片
文件上传漏洞-上_第29张图片同样,上传后的文件名后面的点已经消失了
Pass-08:::$DATA绕过文件上传漏洞-上_第30张图片

与上一关相比,也少了一行代码:
f i l e e x t = s t r i r e p l a c e ( ′ : : file_ext = str_ireplace(':: fileext=strireplace(::DATA’, ‘’, f i l e e x t ) ; / / 去 除 字 符 串 : : file_ext);//去除字符串:: fileext);//::DATA
在windows中,php的文件名如果是正常文件名+:: D A T A , 会 把 : : DATA,会把:: DATA::DATA之后的数据当成文件流处理,不会检测后缀名,且保持:: D A T A 之 前 的 文 件 名 。 我 理 解 的 意 思 是 在 检 查 文 件 名 时 检 查 的 是 “ 文 件 名 + : : DATA之前的文件名。 我理解的意思是在检查文件名时检查的是“文件名+:: DATA+::DATA”,而在windows系统实际处理时只处理了“文件名.php”。文件上传漏洞-上_第31张图片
实际上传后的文件是1.php:文件上传漏洞-上_第32张图片
Pass-09:
直接看源码:文件上传漏洞-上_第33张图片
前面几关的限制都有了,还要怎么绕过呢?我们发现,上面的代码只有一次处理,并未递归,如果我们多加一次会怎么样?
本来想用”文件名.php…”的,但是deldot函数递归检测“点”,所以我们用“文件名.php. .”(点+空格+点):文件上传漏洞-上_第34张图片
上传后的文件成了1.php
(未完待续……)

你可能感兴趣的:(web安全,web)