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

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

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

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

相关文章: