一、文件上传漏洞
⚽1.1 漏洞成因
⚽1.2 漏洞危害
⚽1.3 漏洞利用
⚽1.4 修复建议
二、upload-labs通关简记
⚽Pass-01:前端验证,js校验后缀格式
⚽Pass-02:MIME验证,只对content-type进行了检查
⚽Pass-03:黑名单验证,限制了php、jsp等文件的上传
⚽Pass-04:黑名单验证,添加限制了php3、php5等文件的上传
⚽Pass-05:黑名单验证,添加限制了.htaccess文件的上传
⚽Pass-06:黑名单验证,添加限制了.ini文件的上传
⚽Pass-07:黑名单验证,添加使用了strtolower()函数
⚽Pass-08:黑名单验证,添加使用了trim()函数
⚽Pass-09:黑名单验证,添加使用了deldot()函数
⚽Pass-10:黑名单验证
⚽Pass-11:黑名单验证
⚽Pass-12:白名单验证
⚽Pass-13:白名单验证
⚽Pass-14:图片马上传,文件包含
⚽Pass-15:图片马上传,文件包含,添加了getimagesize函数
⚽Pass-16:图片马上传,文件包含,添加了exif_imagetype()函数
三、补充资料
⚽3.1 .user.ini绕过
⚽3.2 %00截断绕过前提条件
文件上传漏洞的成因(复杂),一方面,Web应用开放了文件上传功能,并且对上传的文件没有进行足够的限制;另一方面,程序开发部署时候,没有考虑到系统特性和过滤不严格;再者就是,攻击者通过Web服务器解析漏洞绕过限制,导致可以上传任意文件。
(1)文件上传漏洞最直接的威胁就是上传任意文件,包括恶意脚本、可执行程序等。
(2)如果web服务器所保存上传文件的可写目录具有执行权限,那么就可以直接上传后门文件,导致网站沦陷。
(3)如果攻击者通过其他漏洞进行提权操纵,拿到系统管理权限,那么直接导致服务器沦陷。
(4)同服务器下的其他网站无一幸免,均会被攻击者控制。
文件上传漏洞利用需要一定的条件的:
(1)Web服务器要开启文件上传功能,并且上传api(接口)对外“开放”(Web 用户可以访问);(2)Web用户对目标目录具有可写权限,甚至具有执行权限,一般情况下,Web目录都有执行权限。
(3)要想完美利用文件上传漏洞,就是上传的文件可以执行,也就是Web容器可以解析我们上传的脚本,无论脚本以什么样的形式存在。
(1)对上传的文件在服务器上存储时进行重命名
(2)检查上传文件的类型和大小
(3)禁止上传危险的文件类型,如jsp jar war等
(4)只接受指定类型的文件
绕过方法:
上传时将php文件后缀改为允许的格式,如jpg,再利用burpsuite拦截数据包,修改后缀为php重新上传即可
绕过方法:
同Pass-01,或者直接上传php文件然后拦截数据包修改content-type为允许的格式,如image/png
绕过方法:
(1)可以使用php3、php5、phtml等后缀绕过上传,但是需要配置httpd.conf文件中的#AddType application/x-httpd-php .php .phtml为AddType application/x-httpd-php .php .phtml .php3 .php5,并且注意要去掉#;
(2).htaccess文件绕过,文件内写入语句SetHandler application/x-httpd-php,意为将所有文件均解析为PHP文件
绕过方法:
.htaccess文件绕过
绕过方法:
(1).user.ini文件绕过(要求php版本大于等于5.3.0版本且为nts版本),新建一个.user.ini文件并写入内容:auto_append_file=test.txt或者auto_prepend_file=test.txt(其中test.txt文件为木马文件),然后上传该文件和test.txt文件,再访问上传目录下的readme.php,即可将test.txt内的内容脚本正常执行;
(2)修改后缀为“php. .”(php点空格点)即可绕过
绕过方法:
大小写绕过,虽然过滤了很多类容,但是没有使用strtolower()函数,因此可使用大小写绕过黑名单
绕过方法:
空格绕过,发现其未使用trim()函数(此函数的作用即为去除文件名前后的空格),因此可以使用空格绕过黑名单
绕过方法:
点号绕过,发现其未使用deldot()函数(此函数的作用即为去除文件名末尾的点),因此可以使用点号绕过黑名单
绕过方法:
特殊字符::$DATA绕过,发现其对::$DATA进行处理,因此可以在文件名末尾添加字符串::$DATA绕过
绕过方法:
点空格点绕过,使用了deldot()函数去除文件名末尾的点,但是该函数是从后向前检测,遇到空格时会停止,因此可以在文件名末尾添加点空格点绕过
绕过方法:
双写绕过,使用了str_replace()函数检测黑名单存在的字符串并替换,因此可以使用一双学绕过黑名单
绕过方法:
%00截断绕过(GET型),在文件上传路径后添加文件名+%00,并修改filename为允许的文件后缀,上传成功后直接访问在文件上传路径后添加的文件名即可
绕过方法:
%00截断绕过(POST型),在文件上传路径后添加文件名+%00,并且对%00进行url解码,并修改filename为允许的文件后缀,上传成功后直接访问在文件上传路径后添加的文件名即可
绕过方法:
利用copy命令将图片与木马文件融合为图片马,上传成功后利用文件包含漏洞执行
绕过方法:
getimagesize()函数会读取目标文件的文件头来判断是否为图片文件,因此任可使用Pass-14的图片马进行绕过
绕过方法:
exif_imagetype()函数读取图像的第一个字节并检查后缀,速度比getimagesize()函数快得到,但需要开启php_exif模块,任可使用Pass-14的图片马进行绕过
配置文件(php.ini)在 PHP 启动时被读取。对于服务器模块版本的 PHP,仅在 web 服务器启动时读取一次。对于 CGI 和 CLI 版本,每次调用都会读取。除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。
自php5.3.0起,PHP支持基于每个目录的.htaccess风格的INI文件。此类文件仅被CGI/Fastcgi sapi处理。两个新的 INI 指令, user_ini.filename 和 user_ini.cache_ttl 控制着用户 INI 文件的使用。
user_ini.filename 设定了 PHP 会在每个目录下搜寻的文件名;如果设定为空字符串则 PHP 不会搜寻。默认值是 .user.ini。
user_ini.cache_ttl 控制着重新读取用户 INI 文件的间隔时间。默认是 300 秒(5 分钟)
.user.ini实际上就是一个可以由用户”自定义“的php.ini,我们能够自定义的设置是模式为“PHP_INI_PERDIR 、 PHP_INI_USER”的设置
有两个配置,可以用来制造后门:
auto_append_file ; 指定一个文件,自动包含在要执行的文件前。
auto_prepend_file ; 指定一个文件,自动包含在要执行的文件后。
使用.user.ini解析漏洞的前提条件:
a.服务器脚本语言为php
b.服务器使用cgi/fastcgi模式,即nts版本
c.上传目录下有可被执行的php文件
a.php版本小于5.3
b.关闭magic_quotes_gpc魔术函数