防御漏洞 强化Web服务器安全

2020-12-30 11:59河南刘建臣
网络安全和信息化 2020年4期
关键词:配置文件后缀漏洞

■ 河南 刘建臣

防范Apache的常见漏洞

Apache可谓是最常见的Web服务器软件之一,它可以高效运行在几乎所有的主机平台上,可以安全可靠的将Perl/Python等解释器编译到服务器中。但Apache本身并非无懈可击,其依然存在可能被黑客恶意利用的漏洞。

例如,当访问诸如“https://www.xxx.com/hello.jpg.qqq”等网址时,在数据包的Headers头中的“Content-Type”栏中会显示“image/jepg”信息,即Apache会根据访问文件的后缀来查找对应的MIME进行解析。

Apache可以识别很多MIME类型,但它终究无法识别所有类型的文件,因此在Apache底层代码中定义了默认的规则,允许文件可以存在以点号分隔的多个后缀,当右边的后缀无法识别时,可以继续向左侧识别,直到能够找到可以识别的后缀为止。

例 如,请 求“getdata.php.ttt”文件时,对于“.ttt”后缀是无法识别的,而向左则可以识别“.php”的后缀,因此该文件就会被Apache当做PHP脚本来执行。

有些开发人员可能不知晓该问题,在设计程序时虽然对文件后缀进行上传限制,不允许上传诸如“.php”“asp”之类的文件,来防止黑客入侵。

但是黑客可能会上传“opendoor.php.xxx”之 类的文件,来避开上述限制。由于Apache不知道后缀为“xxx”文件的类型,就会向左进行识别,将其识别为“.php”文件来执行。

解决的方法很简单,打开Apache的配置文件,在其中如果发现“AddHandler application/x-httpd-php.php”行,这表示PHP添加了处理器,就会导致该漏洞的发生,因此将其删除即可杜绝该漏洞。

一些Apache服务器可能存在目录遍历漏洞,即对用户输入的文件名称没有进行完善的安全性验证,使其可以利用一些特殊字符来避开服务器的安全性检测,进而访问任意的文件,甚至可以执行各种系统命令。

默认的Apache配置文件是存在该问题的。例如,安装好Apache之后,直接在浏览器访问其根目录,是可以查看其中所有文件。为了防止该漏洞,可以打开“http.conf”文件,找到“Options+Indexes+FollowSymLinks+ExecCGI”行,将其修 改为“Options-Indexes+FollowSymLinks+ExecCGI”,就可以修改该漏洞。

防范Tomcat远程执行漏洞

Tomcat是一个轻量级的免费开放源代码的Web应用服务器,在中小型系统和并发访问较小的场景中应用较为广泛。Tomcat虽然是Apache服务器的扩展组件,但其实际作为一个与Apache独立的进程单独运行的。对于Tomcat 7.0.0-7.0.79(以及7.0.81)等版本来说,如果其运行在Windows主机上,并且启用了HTTP PUT请求方法,那么恶意用户就可通过构造请求信息,向服务器上传包含任意代码的JSP文件,造成任意代码执行,危害十分严重。

例如,打开Tomcat安装目录下的“confweb.xml”文件,其中“org.apache.catalina.servlets.DefaultServlet”栏中如果存在“readonly”和“false”行,说明开启了HTTP PUT方法,黑客可能远程上传木马文件对服务器进行非法控制。处理的方法是将Tomacat升级到最新版本,并清除上述配置项目,禁用HTTP PUT方法。

防御Tomcat的WAR部署漏洞

War包一般是在进行Web开发时,通常作为一个网站Project下所有源码的集合,里面包含前台HTML/CSS/JS的代码,也包含Java的代码。当远程部署WAR包时,可以采用多种方法实现。例如,使用XFTP工具远程复制,使用Apache Ant自动部署等。

另外,可以使用Tomcat提供的Manager来部署War包。当进入Tomcat的后台管理界面,可以显示Tomcat的应用程序列表,允许对目标项目进行管理、开启、关闭、重新加载等操作,这样在每次部署项目时无需重启Tomcat。

在项目列表下部选择“WAR file to deploy”项,选择合适的WAR文件,将其上传部署到Tomcat的项目列表中。使用该方法虽然有利于项目的使用,不过也带来了一定的安全隐患,如果登录密码过于简单,黑客就很容易登录进来,并将JSP木马打包成WAR文件,利用上述部署方式将其上传到服务器中,来对服务器进行渗透攻击。

为了避免上述问题,可以针对Tomcat创建低权限的用户,并禁止其远程登录。

例如,执行“useradd tomcat_user”,创建名 为“tomcat_user”的用户,它就会在“/home”目录下生成一个“tomcat_user”的用户目录,并生成一个名为“tomcat_userr”的用户组。执行“passwd tomcat_user”命令,可以设置密码。而执行“chown test_tomcat var/tomcat/default”命令,可以将Tomcat拥有者更改为“tomcat_user”。

执行“chgrp-R test_tomcat var/tomcat/default”命令,更改Tomcat的用户组为“test_tomcat”。执行“chmod -R g+w var/tomcat/default”命令,为目录所属组添加写的权限。

此外,还可以增加对于本地和基于证书的身份验证,部署账户锁定机制,并在“CATALINA_HOMEconfweb.xml”文件中设置锁定机制和时间超时限制。针对manager-gui/managerstatus/manager-script等目录页面设置最小权限访问限制。对于后台管理页面,可以设置复杂的密码来防止黑客轻易破解。

防御Nginx的文件解析漏洞

利用Nginx这款Web服务器软件,可以作为HTTP代理服务器和反向代理服务器,支持通过缓存加速访问,可以完成简单的负载均衡和容错,支持包过滤功能、支持SSL,可以进行自定义配置,支持虚拟主机等功能。Nginx同样存在不可忽视的文件解析漏洞,这其实是在Nginx解析文件后缀时,由于内部机制导致的问题。

例如,当访问诸如“http://www.xxx.com/fp.jpg/t.php”网址时,Nginx对提交的文件信息进行分析,发现存在PHP文件,就将其转交给PHP模块进行处理,PHP模块识别“fp.jpg/t.php”文件并不存在,便会删除其中的“t.php”,发现“fp.jpg”存在,就将其作为执行的文件,但这并不是PHP文件,就会返回“Access denied”的提示信息。对于“php.ini”配置文件来说,其中的“cgi.fix_pathinfo”的默认值为1,该参数用来设置CGI模式下是否为PHP设置绝对路径或者“PATH_PATH”信息,该值为1表示绝对路径“PATH_TRANSLATED”的值为“SCRIPT_FILENAME”,并且设置“PATH_INFO”信息。

这样,PHP模块就会根据提交的文件路径,按照上述方式进行分析。PHP5-FRM的配置文件新增了名为“security.limit_extensions”的参数,可以用来限制可执行的文件后缀。

执行“sudo find/ -name php-frm.conf”命令,来查找该配置文件,如果在其中的“security.limit_extensions”行中添 加“.jpg”等的话,那么PHP就会认为JGP也是合法的文件。当访问“http://www.xxx.com/fp.jpg/t.php”地址时,就会顺利通过。为了防御上述可能存在的解析漏洞,可以将“php.ini”文件中的“cgi.fix_pathinfo”的值设置为0,禁止PHP获取“PATH_INFO”的信息。

将“php-frm.conf”文件中的“security.limit_extensions=”栏中只保存“.php .php3 .php4 .php5.php7”等信息,让PHP只能解析指定的文件扩展名。图片最好保存到图片服务器上,使其和业务服务器分隔开。即使不能分隔,在处理上传的图片时,则仅仅对图片进行处理而不要保存。也不要提供对原图的访问,所有图片在处理时都要经过程序处理,避免黑客利用图片后缀执行非法操作。

某些版本的Nginx会将诸如“http://www.xxx.com/1.jpg/w.php”“http://www.xxx.com/1.jpg%00w.php”之类的请求解析为PHP文件执行。处理方法是将Nginx的版本号隐藏起来,打开“nginx.conf”配置文件,将其中的“server_tokens”的值设置为“off”即可。

防范Nginx的CRLF漏洞

在HTTP数据包中存在回车和换行符,如果黑客加以恶意利用,就会变成CRLF注入漏洞攻击。CRLF就是“回车+换 行”(即“ ”)的简称,其十六进制编码分别为0x0d和0x0a。在HTTP协议中,HTTP header与HTTP Body是使用两个CRLF分隔的,浏览器根据这两个CRLF来提取对应的HTTP内容并加以显示。因此黑客如果能够控制HTTP消息头中的字符,并在其中注入一些恶意的换行,就可以注入恶意的会话Cookie或HTML代码。

CRLF漏洞常出现在Location与Set-cookie消息头中。例如,有些网站会在HTTP消息头中的“Location”栏中添加“http://www.xxx.com”之类的地址,来实现页面重定向跳转操作。但如果在其中利用“%0a”字符添加了换行符,那么就会给访问者设置了一个SESSION,造成一个固定会话漏洞。

