网络信息系统安全检测方案设计(下)

简介: 接上一篇文章《网络信息系统安全检测方案设计(上)》。 HTTP 响应头拆分 CRLF 检测CRLF 代表回车 (CR, ASCII 13, \r) 以及换行 (LF, ASCII 10, \n),也就是”回车 + 换行”(\r\n)的意思。

接上一篇文章《网络信息系统安全检测方案设计(上)》

HTTP 响应头拆分 CRLF 检测

CRLF 代表回车 (CR, ASCII 13, \r) 以及换行 (LF, ASCII 10, \n),也就是”回车 + 换行”(\r\n)的意思。许多网络协议,包括 HTTP 同样沿用 CRLF 来表示每一行的结束。HTTP 头 header 的定义便是基于这样的"Key: Value"的结构,例如 "Location:"头用来表示重定向的URL地址,"Set-Cookie:"头用来设置 cookies。

CRLF 原理分析

HTTP 头用 CRLF 命令表示一行的结尾,这就意味着用户可以通过 CRLF 注入自定义 HTTP header。例如正常的 302 跳转是这样:

HTTP/1.1 302 Moved Temporarily
Date: Fri, 27 Jun 2014 17:52:17 GMT
Content-Type: text/html
Content-Length: 154
Connection: close
Location: http://www.qq.com

但是我们注入了一个换行,此时的返回就会变成这样:

HTTP/1.1 302 Moved Temporarily
Date: Fri, 27 Jun 2014 17:52:17 GMT
Content-Type: text/html
Content-Length: 154
Connection: close
Location: http://www.qq.com
Set-cookie: JSPSESSID=abc

这个时候这样我们就给访问者设置了一个 Session,造成一个“会话固定漏洞”。

CRLF 检测与防御

通过过滤 Response 的响应头和 Cookie 可以检测与防范大部分的 CRLF 注入。仍然是在 HttpServletResponseWrapper 中重写相关的方法。

@Override
public void addCookie(Cookie cookie) {
    if (length + cookie.getValue().length() > MAX_COOKIE_SIZE)
        return;

    if (!isInWhiteList(cookie))
        throw new RuntimeException("cookie:" + cookie.getName() + " is not in whitelist,not valid.");

    try {
        super.addCookie(CLRF.checkCookie(cookie));
        length += cookie.getValue().length();
    } catch (SecurityException e) {
        e.printStackTrace();
    }
}

@Override
public void setDateHeader(String name, long date) {
    super.setDateHeader(CLRF.filterCLRF(name), date);
}

@Override
public void setIntHeader(String name, int value) {
    super.setIntHeader(CLRF.filterCLRF(name), value);
}

@Override
public void addHeader(String name, String value) {
    super.addHeader(CLRF.filterCLRF(name), XSS.xssFilter(CLRF.filterCLRF(value), null));
}

@Override
public void setHeader(String name, String value) {
    super.setHeader(CLRF.filterCLRF(name), XSS.xssFilter(CLRF.filterCLRF(value), null));
}

上述的过滤方法如下,均是静态方法。

/**
     * 如果 cookie 名称包含 CLRF 则抛出异常;接着过滤 cookie 内容
     * @param inputCookie
     * @return
     * @throws SecurityException
     */
    public static Cookie checkCookie(Cookie inputCookie) throws SecurityException {
        if (inputCookie == null)
            return null;
    
        String name = inputCookie.getName(), value = inputCookie.getValue();
    
        if (CLRF.containCLRF(name))
            throw new SecurityException(" cookie 名称不能包含 CLRF,该 cookie 是:" + name);
    
        String newValue = CLRF.filterCLRF(value);// 已经过滤好的 Cookie value
        // 重新创建 cookie
        Cookie newCookie = new Cookie(name, newValue);
        newCookie.setComment(inputCookie.getComment());
    
        if (inputCookie.getDomain() != null)
            newCookie.setDomain(inputCookie.getDomain());
    
        newCookie.setHttpOnly(inputCookie.isHttpOnly());
        newCookie.setMaxAge(inputCookie.getMaxAge());
        newCookie.setPath(inputCookie.getPath());
        newCookie.setSecure(inputCookie.getSecure());
        newCookie.setVersion(inputCookie.getVersion());
    
        return newCookie;
    }

    /**
     * 过滤  \r 、\n之类的换行符
     * @param value
     * @return
     */
    public static String filterCLRF(String value) {
        if (value == null || value.isEmpty())
            return value;
    
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < value.length(); i++) {
            if (!(value.charAt(i) == '\r' || value.charAt(i) == '\n'))
                sb.append(value.charAt(i));
        }
        return sb.toString();
    }

    /**
     * 是否包含 \r 、\n之类的换行符
     * @param name
     * @return
     */
    public static boolean containCLRF(String name) {
        if (name == null || name.isEmpty())
            return false;
    
        for (int i = 0; i < name.length(); i++) {
            if (name.charAt(i) == '\r' || name.charAt(i) == '\n')
                return true;
        }
        return false;
    }

