服务器常见漏洞修复配置

本文介绍了处理应用程序错误消息的方法,包括配置500错误页面以隐藏敏感信息,以及在Tomcat和Nginx中的相应设置。此外,还详细讲解了如何防止XSS攻击,通过Java项目的过滤器XssFilter来过滤请求参数,确保Web应用的安全性。

记录一些遇见过的漏洞并处理方案备忘:应用程序错误消息,tomcat默认页面泄漏,nginx常用配置,xss攻击。

一、应用程序错误消息:

                500的报错页面,一般会把错误信息返回到页面,但是漏洞扫描过不去,

                1)配置500页面,隐藏错误信息,更改为比较友好的提示信息

                2)web.xml  添加配置:

                <error-page>
                        <error-code>500</error-code>
                        <location>/WEB-INF/500.jsp</location>
                </error-page>
                <error-page>
                        <error-code>400</error-code>
                        <location>/WEB-INF/400.jsp</location>
                </error-page>
                <error-page>
                        <error-code>404</error-code>
                        <location>/WEB-INF/404.jsp</location>
                </error-page>
                <error-page>
                        <error-code>403</error-code>
                        <location>/WEB-INF/403.jsp</location>
                </error-page>

                3)server.xml  添加配置:

<Valve className="org.apache.catalina.valves.ErrorReportValve" showReport="false" showServerInfo="false" />

二、tomcat默认页面泄漏

                删除tomcat文件夹:/webapps/ROOT(删除原来的,新建一个空的)

                                                /webapps/examples(删除)

                                                /webapps/docs(删除)