更为严重的是,如果同时注入两个CRLF就会造成反射型XSS攻击。例如,对于“http://www.xxx.com/?url=xxx”,如果黑客利用该方法构造成特殊语句,就可以形成在HTTP消息头中嵌入非法的语句,当通过浏览器进行提交时,就会造成XSS攻击。

防御CRLF漏洞的方法并不复杂,只需在设计网站程序时,对用户提交的数据进行过滤,将“" "”“" "”之类的特殊字符进行清理即可。

防御Nginx的其他漏洞

Nginx同样可能存在目录遍历漏洞,究其原因是配置不当所导致的。它的产生和配置文件“nginx.conf”中的“autoindex”参数设置相关,其默认值为“off”,即目录浏览功能处于关闭状态,进入“/etc/nginx/sitesavailable/defauot”目录,打开“nginx.conf”文件,如果发现其中的“autoindex”为“on”,就说明存在该漏洞,解决方法很简单,将其值设置为“off”即可。

因为Nginx可以作为反向代理使用,对于动态数据会被“proxy_pass”传递给后端端口,静态数据存储在“/home”目录下,该目录在URL中的名称为“files”,这样就需要设置目录的别名。例如在配置文件中存在“location/files {”“alias/home/;”“}”等内容。当访问诸如“http://www.xxx.com/files/welcome.txt”之类的网址时,就可以获取“/home/welcome.txt”文 件。但是URL中的“/files”没有添加“/”的后缀,在“alias”中的设置的“/home/”是存在该后缀的,这样就导致了访问者可以从“/home”跳转到其上层目录,造成可以下载任意文件漏洞。解决方法是在“location”和“alias”中的值都不要添加“/”后缀,或者都添加该后缀即可。

SSRF(Server-Side Request Forgery,服务器端请求伪造)是一种由攻击者构造形成由服务端发起请求的安全漏洞,一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。它是利用存在缺陷的Web应用作为代理的远程和本地的服务器,来进行渗透操作。代理服务器常常遭到此类攻击,往往是利用服务器端发起。因此可以请求到与其相连而与外网隔绝的内部系统。

例如,Nginx配置文件中就存在“proxy_pass http://IP”之类的信息,使其可以作为代理服务器使用。如果攻击者可以操控该IP,并将其修改成内网IP地址,即可造成服务端请求伪造漏洞。例如,对外网、内网、本地进行端口扫描,某些情况下端口的描述信息会显示出来,攻击者就可以借机对内网进行渗透。应对此类攻击的方法是对返回信息进行过滤,验证远程服务器对请求的响应是比较容易的方法。

如果Web应用是去获取某一种类型的文件,那么就必须在把返回结果展示给用户之前,对其进行验证处理,检测其是否符合标准。另外,对相关的错误信息进行统一化处理,避免攻击者根据错误信息来判断远端服务器的端口状态。对用户访问的端口进行限制,例如限制请求的端口为HTTP常用端口等。启用内网IP黑名单功能,避免Web应用被用来非法获取内网数据。禁用不需要的网络协议,例如仅仅允许HTTP和HTTPS请求,尽量降低安全风险。

在Nginx的Range Filter中存在整数溢出漏洞,攻击者可以通过带有特殊构造的Range的HTTP头的恶意请求引发这个整数溢出漏洞,并导致敏感信息泄露。HTTP的Range允许客户端分批次请求资源的一部分,如果服务端资源较大,可以通过Range来并发下载。如果访问资源时网络中断,可以断点续传。Range设置在HTTP请求头中。

该漏洞原理上其实就是对整数溢出漏洞的恶意利用,从Cache文件中获取Cache头的信息。在某些配置的情况下,Cache头中会存在IP地址信息,造成信息泄露。Nginx模块及常用的第三方模块本身无法通过这个整数溢出来对内存进行操作或远程执行。防御该漏洞的方法是升级Nginx版本,如果不能升级,可在Nginx配置文件中添加“max_ranges 1”行,禁用Multipart Range功能。

猜你喜欢
配置文件后缀漏洞
基于Docker的实时数据处理系统配置文件管理软件的设计与实现
漏洞
从Windows 10中删除所有网络配置文件
用软件处理Windows沙盒配置文件
互不干涉混用Chromium Edge
基于selenium的SQL注入漏洞检测方法
变阶马尔科夫模型算法实现①
倍增法之后缀数组解决重复子串的问题
漏洞在哪儿
两种方法实现非常规文本替换