derek1997头像
软考中级软件设计师高频考点:DoS、ARP欺骗与IDS、IPS防御辨析封面图

软考中级软件设计师高频考点:DoS、ARP欺骗与IDS、IPS防御辨析

软考中级软件设计师高频考点:DoS、ARP欺骗与IDS、IPS防御辨析

考查题型:综合知识(选择题)。围绕攻击目标、协议位置和防护设备能力,区分 DoS/DDoS、ARP 欺骗、SQL 注入、XSS,以及 ACL、IDS、IPS、WAF 的作用边界。

做网络安全选择题时,只记住缩写很容易掉进“所有安全设备都能防所有攻击”的陷阱。更有效的顺序是:先看攻击破坏了什么,再看它发生在哪一层,最后判断防护措施有没有相应的观察和处置能力。本文用三道留存真题和一段离线日志模拟,把这条判断链走一遍。

一、从攻击目标判断:机密性、完整性还是可用性

机密性关注未经授权的人能否读到信息;完整性关注信息有没有被擅自修改;可用性关注合法用户在需要时能否使用服务。一次攻击可能同时影响多个属性,但题干问“首要目标”时,要选择最直接的那个。

题干现象优先识别主要影响
服务资源耗尽,合法请求不能得到响应拒绝服务 DoS可用性
多个来源协同造成拒绝服务分布式拒绝服务 DDoS可用性
伪造局域网 IP 与 MAC 的映射ARP 欺骗可能导致窃听、篡改或中断
数据作为 SQL 语句结构被解释SQL 注入数据库权限与数据安全
不可信内容进入浏览器的可执行上下文跨站脚本 XSS浏览器侧执行与用户会话安全

DDoS 中的“分布式”描述攻击来源和组织方式,并不是另一种病毒名称。大量正常用户同时访问也会造成负载升高,因此“请求多”不能单独证明遭遇 DDoS。考试中按给定特征判断,实际运维还需要流量、资源和业务证据。

攻击目标与防护位置对应图

真题一:拒绝服务针对哪个目标

来源:2021 年上半年软件设计师综合知识,第 8 题。题干与选项按本地卷面文本引用:

下列攻击类型中, (8) 是以被攻击对象不能继续提供服务为首要目标。
(8) A. 跨站脚本 B. 拒绝服务 C. 信息篡改 D. 口令猜测

参考答案:B。题干的“不能继续提供服务”直接对应可用性。C 的直接目标是完整性;D 主要尝试突破身份认证;A 的核心是浏览器执行不可信脚本。它们可能间接造成服务问题,但不是该定义的首要目标。

这类题先把中文现象翻译为安全属性,再与攻击名称匹配,比背诵一长串英文缩写更稳定。

二、ARP 欺骗:先看清 IP 与 MAC 的映射

IPv4 局域网中,主机发送以太网帧之前,需要确定下一跳的 MAC 地址。若目标处于同一网段,通常解析目标主机的地址;若目标位于其他网段,通常解析网关地址。不能认为“访问任何网站时,都要用 ARP 查网站服务器的 MAC”。

传统 ARP 缺少对映射声明的强身份认证,错误的映射可能进入缓存。攻击者伪造映射后,流量可能被错误转发、截获或者丢弃。ARP 欺骗与 DNS 欺骗的区别在于:前者影响 IP 到 MAC,后者影响域名到 IP 等 DNS 记录。

防护要覆盖实际工作位置:交换机支持时可使用动态 ARP 检测,结合可信 DHCP Snooping 绑定;关键设备可根据维护能力配置静态绑定;还可监控异常 MAC 变化。静态绑定需要维护,正常更换网卡或网关也可能触发异常,不能当成零成本万能措施。

HTTPS 能为合适配置下的应用通信提供保护,但它不负责修复 ARP 缓存;即使内容无法被解密,链路仍可能被丢包而不可用。看到“加密”就选为所有网络问题的答案,同样不成立。

三、ACL、IDS、IPS、WAF:过滤、检测与阻断不同

技术主要依据或观察对象常见作用不能直接推导的结论
ACL地址、协议、端口等规则允许或拒绝相应流量能理解全部业务语义
IDS流量、事件或主机行为检测异常并告警检测到就一定已阻断
IPS在线检测与处置规则在流量路径上执行阻断等动作没有误报、漏报或性能代价
WAFHTTP 等应用请求特征Web 应用攻击防护能替代安全编码或抵御全部链路攻击
防病毒软件恶意文件、行为等检测和处置恶意软件可替代所有网络访问控制