三、nginx常用配置

        upstream  pnxxxssh.mhedu.sh.cn {  #服务器集群名字   
                       server    127.0.0.1:8080  weight=90;   #访问权重
                       server    119.3.146.11:8080  weight=10;    #访问权重
            }

                   server {#80端口监听,http自动转为https
                            listen 80;
                            server_name pnxxxssh.mhedu.sh.cn;
                            rewrite ^(.*) https://$server_name$1 permanent;
                    }            

                 

 server {
    
    listen       443;
    server_name  pnxxxssh.mhedu.sh.cn;
    ssl on;
    ssl_certificate _.mhedu.sh.cn.crt; #ssl证书
        ssl_certificate_key _.mhedu.sh.cn.key;#ssl证书
        ssl_session_timeout 5m;
        ssl_protocols TLSv1.2; #使用TLS协议
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!ADH:!MD5;#加密套件的类型,ssl使用中等密码强度规则
        ssl_prefer_server_ciphers on;
        default_type 'text/html';
            charset  ISO-88509-1;

       

       location /flydi {
    proxy_pass http://pnxxxssh.mhedu.sh.cn;
        }

         

四、xss攻击:Java项目内解决

                项目web.xml:

                        <filter>
                           <filter-name>XssFilter</filter-name>
                           <filter-class>com.*****.*****.common.filter.XssFilter</filter-class>
                        </filter>
                        <filter-mapping>
                           <filter-name>XssFilter</filter-name>
                           <url-pattern>/*</url-pattern>
                           <dispatcher>REQUEST</dispatcher>
                        </filter-mapping>

XssFilter:

package com.*****.*****.common.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class XssFilter implements Filter {
    FilterConfig filterConfig = null;
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub
        this.filterConfig = filterConfig;
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // TODO Auto-generated method stub
         chain.doFilter(new XssHttpServletRequestWrapperNew(
                    (HttpServletRequest) request), response);
    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        this.filterConfig = null;
    }  

}
 

XssHttpServletRequestWrapperNew:

package com.*****.*****.common.filter;

import java.text.CharacterIterator;
import java.text.StringCharacterIterator;
import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class XssHttpServletRequestWrapperNew extends HttpServletRequestWrapper{
    HttpServletRequest orgRequest = null;

    public XssHttpServletRequestWrapperNew(HttpServletRequest request) {
        super(request);
        orgRequest = request;
    }

    /**
     * 覆盖getParameter方法,将参数名和参数值都做xss过滤。
     * 如果需要获得原始的值,则通过super.getParameterValues(name)来获取
     * getParameterNames,getParameterValues和getParameterMap也可能需要覆盖
     */
    @Override
    public String getParameter(String name) {
        String value = super.getParameter(xssEncode(name));
        if (value != null) {
            value = xssEncode(value);
            value = HTMLEncode(value);
        }
        return value;
    }

    /**
     * 对一些特殊字符进行转义
     */
    public static String HTMLEncode(String aText){
        final StringBuilder result = new StringBuilder();
        final StringCharacterIterator iterator = new StringCharacterIterator(aText);
        char character =  iterator.current();
        while (character != CharacterIterator.DONE ){
            if (character == '<') {
                result.append("&lt;");
            } else if (character == '>') {
                result.append("&gt;");
            } else if (character == '&') {
                result.append("&amp;");
            } else if (character == '\"') {
                result.append("&quot;");
            } else {
                result.append(character);
            }
            character = iterator.next();
        }
        return result.toString();
    }


    /**
     * 覆盖getHeader方法,将参数名和参数值都做xss过滤。 如果需要获得原始的值,则通过super.getHeaders(name)来获取
     * getHeaderNames 也可能需要覆盖
     */
    @Override
    public String getHeader(String name) {
        String value = super.getHeader(xssEncode(name));
        if (value != null) {
            value = xssEncode(value);
        }
        return value;
    }

    /**
     * 将容易引起xss漏洞的半角字符直接替换成全角字符
     * 目前xssProject对注入代码要求是必须开始标签和结束标签(如<script></script>)正确匹配才能解析,否则报错;因此只能替换调xssProject换为自定义实现
     * @param s
     * @return
     */
    private static String xssEncode(String s) {
        if (s == null || s.isEmpty()) {
            return s;
        }

        String result = stripXSS(s);
        if (null != result) {
            result = escape(result);
        }

        return result;

    }

    public static String escape(String s) {
        StringBuilder sb = new StringBuilder(s.length() + 16);
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            switch (c) {
                case '>':
                    sb.append('>');// 全角大于号
                    break;
                case '<':
                    sb.append('<');// 全角小于号
                    break;
                case '\'':
                    sb.append('‘');// 全角单引号
                    break;
                case '\"':
                    sb.append('“');// 全角双引号
                    break;
                case '\\':
                    sb.append('\');// 全角斜线
                    break;
                case '%':
                    sb.append('%'); // 全角冒号
                    break;
                default:
                    sb.append(c);
                    break;
            }

        }
        return sb.toString();
    }

    private static String stripXSS(String value) {
        if (value != null) {

            // Avoid null characters
            value = value.replaceAll("", "");
            // Avoid anything between script tags
            Pattern scriptPattern = Pattern.compile("<script>(.*?)</script>",
                    Pattern.CASE_INSENSITIVE);
            value = scriptPattern.matcher(value).replaceAll("");
            // Avoid anything in a src='...' type of expression
            scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'",
                    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE
                            | Pattern.DOTALL);
            value = scriptPattern.matcher(value).replaceAll("");
            scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"",
                    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE
                            | Pattern.DOTALL);
            value = scriptPattern.matcher(value).replaceAll("");
            // Remove any lonesome </script> tag
            scriptPattern = Pattern.compile("</script>",
                    Pattern.CASE_INSENSITIVE);
            value = scriptPattern.matcher(value).replaceAll("");
            // Remove any lonesome <script ...> tag
            scriptPattern = Pattern.compile("<script(.*?)>",
                    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE
                            | Pattern.DOTALL);
            value = scriptPattern.matcher(value).replaceAll("");
            // Avoid eval(...) expressions
            scriptPattern = Pattern.compile("eval\\((.*?)\\)",
                    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE
                            | Pattern.DOTALL);
            value = scriptPattern.matcher(value).replaceAll("");
            // Avoid expression(...) expressions
            scriptPattern = Pattern.compile("expression\\((.*?)\\)",
                    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE
                            | Pattern.DOTALL);
            value = scriptPattern.matcher(value).replaceAll("");
            // Avoid javascript:... expressions
            scriptPattern = Pattern.compile("javascript:",
                    Pattern.CASE_INSENSITIVE);
            value = scriptPattern.matcher(value).replaceAll("");
            // Avoid vbscript:... expressions
            scriptPattern = Pattern.compile("vbscript:",
                    Pattern.CASE_INSENSITIVE);
            value = scriptPattern.matcher(value).replaceAll("");
            // Avoid οnlοad= expressions
            scriptPattern = Pattern.compile("onload(.*?)=",
                    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE
                            | Pattern.DOTALL);
            value = scriptPattern.matcher(value).replaceAll("");

            scriptPattern = Pattern.compile("<iframe>(.*?)</iframe>",
                    Pattern.CASE_INSENSITIVE);
            value = scriptPattern.matcher(value).replaceAll("");

            scriptPattern = Pattern.compile("</iframe>",
                    Pattern.CASE_INSENSITIVE);
            value = scriptPattern.matcher(value).replaceAll("");
            // Remove any lonesome <script ...> tag
            scriptPattern = Pattern.compile("<iframe(.*?)>",
                    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE
                            | Pattern.DOTALL);
            value = scriptPattern.matcher(value).replaceAll("");
        }
        return value;
    }

    /**
     * 获取最原始的request
     *
     * @return
     */
    public HttpServletRequest getOrgRequest() {
        return orgRequest;
    }

    /**
     * 获取最原始的request的静态方法
     *
     * @return
     */
    public static HttpServletRequest getOrgRequest(HttpServletRequest req) {
        if (req instanceof XssHttpServletRequestWrapperNew) {
            return ((XssHttpServletRequestWrapperNew) req).getOrgRequest();
        }

        return req;
    }
}
 

     

             

