一、漏洞描述
在uploads-labs第八关中,服务器采用了黑名单的方式过滤上传文件的后缀,黑名单中包含了所有违法的后缀。包括可以让所有文件都当php脚本执行的.htaccess配置文件。但是在验证函数中缺少deldot()函数,从字符串的尾部开始,从后向前删除点,直到该字符串的末尾字符不是点为止。可以利用在文件后缀后再加点的方式绕过检测。
二、漏洞发现
在upload-labs第八关中就是采用了黑名单验证文件后缀的方式做文件上传的限制,先在本地写php脚本若上传成功,且知道上传后文件在网站保存的路径,可通过网页访问获得服务器配置信息,命名为z.php
![](https://img-blog.csdnimg.cn/92b9b603a5aa4c78933fdd29e14e0150.png)
直接来看源码,file_exists判断文件路径是否存在,array数组函数中就是服务器的黑名单,几乎包含过滤了所有非法后缀。
trim() 函数:移除字符串两侧的空白字符或其他预定义字符。这里将上传的文件名去掉两边的字符串
strtolower()函数:将字母转换为小写。若是.PHP处理后是.php
strrchr()函数:查找一个字符c在一个字符串s中最后一次出现的位置(也就是从s的右侧开始查找字符c首次出现的位置),并返回从字符串中的字符c所在的位置开始直到字符串s结束的所有字符。 若没有找到字符c,则返回NULL。这里若上传z.php函数处理后返回.php
str_ireplace()函数:使用一个字符串替换字符串中另一些字符串,对大小写不敏感。将::$DATA转换为空
(在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,他的目的就是不检查后缀名,例如:"z.php::$DATA"Windows会自动去掉末尾的::$DATA变成"z.php")
![](https://img-blog.csdnimg.cn/02bb0c0a6dd04d57904f38b397f8c3cc.png)
经过上面的过滤,原本的文件名现在只留下文件后缀。判断文件后缀是否在上面定义的数组中,若在就不允许上传。若不在就将文件名改文件原有的名字+合法文件后缀。
$_FILES['myFile']['tmp_name'] 文件被上传后在服务端储存的临时文件名,一般是系统默认
![](https://img-blog.csdnimg.cn/32381159ace14811b81cdbaefdcac90f.png)
因为黑名单几乎包含了所有非法后缀,直接改写文件后缀是不行的。但是因为服务器没有将文件后缀最后的点过滤。可以将文件后缀改写为z.php.改写后服务器strrchr函数会取文件名最后出现的点到结尾的字符串。那就只有点一个字符,从而绕过黑名单实现绕过。又因为windows的特性当建立文件时候会自动去除文件名最后的点字符,从而上传脚本变为z.php。在liunx中不行。
三、漏洞利用
上传脚本,并用burp抓包,将文件名后面加点。上传成功,因为靶场上传后会返回给用户上传的图片,从而在响应包中得知上传路径。
![](https://img-blog.csdnimg.cn/2ded10c512be4206a881167d0a5fc328.png)
成功利用脚本,获取服务器配置信息。也可上传一句话木马,通过蚁剑,菜刀等后门工具链接获取webshell。
![](https://img-blog.csdnimg.cn/ca42699efd864c6c953fefddc5689485.png)