跳到主要内容

Security AppScan Standard常见漏洞

· 阅读需 7 分钟
lzw.

已启用目录

需要关闭目录浏览索引

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方法

Apache在httpd.conf添加如下配置:

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

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

Nginx在nginx.conf中进行如下设置

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

服务器端Banner泄漏

隐藏server信息和版本信息, nginx配置可以参考这篇文章 https://lzwdot.github.io/docusaurus/blog/22789

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 在 sever 模块中配置

location / {
...
error_page 403 /404;
...
}

Apache 在 httpd.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