### 部署内网漏洞修复服务器的指南 部署内网漏洞修复服务器是一个复杂但至关重要的任务,它涉及选择合适的工具、配置扫描和修复流程以及确保系统的安全性。以下是关于如何设置、配置和使用相关工具进行漏洞修复的专业建议。 #### 工具推荐 在选择漏洞修复工具时,需要考虑其功能是否能够满足内网环境的需求。以下是一些常用的漏洞扫描与修复工具: 1. **OpenVAS** OpenVAS 是一个开源的漏洞扫描平台,支持广泛的漏洞检测规则,并提供详细的报告功能。它适合用于复杂的内网环境,能够识别主机上的系统类型、补丁历史记录及配置信息[^1]。 2. **Nessus** Nessus 是一款商业化的漏洞扫描工具,具备强大的扫描能力和详细的漏洞分析报告。它支持多种协议和操作系统,能够快速发现网络中的潜在风险[^2]。 3. **Qualys** Qualys 提供基于云的漏洞管理解决方案,能够自动更新扫描规则以涵盖最新爆发的漏洞。它的无线扫描功能可以有效检测内网中未授权的设备接入问题[^1]。 4. **Metasploit** Metasploit 不仅是一个漏洞利用框架,还可以用来验证已知漏洞修复效果。通过模拟攻击,可以评估系统的安全性和修复措施的有效性。 #### 配置指南 以下是部署内网漏洞修复服务器的具体配置步骤: - **安装与初始化** 根据所选工具的要求,在内网环境中安装服务器端软件。例如,对于 OpenVAS,可以通过以下命令完成安装: ```bash sudo apt-get update sudo apt-get install openvas ``` 安装完成后,初始化数据库并启动服务。 - **配置扫描策略** 配置扫描策略时,应根据内网环境的特点选择合适的扫描模板。例如,针对 FTP 服务器漏洞扫描,可以启用特定的规则集来检测常见的 FTP 漏洞[^2]。 - **定义目标范围** 明确需要扫描的目标范围,包括所有工作站、服务器和笔记本电脑等设备。确保扫描器能够访问这些设备,并获取必要的权限以收集系统信息。 - **执行扫描与分析** 使用选定的工具执行漏洞扫描,并生成详细的报告。报告中通常会列出发现的漏洞及其严重程度,同时提供修复建议[^2]。 - **实施修复计划** 根据扫描结果制定修复计划,优先处理高危漏洞修复措施可能包括安装缺失的补丁、调整不安全的配置或升级存在漏洞的软件版本[^1]。 #### 注意事项 在部署和使用漏洞修复服务器的过程中,需要注意以下几点: - 确保扫描工具的规则库始终保持最新状态,以便及时发现新出现的漏洞。 - 在执行扫描前,通知相关人员以避免对正常业务造成影响。 - 对于关键系统,建议先在测试环境中验证修复方案后再推广到生产环境。 ```python # 示例:通过 Python 调用 OpenVAS API 进行漏洞扫描 import requests def start_scan(target_ip): url = "http://localhost:9390/omp" headers = {"Content-Type": "application/xml"} data = f""" <create_task> <name>Scan {target_ip}</name> <config id="daba56c8-73ec-11df-a475-002264764cea"/> <target id="b96abf5a-73ec-11df-a475-002264764cea"/> </create_task> """ response = requests.post(url, headers=headers, data=data) return response.text print(start_scan("192.168.1.100")) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值