Frieza

MS08067安全实验室

  博客园  :: 首页  :: 新随笔  :: 联系 ::  :: 管理

常规漏洞修复方法(不定期更新)

启用了不安全的HTTP方法

利用apache服务器的rewrite功能,对TRACE请求进行拦截。编辑httpd.conf文件增加下面内容:
RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]
更详细的解释如下:
LoadModule rewrite_module modules/mod_rewrite.so # 首先,激活rewrite模块
RewriteEngine On # 启用Rewrite引擎
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK) # 对Request中的Method字段进行匹配:^TRACE 即以TRACE字符串开头
RewriteRule .* - [F] # 定义规则:对于所有格式的来源请求,均返回[F]-Forbidden响应。
对于1.3.34以上和2.0.55以上版本的apache服务器,配置文件增加:TraceEnable off
或者用如下方法:
在项目或tomcat下的web.xml中,添加如下配置:



任意名称
/*
PUT
DELETE
HEAD
OPTIONS
TRACE




BASIC

未授权访问(越权)

  1. 对当前登录用户进行权限验证。

  2. 使用session对用户的身份进行判断和控制。

    session.setAttribute("username",username);
    if((String)session.getAttribute("username")!=admin){
    (response.sendRedirect("XXX.jsp")};
    注意XXX.jsp为错误页面。

明文传输

  1. 使用正规的ca机构颁发的https证书
  2. 采用非对称加密方式(不可逆的加密方式)
  3. 建议按照网站的密级要求,需要对密码传输过程中进行加密得使用加密的方式传输,如使用HTTPS, 但加密的方式增加成本,或许会影响用户体验。如果不用 HTTPS,可以在网站前端用 Javascript 做密码加密,加密后再进行传输。

SQL注入

1、 通过参数化查询方式进行SQL注入攻击防护,参考代码:

using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand comm = new SqlCommand();
comm.Connection = conn;
//为每一条数据添加一个参数
comm.CommandText = "select COUNT(*) from Users where Password = @Password and UserName = @UserName";
comm.Parameters.AddRange(
new SqlParameter[]{
new SqlParameter("@Password", SqlDbType.VarChar) { Value = password},
new SqlParameter("@UserName", SqlDbType.VarChar) { Value = userName},});
comm.ExecuteNonQuery();
}
//以“?”等位符进行参数化查询
PreparedStatement pstmt = con.prepareStatement("select * from table where name = ?");
pstmt.setString(1, para);
ResultSet rs = pstmt.executeQuery();

  1. 使用MyBatis技术,通过Mapper.xml文件定义SQL语句进行SQL注入攻击防护,参考代码:

    //命名空间
    <select id="getById" parameterType="java.lang.String"

    resultMap="TestFlowResult">
    select




    注:在编写mybatis的映射语句时,尽量采用“#{xxx}”这样的格式。若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止sql注入攻击。

  2. 使用特殊字符过滤程序防护SQL注入攻击,参考代码:

    public static bool SqlCheck(string OldString)
    {
    bool Checkvalue = false;
    string NewString = OldString.ToLower();
    string Replace = "'|and|exec|insert|select|delete|update|count|*|;
    |%|union|chr|mid|master|truncate|char|declare|asc|cast|
    set|fetch|varchar|sysobjects|drop|alert|script|<|>";
    string[] arrReplace = Replace.Split('|');
    for (int i = 0; i < arrReplace.Length; i++)
    {
    if (NewString.IndexOf(arrReplace[i].ToString()) >= 0)
    {
    bolvalue = true;
    break;
    }
    }
    return Checkvalue;
    }

  3. 对数据库方面进行加固,来防止sql注入的产生:

    1、不要以sysadmin的身份连接数据库。而是使用特定的数据库用户,只具有读取,写入和更新数据库中适当数据的适当特权。此帐户定期检查,确定它所具有的特权。
    2、以安全的方式创建SQL。让数据库来完成创建SQL的工作,而不是在代码中完成。使用参数化SQL语句,同时也能提高查询的效率。
    3、 保证数据库用户连接信息非明文保存。

  4. 对管理方面进行加固,来防止sql注入的产生:

    1、加强编程人员良好的安全编码意识,系统地学习安全编码的知识,减少源代码泄露的风险。
    2、建立起良好的代码审核、审查体系。由专人负责代码的审计,增加安全监督环节。

redis未授权访问

到redis安装目录下,配置redis.conf文件:
1、默认只对本地开放
bind 127.0.0.1
2、添加登陆密码
修改 redis.conf 文件,添加
requirepass mypasswd
3、在需要对外开放的时候修改默认端口(端口不重复就可以)
port 2344
4、以低权限运行 Redis 服务(重启redis才能生效)
为 Redis 服务创建单独的用户和家目录,并且配置禁止登陆
5、最后还可以配合iptables限制开放

posted on 2021-03-29 10:18  Frieza_021  阅读(537)  评论(0)    收藏  举报