多解析特性
在Apache1.x,2.x中Apache 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。因此对于apache而言,一个test.php.qwea文件依然会将其解析为php。如果所有的后缀apache都不认识,那么就会把该文件当做默认的类型,一般来说默认类型就是text/plain。
哪些后缀apache认识呢?在window中的认识的后缀都记录在/apche/conf/mine.types中,在Ubuntu下在/etc/mime.types,
多解析特性带来的危害
网站如果存在用户上传文件的功能那么会检查用户上传的文件的后缀,但是如果后端代码只看文件名最后面一个点后面的格式,比如code.php.qwe,按程序执行会检查到.qwe,不是黑名单里面的格式,那么就会允许上传,但在Apache解析的时候以.php为准,就会把改文件当成php解析执行。
处理方法
我们的处理方式是:后缀验证尽量使用白名单的方式,这样即使使用不存在的后缀名,也无法绕过。
看test.jpg.aaa和aaa.php.xxx如何执行
浏览器为何认为test.jpg.aaa是图片呢?aaa可不是图片文件的后缀。这是因为服务器的响应HTTP头中的Content-Type字段值为image/jpeg,浏览器看到image/jpeg,便知这是图片文件。这说明服务器(此处即Apache)是把test.jpg.aaa当做图片的,也说明,前面分析的Apache的多后缀处理是没有错的。
aaa.php.xxx为何没有被作为php代码执行呢?Apache看到文件aaa.php.xxx,按照多后缀名的解析规则,认为该文件是php程序文件,把该文件作为php程序文件处理。怎么处理呢?交给php解释器,Apache本身并不懂php。而php解释器却有着和Apache不同的后缀解析规则,可能只认最后一个后缀,故而认为aaa.php.xxx不是php程序文件,拒绝执行。在我的测试环境中,php以模块(module)的模式工作于Apache的领导下。这种模式下php接受到领导Apache分配的任务——aaa.php.xxx,一看,不是php程序文件,没法执行,但也没有报错,而是返回了文件内容本身。php还可以以FASTCGI的模式工作于Apache中,此种模式下php遇到类似aaa.php.xxx这种不是php程序的文件,会触发500错误。Apache配置文件中会有
.+.ph(p[345]?|t|tml)
此类的正则表达式,被当php程序执行的文件名要符合正则表达式
.htaccess
要想使.htaccess文件生效,需要两个条件,一是在Apache的配置文件中写上:
AllowOverride All
若这样写则.htaccess不会生效:
AllowOverride None
二是Apache要加载mod_Rewrite模块。加载该模块,需要在Apache的配置文件中写上:
LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
若是在Ubuntu中,可能还需要执行命令:
sudo a2enmod rewrite
配置完后需要重启Apache。
需要注意Apache可能有多个配置文件,后加载的配置文件会覆盖先加载的配置文件中的配置。所以在某个配置文件中将AllowOverride设置成All,若是其后加载的某个配置文件中AllowOverride的设置是None,则也是没有用的。一般来说,先加载httpd.conf,再加载conf.d/中的配置文件,最后加载sites-enabled/中的配置文件。
.htaccess文件可以配置很多事情,如是否开启站点的图片缓存、自定义错误页面、自定义默认文档、设置WWW域名重定向、设置网页重定向、设置图片防盗链和访问权限控制。但我们这里只关心.htaccess文件的一个作用——MIME类型修改。如在.htaccess文件中写入:
AddType application/x-httpd-php xxx
就成功地使该.htaccess文件所在目录及其子目录中的后缀为.xxx的文件被Apache当做php文件。另一种写法是:
<FilesMatch "shell.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
该语句会让Apache把shell.jpg文件解析为php文件。
参考链接
https://blog.csdn.net/wn314/article/details/77074477
https://www.smi1e.top/文件解析漏洞总结/