SQL 注入攻击

SQL 注入攻击是常见的攻击方式。所谓 SQL 注入式攻击,就是攻击者把 SQL 命令插入到 Web 表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的 SQL 命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态 SQL 命令,或作为存储过程的输入参数,这类表单特别容易受到 SQL 注入式攻击。

SQL 注入原理分析

假设我们可以通过 http://localhost/test/userinfo.php?username=plhwin 这个 URL 来访问到具体某个会员的详情,正常情况下,如果浏览器里传入的 username 是合法的,那么 SQL 语句会执行:

SELECT uid,username FROM user WHERE username='plhwin'

但是,如果用户在浏览器里把传入的 username 参数变为 plhwin';SHOW TABLES-- hack,也就是当 URL 变为 http://localhost/test/userinfo.php?username=plhwin';SHOW TABLES-- hack 的时候,此时我们程序实际执行的 SQL 语句变成了:

SELECT uid,username FROM user WHERE username='plhwin';SHOW TABLES

SQL 注入检测与防御

防止 SQL 注入有多种方法,这里介绍“使用预编译语句”和过滤器的方法。Java 中使用 PrearedStatement 的 SQL 语句如下:

String sqlString ="INSERT INTO user(id, password, name, email, address) VALUES(?, ?, ?, ?, ?)";  
PreparedStatement pstmt = connection.PreparedStatement(sqlString);  
pstmt.setString(1, user.id);  
pstmt.setString(2, user.password);  
pstmt.setString(3, user.name);  
pstmt.setString(4, user.email);  
pstmt.setString(5, user.address); 

使用占位符?代替参数,将参数与 SQL 语句分离出来,阻止了 SQL 注入。

过滤器的方法原理也十分简单,主要是通过正则匹配敏感字符串进行过滤。代码如下。

import java.io.IOException;
import java.util.Enumeration;
 
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 AntiSqlInjectionfilter implements Filter {
 
    public void destroy() {
        // TODO Auto-generated method stub
    }
     
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
    }
     
    public void doFilter(ServletRequest args0, ServletResponse args1,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req=(HttpServletRequest)args0;
        HttpServletRequest res=(HttpServletRequest)args1;
         //获得所有请求参数名
        Enumeration params = req.getParameterNames();
        String sql = "";
        while (params.hasMoreElements()) {
            //得到参数名
            String name = params.nextElement().toString();
            //System.out.println("name===========================" + name + "--");
            //得到参数对应值
            String[] value = req.getParameterValues(name);
            for (int i = 0; i < value.length; i++) {
                sql = sql + value[i];
            }
        }
        //System.out.println("============================SQL"+sql);
        //有sql关键字,跳转到error.html
        if (sqlValidate(sql)) {
            throw new IOException("您发送请求中的参数中含有非法字符");
            //String ip = req.getRemoteAddr();
        } else {
            chain.doFilter(args0,args1);
        }
    }
     
    //效验
    protected static boolean sqlValidate(String str) {
        str = str.toLowerCase();//统一转为小写
        String badStr = "'|and|exec|execute|insert|select|delete|update|count|drop|*|%|chr|mid|master|truncate|" +
                "char|declare|sitename|net user|xp_cmdshell|;|or|-|+|,|like'|and|exec|execute|insert|create|drop|" +
                "table|from|grant|use|group_concat|column_name|" +
                "information_schema.columns|table_schema|union|where|select|delete|update|order|by|count|*|" +
                "chr|mid|master|truncate|char|declare|or|;|-|--|+|,|like|//|/|%|#";//过滤掉的sql关键字,可以手动添加
        String[] badStrs = badStr.split("\\|");
        for (int i = 0; i < badStrs.length; i++) {
            if (str.indexOf(badStrs[i]) >= 0) {
                return true;
            }
        }
        return false;
    }
}

在 web.xml 文件中的配置过滤器:

<filter>
        <filter-name>antiSqlInjection</filter-name>
        <filter-class>com.abc.AntiSqlInjectionfilter</filter-class>
</filter>
<filter-mapping>
        <filter-name>antiSqlInjection</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>

结束语

