本文介绍一下小型Web应用的加固方案,内容均为原创

0x00 配置管理安全

即使在存在某些高危漏洞的情况下,我们只要做好配置方面的安全加固即可防御许多攻击。

列目录 - 显示目录索引

Apache

修改站点目录对应的配置文件

列出目录索引

<Directory />
    Options +Indexes +FollowSymLinks # 将 "+" 与 Indexes 去掉即可限制列出目录索引
    AllowOverride All
    Order allow,deny
    Allow from all
    Require all granted
</Directory>

修改后:

<Directory />
    Options FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
    Require all granted
</Directory>

不列出目录索引

创建DirectoryIndex默认文件

大家都见过很多框架的每个目录都有一个index.html文件,这个文件的存在是非常有意义的,很多线上的Web服务器都没有合格配置列出目录索引。导致网站内部许多文件都被攻击者查看到,泄漏大量信息。

为了防止列出目录索引,我们可以在站点的每个文件夹中创建一个index.html,这个文件内容是什么都无所谓了。当攻击者想通过列目录的手法访问你站点文件夹的时候,Web服务器将会判断当前目录下有没有DirectoryIndex默认首页,如果存在就显示DirectoryIndex对应的文件名的内容,这样攻击者就无法查看该目录下有什么文件了。

Tomcat

修改conf/web.xml配置文件

列出目录索引

<init-param>
            <param-name>listings</param-name> 
            <param-value>true</param-value> <!-- 将true改为false -->
</init-param>

修改后:

<init-param>
            <param-name>listings</param-name> 
            <param-value>false</param-value>
</init-param>

不列出目录索引

Nginx

修改conf/nginx.conf配置文件

列出目录索引

location / {
            index  index.html index.htm index.php l.php;
           autoindex on;  
}

修改后:

location / {
            index  index.html index.htm index.php l.php;
           autoindex off;  
}

不列出目录索引

IIS

设置”目录浏览”权限

列出目录索引

设置目录索引

不列出目录索引

隐藏服务器版本信息

Apache

存在信息

将以下配置加入conf/httpd.conf

ServerTokens Prod
ServerSignature Off

不存在信息

PHP

修改php.ini,将expose_php On改为:expose_php Off

IIS

找到HTTP响应头设置响应报文内容,可以将ASP.NET随意更改,甚至删除

IIS

Nginx

存在信息

在加入conf/nginx.conf一行:

server_tokens off;

不存在信息

Tomcat

存在信息

到apache-tomcat安装目录下的lib子文件夹,找到catalina.jar这包,并进行解解压

修改:lib\catalina.zip\org\apache\catalina\util\ServerInfo.properties

server.info=X
server.number=5.5
server.built=Dec 1 2015 22:30:46 UTC

更改文件

或者直接更改web.xml,找到Connector,添加一个server属性:

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" server="IIS Server" />

目录安全

攻击者上传恶意脚本(Webshell)到服务器端后,该脚本会被当做可信任的代码执行,这并不是我们想看到的。

Apache

脚本被执行

更改配置文件:

<Directory "C:/phpstudy2/WWW/uploads">
    <FilesMatch "\.(?i:php|php3|php4|php5)$"> 
    Order allow,deny
    Deny from all
    </FilesMatch>
</Directory>

C:/phpstudy2/WWW/uploads 为要禁止执行的目录,\.(?i:php|php3|php4|php5)$中可以添加多个文件扩展名,例如:.htaccess

脚本不执行

上面的方法已经杜绝了Webshell的执行,但是如果 - 在根目录创建 .htaccess分布式部署文件,也能够执行脚本。

服务器端配置必须满足以下三个条件:

  • 能够在目录中写入任意文件
  • AllowOverride 为 All
  • 开启modules/mod_rewrite.so

脚本被执行

我们现在先来做一个加固:

<Files ~ "^.(htaccess|htpasswd)$">
deny from all
</Files>

禁止所有人访问.htaccess.htpasswd文件。

接下来要做的就是设置AllowOverrideNone

脚本不执行

Nginx

脚本被执行

location ~* ^/uploads/.*.(php|php5)$ {
      deny all;
}

注意事项:

  • $ 与 { 之间有空格
  • 以上的配置文件代码需要放到 location ~ .php {...}上面,如果放到下面是无效的
  • uploads需要写相对路径,不能写绝对路径
  • 修改后重启Nginx

脚本不执行

IIS

脚本被执行

设置处理程序映射即可:

设置脚本不执行

设置后:

脚本不执行

Tomcat

可以采用Apache配置,后续再更新关于Tomcat的配置