跳到主要内容

Security AppScan Standard常见漏洞

· 阅读需 7 分钟
大刘
一个 web 开发者

已启用目录

需要关闭目录浏览索引

Apache, 进入 apache 的配置文件 httpd.conf 修改

DocumentRoot "E:/www"
<Directory "E:/www">
...
#Options Indexes FollowSymLinks Includes ExecCGI
Options FollowSymLinks Includes ExecCGI #去掉Indexes
...
</Directory>

Nginx, 编辑 nginx 配置文件 nginx.conf,修改

autoindex off;  #开启nginx目录浏览功能,on为开启,off为关闭

以上都需要重载配置文件,才生效

加密会话(SSL)Cookie 中缺少 Secure 属性(PHP)

使用 https 访问时, 需要给 cookie 加上 Secure 和 HttpOnly 属性, 但需要注意:

设置 HttpOnly=true 的 cookie 不能被 js 获取到,无法用 document.cookie 打出 cookie 的内容。

1. 设置 secure

可以看到,只要在 setcookie 第六个参数设置为 true, 就可以了

2. 设置 httponly

在 5.1 和之前的版本在 header 设置

<?php
header("Set-Cookie: hidden=value; httpOnly");

在 5.2 和更高的版本,Cookie 参数可以在 php.ini 文件中定义,如果需要设置有几个选择

1. 修改php全局配置

#1) 直接修改php.ini文件
session.cookie_httponly=true
#2) 此配置可以在php代码中使用`ini_set`函数设置
ini_set("session.cookie_httponly", 1);
#3),在调用 session_start()之前调用 session_set_cookie_params()函数设置
<?php
private function startSession($time = 3600, $ses = 'MYSES') {
session_set_cookie_params($time);
session_name($ses);
session_start();
if (isset($_COOKIE[$ses]))
#第五个参数 设置为true
setcookie($ses, $_COOKIE[$ses], time() + $time, "/", true);
}
?>

session_set_cookie_params()函数session_start() 函数

2. 在设置cookie时直接指定httponly

前面介绍在setcookie函数第7个参数 httponly 设置为 true 即可.

注意事项

setcookie的httponly参数 在 5.2.0 版本开始才有

参考:https://www.jianshu.com/p/87a72c26db2a

不安全的HTTP方法

只允许 post,get 的 http 方法

Apachehttpd.conf 添加如下配置:

<Location "/">
AllowMethods GET POST
</Location>

参考:https://httpd.apache.org/docs/2.4/mod/mod_allowmethods.html

Nginxnginx.conf 中进行如下设置

if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 403;
}

服务器端Banner泄漏

隐藏 server 信息和版本信息, nginx 配置可以参考这篇文章 nginx hide service

Apache 配置隐藏版本号, 在 httpd.conf 添加如下配置:

# 找到ServerTokens和ServerSignature并修改为:
ServerTokens Prod
ServerSignature off
# 如果没有找到ServerTokens和ServerSignature可以在最后一行添加

php 隐藏版本号,在 php.ini 中配置:

expose_php = Off;

使用伪造的 URL 设置 Referer 头

将可能干扰 CSRF 攻击的 HTTP 头除去,并使用伪造的 URL 设置 Referer 头进行访问,所以需要验证 Referer 头

这种方式只能起到简单发防护, Referer 头是可以伪造的,更推荐使用 csrf-token 表单方式进行防护

if (
isset($_SERVER['HTTP_REFERER']) &&
strpos($_SERVER['HTTP_REFERER'], $_SERVER['SERVER_NAME']) === false
) {
exit('不允许的请求');
}

关闭apache下icons目录列表

使用 apache 服务器,当我访问http://localhost/icons/时会自动显示这个目录下的所以文件列表,出于安全考虑需要关闭目录列表

目录apache/conf/extra/下的文件 httpd-autoindex.conf 修改

Alias /icons/ "/xampp/apache/icons/"
<Directory "/xampp/apache/icons">
#Options Indexes MultiViews
Options MultiViews #去掉Indexes
AllowOverride None
Require all granted
</Directory>

Flash 参数 AllowScriptAccess 已设置为 always

当显示有这个漏洞时,一般是 js 文件包了 <param name="allowscriptaccess" value="always" /> 参数,如ueditor hird-partywebuploaderwebuploader.js文件的大概6472行。一般建议修改为 <param name="allowscriptaccess" value="sameDomain" />

AppScan检测到隐藏目录

直接访问在站点根目录的 css,images 时,系统可能会返回 403 forbidden ,这时安全软件会觉得是一个不安全的方式配置。可能的话,请发出改用“404 - 找不到”响应状态代码,而不是“403 - 禁止”。这项更改会将站点的目录模糊化,可以防止泄漏站点结构。解决这个问题有两种方式,方式一是通过自定义 403 错误页面返回 404,即 403 的错误页面找不到

Nginx 在 server 模块中配置

location / {
...
error_page 403

/404;
...
}

Apachehttpd.conf 文件中配置 ErrorDocument 403 /404

方法二是在 css,image 等目录中新建一个空白的 index.html 文件即可

缺少跨帧脚本编制防御

一般使用 X-Frame-Options 防止(限制)在 iFrame 中嵌入页面,配置方法有:

PHP 代码 header('X-Frame-Options:Deny'); 或者 header('X-Frame-Options:SAMEORIGIN);//觉得用这个比较好

Nginx 配置 add_header X-Frame-Options SAMEORIGIN

Apache 配置 Header always append X-Frame-Options SAMEORIGIN

发现可高速缓存的 SSL 页面

一般建议页面标题中的“Cache-Control: no-store”和“Pragma: no-cache”或“Cache-Control: no-cache”响应伪指令来实现此操作,页面添加:

<meta http-equiv="Cache-Control" content="no-cache, no-store" />
<meta http-equiv="Pragma" content="no-cache" />

告知浏览器不缓存页面;如果需要设置响应过期日期始终为过期,则添加 <meta http-equiv="Expires" content="0"> 浏览器会在这段时间之后更新缓存里的页面。如果使用 Laravel 框架,则可以中间件添加:

return $next($request)->header('Cache-Control', 'no-cache, no-store')->header('Pragma', 'no-cache');

缺少 HTTP Strict-Transport-Security 头

Nginx 配置 add_header Strict-Transport-Security "max-age=63072000; includeSubdomains" always;

Apache 配置 Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"

缺少“Content-Security-Policy”头

页面 添加 <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">

Nginx 配置 add_header Content-Security-Policy "upgrade-insecure-requests;connect-src *";

Apache 配置 Header set Content-Security-Policy "default-src 'self';"

参考:

https://www.uedbox.com/post/56310/

https://www.cnblogs.com/hustskyking/p/upgrade-insecure-requests.html

缺少“X-Content-Type-Options”头

Nginx 配置 add_header X-Content-Type-Options nosniff;

Apache 配置 Header always set X-Content-Type-Options nosniff

缺少“X-XSS-Protection”头

页面设置 <meta http-equiv="Content-Type" content="X-XSS-Protection:1;mode=block" />

Nginx 配置 add_header X-XSS-Protection "1; mode=block";

Apache 配置 Header always append X-XSS-Protection "1;mode=block"

关于添加 HTTP 头部设,Nginx 可以参考 https://www.jdon.com/idea/htmlcss/7-http-headers-to-secure-your-app.html ,Apache 可以参考 http://itindex.net/detail/52305-apache-header-%E5%AE%89%E5%85%A8