一、漏洞描述
在upload-labs第十一关中,服务器脚本才用了黑名单的形式检测非法文件后缀,用了一系列函数来取得文件后缀名。使用str_ireplace()函数将非法后缀替换为空,函数意思是使用一个字符串替换另一个字符串中的一些字符,对大小写不铭感。因为只替换一次,可以采用双写文件后缀的方法绕过检测。
二、漏洞发现
先在本地写php脚本若上传成功,且知道上传后文件在网站保存的路径,可通过网页访问获得服务器配置信息,命名为z.php
直接看第十一关的代码,先用file_exists函数判断文件是否存在,array数组函数中就是服务器的黑名单,几乎包含过滤了所有非法后缀。
trim() 函数:移除字符串两侧的空白字符或其他预定义字符。这里将上传的文件名去掉两边的字符串
str_ireplace()函数:使用一个字符串替换字符串中另一些字符串,对大小写不敏感,所以不能用windows的大小写不敏感的默认属性绕过。将只要是黑名单中包含的后缀替换为空。
str_replace()函数:和str_ireplace只有一个区别,就是这个对大小写敏感。
若我将z.php上传后,通过这个函数,我的脚本文件会变得没有后缀。所以就算上传上去也没用,不可执行。
经过上面的处理,img_path定义了上传到的路径,看后面它直接将我原文件的名字做上传完成的文件名字,没有加一些什么随机数的改变。
$_FILES['myFile']['name']文件上传时候本身的名字,用户定义的名字
$_FILES['myFile']['tmp_name'] 文件被上传后在服务端储存的临时文件名,一般是系统默认
但是还是有办法绕过的,我可以将文件后缀改为z.pphphp,当通过str_ireplace函数的时候,因为从前向后遍历过滤。我的文件名字就会变为z.php。过滤的是中间的php。
三、漏洞利用
用burp抓包,将z.php改包为,z.pphphp成功绕过并且上传,因为靶场会将上传的图片文件返回展示给用户。通过响应包可得上传后的文件路径。
成功利用脚本,获取服务器配置信息。也可上传一句话木马,通过蚁剑,菜刀等后门工具链接获取webshell。