本文通过相对简单的手段检测了 XSS 攻击、CSRF 攻击、CRLF  注入和 SQL 注入攻击,用户只需要配置 Servlet 过滤器即可。由于考虑的地方可能不是太周全,加上水平有限,希望可以提出指正。
目录
相关文章
|
23天前
|
安全 虚拟化
在数字化时代,网络项目的重要性日益凸显。本文从前期准备、方案内容和注意事项三个方面,详细解析了如何撰写一个优质高效的网络项目实施方案,帮助企业和用户实现更好的体验和竞争力
在数字化时代,网络项目的重要性日益凸显。本文从前期准备、方案内容和注意事项三个方面,详细解析了如何撰写一个优质高效的网络项目实施方案,帮助企业和用户实现更好的体验和竞争力。通过具体案例,展示了方案的制定和实施过程,强调了目标明确、技术先进、计划周密、风险可控和预算合理的重要性。
41 5
|
23天前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
59 2
|
1月前
|
机器学习/深度学习 计算机视觉 网络架构
【YOLO11改进 - C3k2融合】C3k2DWRSeg二次创新C3k2_DWR:扩张式残差分割网络,提高特征提取效率和多尺度信息获取能力,助力小目标检测
【YOLO11改进 - C3k2融合】C3k2DWRSeg二次创新C3k2_DWR:扩张式残差分割网络,提高特征提取效率和多尺度信息获取能力,助力小目DWRSeg是一种高效的实时语义分割网络,通过将多尺度特征提取分为区域残差化和语义残差化两步,提高了特征提取效率。它引入了Dilation-wise Residual (DWR) 和 Simple Inverted Residual (SIR) 模块,优化了不同网络阶段的感受野。在Cityscapes和CamVid数据集上的实验表明,DWRSeg在准确性和推理速度之间取得了最佳平衡,达到了72.7%的mIoU,每秒319.5帧。代码和模型已公开。
【YOLO11改进 - C3k2融合】C3k2DWRSeg二次创新C3k2_DWR:扩张式残差分割网络,提高特征提取效率和多尺度信息获取能力,助力小目标检测
|
23天前
|
安全 Linux 网络安全
nmap 是一款强大的开源网络扫描工具,能检测目标的开放端口、服务类型和操作系统等信息
nmap 是一款强大的开源网络扫描工具,能检测目标的开放端口、服务类型和操作系统等信息。本文分三部分介绍 nmap:基本原理、使用方法及技巧、实际应用及案例分析。通过学习 nmap,您可以更好地了解网络拓扑和安全状况,提升网络安全管理和渗透测试能力。
94 5
|
23天前
|
网络协议 网络安全 网络虚拟化
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算。通过这些术语的详细解释,帮助读者更好地理解和应用网络技术,应对数字化时代的挑战和机遇。
66 3
|
24天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
71 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
26天前
|
SQL 安全 算法
网络安全的隐形盾牌:漏洞防御与信息加密的艺术
【10月更文挑战第36天】在数字世界的海洋中,网络安全犹如一艘船的保护罩,守护着我们的隐私和数据安全。本文将揭开网络安全的神秘面纱,从常见的网络漏洞到先进的加密技术,再到培养必要的安全意识,我们将一步步构建起防御的堡垒。文章不仅分享技术细节,还强调了在个人和组织层面采取积极措施的重要性。
|
29天前
|
监控 安全 网络安全
企业网络安全:构建高效的信息安全管理体系
企业网络安全:构建高效的信息安全管理体系
62 5
|
29天前
|
云安全 安全 网络安全
云计算与网络安全:技术融合下的安全挑战与应对策略
【10月更文挑战第33天】在数字化转型的浪潮中,云计算作为支撑现代企业IT架构的核心,其安全性成为业界关注的焦点。本文从云计算服务的基本概念出发,探讨了云环境下的网络安全风险,并分析了信息安全的关键技术领域。通过对比传统网络环境与云端的差异,指出了云计算特有的安全挑战。文章进一步提出了一系列应对策略,旨在帮助企业和组织构建更为坚固的云安全防护体系。最后,通过一个简化的代码示例,演示了如何在云计算环境中实施基本的安全措施。
|
1月前
|
机器学习/深度学习 计算机视觉 网络架构
【YOLO11改进 - C3k2融合】C3k2融合DWRSeg二次创新C3k2_DWRSeg:扩张式残差分割网络,提高特征提取效率和多尺度信息获取能力,助力小目标检测
【YOLO11改进 - C3k2融合】C3k2融合DWRSDWRSeg是一种高效的实时语义分割网络,通过将多尺度特征提取方法分解为区域残差化和语义残差化两步,提高了多尺度信息获取的效率。网络设计了Dilation-wise Residual (DWR) 和 Simple Inverted Residual (SIR) 模块,分别用于高阶段和低阶段,以充分利用不同感受野的特征图。实验结果表明,DWRSeg在Cityscapes和CamVid数据集上表现出色,以每秒319.5帧的速度在NVIDIA GeForce GTX 1080 Ti上达到72.7%的mIoU,超越了现有方法。代码和模型已公开。