一、漏洞描述
htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。在upload-labs第四关中服务器使用了黑名单检测文件后缀是否合法,几乎黑名单里面覆盖了所有违规的后缀名,但是没有过滤.htaccess。通过先上传自定义的.htaccess,让所有文件都用php解析。再上传.jpg的文件,直接利用。
二、漏洞发现
在upload-labs第四关中就是采用了黑名单验证文件后缀的方式做文件上传的限制,先在本地写php脚本若上传成功,且知道上传后文件在网站保存的路径,可通过网页访问获得服务器配置信息,命名为z.php
直接看源码,file_exists判断文件路径是否存在,array数组函数中就是服务器的黑名单,几乎包含过滤了所有非法后缀。
但是没有过滤.htaccess
trim() 函数:移除字符串两侧的空白字符或其他预定义字符。这里将上传的文件名去掉两边的字符串
deldot()靶场自定义函数:从字符串的尾部开始,从后向前删除点.,直到该字符串的末尾字符不是.为止。
strrchr()函数:查找一个字符c在一个字符串s中最后一次出现的位置(也就是从s的右侧开始查找字符c首次出现的位置),并返回从字符串中的字符c所在的位置开始直到字符串s结束的所有字符。 若没有找到字符c,则返回NULL。这里若上传z.php函数处理后返回.php
strtolower()函数:将字母转换为小写。若是.PHP处理后是.php
str_ireplace()函数:使用一个字符串替换字符串中另一些字符串,对大小写不敏感。将::$DATA转换为空
(在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,他的目的就是不检查后缀名,例如:"z.php::$DATA"Windows会自动去掉末尾的::$DATA变成"z.php")
经过上面的过滤,原本的文件名现在只留下文件后缀。判断文件后缀是否在上面定义的数组中,若在就不允许上传。若不在就将文件名改原有文件的名字。
$_FILES['myFile']['tmp_name'] 文件被上传后在服务端储存的临时文件名,一般是系统默认
虽然基本过滤了所有非法后缀,但是没有过滤.htaccess。
前提:目标服务器apache必须开启mod_rewrite模块,和AllowOverride ALL。都在apache的httpd.conf文件中
mod_rewrite模块:mod_rewrite是Apache的一个模块,此模块可以操作URL的所有部分(包括路径信息部分),在服务器级的(httpd.conf)和目录级的(.htaccess)配置都有效,还可以生成最终请求字符串。此重写操作的结果可以是内部子处理,也可以是外部请求的转向,甚至还可以是内部代理处理。
AllowOverride ALL:在 AllowOverride 设置为 None 时, .htaccess 文件将被完全忽略。当此指令设置为 All 时,所有具有 ".htaccess" 作用域的指令都允许出现在 .htaccess 文件中。
写文件,意思是将该目录和子目录下的所有文件都当php执行
三、漏洞利用
将.htaccess直接上传,再将z.php改为.jpg后缀。再上传。上传成功。这里返回的上传的图片,因为上传的不是真正的图片,所以解析错误也不显示。
通过图片前端的链接可知文件的路径。直接访问,利用成功,显示服务器配置信息