考试常用 IDS 与 IPS 的主要区别来设干扰项:典型 IDS 偏向检测、告警;典型 IPS 处于可执行阻断的位置。实际产品可能联动防火墙或组合多种能力,判断时要看题目是否给出联动条件,不能把产品扩展能力一概当成基本定义。

ACL 的规则顺序和默认动作非常重要。在“从上到下匹配、首次匹配生效”的模型中,前面的宽泛允许可能使后面的拒绝无法命中;没有匹配任何规则时,是否默认拒绝又取决于配置与实现。作答时先找题干规定,别把某厂商行为套到所有系统。

检测、阻断和Web防护的边界

真题二:出口防火墙的访问控制

来源:2022 年上半年软件设计师综合知识,第 10 题。引用原文:

10.通过在出口防火墙上配置______功能可以阻止外部未授权用户访问内部网络。
A.ACL B.SNAT C.入侵检测 D.防病毒

参考答案:A,与留存解析的答案一致。ACL 根据规则对访问流量放行或丢弃。SNAT 的直接作用是源地址转换,并不等于授权判断;入侵检测的基本定义强调发现和告警;防病毒的观察对象也不等于网络访问权限。

注意不要把 NAT 当成一整套访问控制方案。某个网络部署可能因地址转换和状态行为降低可达性,但题目问“配置哪个功能实现阻止未授权访问”,应选明确承担访问控制职责的 ACL。

四、SQL 注入和 XSS:先确定执行者

SQL 注入的关键在于应用把不可信输入拼接成 SQL 结构;XSS 的关键在于浏览器把不可信内容解释为可执行内容。题目出现“数据库语句、数据库权限”,先考虑前者;出现“浏览器、脚本、会话”,先考虑后者。

SQL 防护优先使用参数化查询,并对动态表名、排序字段等无法作为普通参数绑定的结构使用固定映射或允许列表。参数化不能自动约束过大的结果集,也不能替代数据库最小权限。XSS 防护需要结合输出上下文编码、安全模板机制等;SQL 的参数绑定不能代替 HTML 输出编码。

WAF 可以作为补充防护层,不能据此省略代码修复。只靠“过滤某几个关键词”,也不能覆盖编码、上下文和语法变化。本文不演示攻击请求,关注的是软考需要的能力边界。

真题三:SQL 注入的首要目标

来源:2021 年上半年软件设计师综合知识,第 10 题:

SQL 是一种数据库结构化查询语言,SQL 注入攻击的首要目标是 (10) 。
(10) A. 破坏Web 服务
B. 窃取用户口令等机密信息
C. 攻击用户浏览器,以获得访问权限
D. 获得数据库的权限

参考答案:D。本题按其选项的抽象层次,强调突破数据库查询或权限边界。B 是可能出现的后果,A 更贴近拒绝服务,C 更接近浏览器侧攻击。工程中 SQL 注入也可能导致修改、删除或泄露数据,不能把题目的“首要目标”理解为唯一后果。

五、贯穿案例:同一批请求经过ACL、检测器和业务服务

以下为原创离线教学案例,不发送网络请求。拓扑明确为:请求 → ACL → 检测环节 → 业务服务。检测环节分别采用“只告警的IDS模型”和“告警后丢弃的IPS模型”。真实IDS常旁路观察镜像流量,代码只是把两个部署方式的处置差异放在同一数据上对比。

业务策略是允许文档示例网段192.0.2.0/24访问443端口,但拒绝其中的.8主机。ACL按顺序首次匹配,未命中默认拒绝;这项默认动作是本例的明确约定,不代替真实设备说明书。

合成日志里同时放入正常重试、低频探测和策略禁止的访问:

事件行为应观察的边界
1、2.9同一秒正常重试频率规则可能误报正常行为
3、4.10跨两个整数秒的低频探测来源获准不等于行为安全,单秒规则可能漏检
5被单独禁止的.8访问443特例拒绝必须位于宽泛允许之前
6同网段主机访问80网段匹配并不代表端口也匹配
7其他网段访问443服务端口正确也不代表来源有权限

