什么是文件上传漏洞?
文件上传本身是一个正常的业务需求,对于网站来说,很多时候也确实需要用户将文件上传到服务器,比如:上传图片,资料。
文件上传漏洞不仅涉及上传漏洞这个行为,还涉及文件上传后的进一步解析和处理,以及文件的下载,如果服务器的处理逻辑设计的不够全面,就会导致严重的后果
最简单的文件上传漏洞是指用户上传了一个可执行的脚本文件,并且根据此脚本获得了执行服务器命令的能力。
旧版本的PHP(< PHP 5.3.4以下)还存在"\0" 字符阶段的问题,C语言以"\0"作为字符串结束符,而PHP用专门的结构体来表示字符串,结构体中存储了字符串的长度,所以PHP中的字符串允许存在"\0"字符,如果攻击者上传了一个"1.php\0.jpg"文件,PHP校验时可以通过后缀名的白名单,到那时底层的C语言库在写入文件时,将 "\0" 作为字符串结束符,实际上写入的是名为 "1.php"的文件,如果该文件被放在了公开的目录中,就相当于攻击者上传了一个webshell
注:3,4,5关我是使用phpstudy2018版本完成的,因为最新版本的无法解析我上传的文件
Pass-01(JS前端验证)
源码中提示只能上传 jpg,png,gif文件
按照题目的要求,我们上传一个图片,然后访问它的url
但是发现上传失败
这里我们就无法直接上传php文件了,查看代码后发现,只是在前端页面对输入的文件进行检查,因此可以使用下面两种方式来进行绕过上传php文件
接下来就禁用js,在上传页面 按F12,然后找到调试器,在设置中禁用js
禁用js以后再上传我们要上传的文件,就会发现上传成功
查看:右键我们上传成功的文件,复制链接,然后直接在网址栏中访问
这样就发现已经上传成功了
Pass-02(MIME验证)
查看源码,我们需要把文件类型修改为:image/jpeg
上传php文件,但是发现上传失败
上传一个png文件,发现上传成功了
接下来抓包,修改文件类型
修改之后放包,然后访问url
发现已经上传成功了
文件木马:<?php phpinfo(); ?>
Pass-03(黑名单验证,特殊后缀)
直接上传php文件,发现给出了黑名单
查看代码, 可以看到,这里对后缀为.asp .aspx .php .jsp都进行了拒绝,并且对文件中的特殊字符进行了很多的过滤,使用了很多名单的方式进行了校验,那么我们就可以上传一些没有限制的后缀,例如php3 php4 php5 phtml的文件进行上传就可以了
但是发现页面无法打开
这里去看了别人的wp,要用phpstudy2018版本的
下载好2018版本后按照下面的更改:
31. phpstudy无法解析php2、php3、phtml等文件_小皮不解析php3文件后缀-CSDN博客
记录BUG—在uploadlabs第三关中—关于phpstudy中修改httpd.conf依旧无法解析.php3d等问题_upload-labs无法解析php3-CSDN博客
如果上传的是phpinfo.php文件就会回显这个页面则为正常(如果一直解析不成功的话尝试换一下phpstudy的版本)
Pass-04(.htaccess绕过黑名单)
查看代码发现这一关的黑名单更多,那么就尝试用到.htaccess文件的方法了
具体的操作步骤:
先上传.htaccess文件,然后上传一个.png文件(因为我这里.htaccess里面解析的是.png文件)
.htaccess文件中的内容:
<FilesMatch "3.png">
SetHandler application/x-httpd-php
</FilesMatch>
注释:“3.png”可以换成你自己想要上传的符合题目要求的文件名称,只要你下一步上传相应的文件就可以了
得到这个页面就说明上传成功了
原理为:利用上传到服务器上的.htaccess文件修改当前目录下的解析规则
.htaccess常见配法有以下几种:
AddHandler php5-script .jpg
AddType application/x-httpd-php .jpg
SetHandler application/x-httpd-php
Sethandler 将该目录及子目录的所有文件均映射为php文件类型。
Addhandler 使用 php5-script 处理器来解析所匹配到的文件。
AddType 将特定扩展名文件映射为php文件类型。
.htaccess文件内容如下:
<FilesMatch "1.jpg(你要上传的文件名称)">
SetHandler application/x-httpd-php
</FilesMatch>
Pass-05
查看代码,发现和第四关对比,这关没有转换大小写的代码
这样我们就可以上传大小写混合的后缀名来进行绕过。上传一个2005.Php文件
但是上传之后发现并没有成功
又去查找了其他的方法:
upload-labs关卡5(点和空格绕过)通关思路_upload-labs第五关-CSDN博客
上传2005.php文件,然后抓包,将2005.php改为2005.php. .(这里是点+空格+点)然后上传。
原理:通过源代码可知,本关对上传文件做了检测,而且还对文件名大小写做了转换。在上传文件后先是删除文件末尾的点,然后首尾去空,去除字符串::$DATA,但是这些操作只执行一次。所以我们可以抓取数据包来修改绕过。我们在数据包中把后缀名改为.php. .,首先他发现有一个点,这时会把他去掉,又发现有一个空格,也会把它去掉,我们这时还有一个点,也就是.php. 由于他只是验证一次,所以不会在去掉我们的点。这样我们上传的文件就变成了.php文件,自然就成功上传了
然后去访问url发现就上传成功了