检测规则仅为“同源、同一整数秒的第二次事件产生告警”,用于展示机制,不是生产级入侵识别算法。scenario是事后核对的教学标签,检测器不能偷看它来决定告警。

环境:Python 3.10+,仅用标准库。保存为security_pipeline.py,运行python3 security_pipeline.py。

from collections import Counter
from dataclasses import dataclass
from ipaddress import ip_address, ip_network

@dataclass(frozen=True)
class Rule:
    action: str
    source: str
    port: int

@dataclass(frozen=True)
class Event:
    second: int
    source: str
    port: int
    scenario: str  # 合成场景标签,不是检测器可用的特征。

ALLOW = Rule('permit', '192.0.2.0/24', 443)
DENY_HOST = Rule('deny', '192.0.2.8/32', 443)
RULES = [DENY_HOST, ALLOW]

def acl(event, rules):
    for number, rule in enumerate(rules, 1):
        if ip_address(event.source) in ip_network(rule.source) and event.port == rule.port:
            return rule.action, number
    return 'deny', 0  # 本例明确定义默认拒绝。

events = [
    Event(0, '192.0.2.9', 443, 'normal_retry'),
    Event(0, '192.0.2.9', 443, 'normal_retry'),
    Event(1, '192.0.2.10', 443, 'slow_probe'),
    Event(2, '192.0.2.10', 443, 'slow_probe'),
    Event(3, '192.0.2.8', 443, 'blocked_host'),
    Event(0, '192.0.2.11', 80, 'wrong_port'),
    Event(0, '203.0.113.10', 443, 'outside_subnet'),
]

def run(mode):
    if mode not in {'IDS', 'IPS'}:
        raise ValueError('mode must be IDS or IPS')
    seen, stats, rows = Counter(), Counter(), []
    for index, event in enumerate(events, 1):
        action, rule = acl(event, RULES)
        if action == 'deny':
            stats['acl_denied'] += 1
            rows.append((index, f'ACL_DENY#{rule}'))
            continue
        stats['inspected'] += 1
        key = event.second, event.source
        seen[key] += 1
        alert = seen[key] > 1
        stats['alerts'] += int(alert)
        # 仅用于事后核对教学标签;这些标签不参与规则判断。
        stats['normal_alerts'] += int(alert and event.scenario == 'normal_retry')
        stats['probe_without_alert'] += int(not alert and event.scenario == 'slow_probe')
        if alert and mode == 'IPS':
            stats['ips_blocked'] += 1
            rows.append((index, 'IPS_BLOCK'))
        else:
            stats['delivered'] += 1
            rows.append((index, 'DELIVER_ALERT' if alert else 'DELIVER'))
    assert stats['acl_denied'] + stats['ips_blocked'] + stats['delivered'] == len(events)
    return stats, rows

ids, ids_rows = run('IDS')
ips, ips_rows = run('IPS')
assert (ids['acl_denied'], ids['alerts'], ids['delivered']) == (3, 1, 4)
assert (ips['acl_denied'], ips['ips_blocked'], ips['delivered']) == (3, 1, 3)
assert ids['normal_alerts'] == 1 and ids['probe_without_alert'] == 2
assert acl(events[4], [ALLOW, DENY_HOST]) == ('permit', 1)
assert acl(events[4], RULES) == ('deny', 1)
print('event | IDS path | IPS path')
for (index, left), (_, right) in zip(ids_rows, ips_rows):
    print(f'{index} | {left} | {right}')
print(f"IDS: ACL={ids['acl_denied']} alerts={ids['alerts']} delivered={ids['delivered']}")
print(f"IPS: ACL={ips['acl_denied']} blocked={ips['ips_blocked']} delivered={ips['delivered']}")
print(f"normal alerts={ids['normal_alerts']}; slow-probe events missed={ids['probe_without_alert']}")
print('host exception: wrong-order=permit; fixed-order=deny')

# 请求即便通过网络策略,业务层仍要隔离SQL结构与输入数据。
import sqlite3
con = sqlite3.connect(':memory:')
con.executescript("CREATE TABLE users(name TEXT); INSERT INTO users VALUES ('alice'),('bob');")
payload = "' OR 1=1 --"
unsafe = con.execute(f"SELECT name FROM users WHERE name='{payload}'").fetchall()
safe = con.execute('SELECT name FROM users WHERE name=?', (payload,)).fetchall()
assert unsafe == [('alice',), ('bob',)] and safe == []
print(f'application query: concatenated rows={len(unsafe)}; parameterized rows={len(safe)}')
con.close()

实跑输出:

event | IDS path | IPS path
1 | DELIVER | DELIVER
2 | DELIVER_ALERT | IPS_BLOCK
3 | DELIVER | DELIVER
4 | DELIVER | DELIVER
5 | ACL_DENY#1 | ACL_DENY#1
6 | ACL_DENY#0 | ACL_DENY#0
7 | ACL_DENY#0 | ACL_DENY#0
IDS: ACL=3 alerts=1 delivered=4
IPS: ACL=3 blocked=1 delivered=3
normal alerts=1; slow-probe events missed=2
host exception: wrong-order=permit; fixed-order=deny
application query: concatenated rows=2; parameterized rows=0

从输出逐项回到考点

**先检查流量守恒。**IDS路径是7条输入减去3条ACL拒绝,业务收到4条;IPS路径再减去1条检测阻断,业务收到3条。不能把“告警1次”直接当作“业务少收到1条”,也不能把ACL拒绝与IPS阻断重复计数。

再看规则顺序。.8同时属于整个/24网段。如果宽泛允许在前,首次匹配已经返回,后面的主机拒绝永远不会执行;具体拒绝在前才实现例外。这不等于“拒绝规则必须全部在允许前面”,仍应按完整策略安排优先级。

**最后核对误报和漏检。**第二条正常重试被告警,IPS甚至把它阻断,这是本例的误报代价;两个低频探测事件没有触发阈值,这是本例规则的漏检。这里的1和2只是合成数据中的事件数,不能冒充真实产品误报率或漏报率。

这些结果说明了设备职责的边界:ACL做来源和端口授权,IDS发现后能告警,IPS具备路径内阻断能力,实际效果仍取决于识别规则和部署。WAF观察HTTP语义、参数化查询隔离SQL数据与语法、动态ARP检测约束局域网映射,各自解决不同问题,不能只因都叫“防护”就互相替代。

对于出口带宽已被占满的DDoS,放在业务服务前的本地规则即便拒绝了请求,也不代表能恢复上游链路容量;这还涉及上游清洗、容量和部署位置。固定整数秒窗口、单来源计数、无连接状态也是本程序的明确局限。

网络层放行之后,应用层还要做什么

最后一行在内存数据库中复现同一个输入的两种处理。拼接字符串时,输入改变查询逻辑,返回alice、bob两行;绑定参数时,整个输入只被当成待匹配的名字,返回0行。这不是“参数化自动识别攻击”,而是SQL语句结构不再由这个数据值决定。

OWASP SQL注入防护指南明确建议将SQL结构和数据值分离,并绑定动态数据。表名、列名和排序方向等结构部分通常不能直接用值占位符代替,应使用应用控制的固定允许列表。WAF可以作为防护的一层,但不能替代代码中的参数绑定、最小权限和正确的业务授权。

IDS与IPS的架构和部署可以参考NIST SP 800-94《入侵检测与防御系统指南》。该文档发布于2007年,这里用作基础分类与部署依据,不把它当成当前产品特性清单。判断题目时,应分别确认数据是否可见、事件能否识别、设备是否位于流量路径内、是否配置阻断动作;“支持阻断”和“能准确识别所有攻击”是两个命题。

这也避免把IDS名称理解成绝对不能联动响应:旁路检测可以告警并联动其他组件处置,路径内预防可以直接丢弃流量。本文模型只固定两种动作来比较结果,真实产品功能和联动能力应以部署与配置为准。

安全选择题四步判断顺序

六、临场排除顺序

先圈出题目问的是机密性、完整性还是可用性;再确定发生在局域网、网络边界、Web 应用还是浏览器;然后比较备选技术有没有相应的观察与处置能力;最后检查题目是否要求“能够阻断”“不能防御”“首要目标”。

最容易丢分的组合是“DoS 选成病毒”“IDS 自动等于阻断”“NAT 等于授权控制”“WAF 等于代码已经安全”“ARP 查远端网站的 MAC”。把这些边界分开,比多背几个名词更有用。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/derek1997/article/details/170546965

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--