1. 学攻击之前,先把这个问题想明白
做安全这行久了,见得最多的不是漏洞本身,而是很多刚入门的同学把“黑客技术”和“搞破坏”画等号。今天我准备把六大类最常见的攻击技术拆开讲讲,但有一个前提必须先说清楚:这些技术本身都是中性的,关键看用在哪儿、谁授权你用。安全团队做攻防演练、渗透测试、漏洞扫描,本质上都是在用同一套攻击手法反向验证自己的防线,这才是学习这部分知识的真正意义。
你只有先假设自己会怎么被攻破,才知道防线应该建在哪个位置。比如你只知道防火墙要开80端口,却不知道开了80端口之后,后面那个服务可能带着一个历史漏洞,那这防火墙基本等于白买。攻击者不会按照你画好的攻击面去走,他会优先挑最省事的路径,一个没打补丁的服务、一个弱口令、一个没人管的测试接口,都可能是入口。
这篇文章面向的是三类人:刚入行的安全工程师、正在学网络或者做运维的同学、还有那些想转岗做安全但不知道从哪儿下手的开发者。我会把六种常见攻击技术分别拆开,说清楚它们的基本原理、攻击链路、对应的防御思路,最后给出一条可以照着走的学习路径。如果你完全没基础,可以从头读到尾;如果你已经会一点渗透工具,也可以直接跳到相关的章节看防御视角。
另外提醒一句,所有实操都要在授权的前提下进行。自己搭的虚拟机、公司明确授权的攻防演练、公开的漏洞靶场,这些都是合法的训练场所。对着没有授权的线上系统跑工具,那就不是学习,是给自己惹麻烦。
2. 第一种技术:信息收集与端口扫描,攻击者进门前必做的侦查
2.1 为什么信息收集是第一步
攻击者不可能直接撞开大门,除非这个大门本身就是敞开的。大多数入侵的第一步都是信息收集,包括域名、IP段、开放端口、服务版本、操作系统类型、应用的指纹信息等等。这一步的核心目标只有一个:搞清楚目标大概长什么样子,哪些地方值得继续试。
我见过很多初学者拿到一个授权目标之后,直接就用扫描器噼里啪啦扫一通,然后对着报告发呆。问题在于扫描器只能告诉你端口开着,不会告诉你这个端口背后跑的业务有多重要。比如说同一个8080端口,可能是一个内部管理系统,也可能是一个静态文件服务,正确的做法是先做识别,再决定要不要深入。
技术上的分类很简单:被动收集和主动探测。被动收集包括搜检公开信息、利用证书透明度、查询历史解析记录等,全程和对方服务器不发生直接接触,很难被察觉。主动探测就是我们常说的端口扫描、指纹识别,工具会真的去和服务端口握手、发探测包,对面能看到源IP和扫描流量。
2.2 端口扫描到底在扫什么
端口扫描的核心是对主机发起TCP或UDP连接尝试,根据回包判断端口状态。最常见的做法是用SYN半开扫描,只发SYN包,收到SYN+ACK就知道端口开放,然后直接发RST断开连接,这样不会留下太多完整连接的日志。
实操中比较标准的一条命令长这样:
nmap -sS -sV -O -p- 192.168.1.0/24这条命令的含义是:对目标网段做SYN扫描、探测服务版本、识别操作系统,并且扫描全部65535个端口。加了-sV之后,扫描速度会明显变慢,因为每个开放端口都需要进一步握手去拉取服务指纹,但对于后续攻击来说,版本信息比端口本身重要得多。
端口开着的真正意义在于:每一个开放端口都代表一个可接触的软件服务。服务是软件,软件就可能有漏洞。攻击者接下来要做的就是根据版本号去匹配漏洞库,找一个能直接利用的漏洞打进去。
2.3 防御视角下该怎么看待扫描
从防御方角度看,你当然不能指望攻击者不扫描,你能做的是让自己的暴露面尽量小。具体来说有三件事:
第一,关闭所有没有业务必要性的端口和服务。很多人一台服务器上装了各种辅助工具,开着几千个端口等别人来打,这些都是漏洞的温床。第二,对外暴露的服务要尽量限制来源IP,只有办公网段才能访问管理端口,这能挡掉大部分互联网上来的扫描器。第三,建立端口和服务台账,定期核对现状,凡是发现多出来的端口,立刻查清楚是谁开的。
防御端的攻击面管理,本质上就是站在攻击者的角度,把自家资产从头到尾扫一遍。这也是目前行业中比较受重视的工作方向,不少安全团队会专门搭建持续扫描系统,每天自动刷新资产清单。
3. 第二种技术:SQL注入,数据库门口的行人罗
3.1 注入的本质是身份混淆
如果你问一个做了十年安全的老人,最经典的攻击技术是什么,答案大概率是SQL注入。它已经存在二十多年了,到今天依然排在漏洞榜单的前列。
SQL注入的原理并不复杂。正常网站的搜索框、登录框、订单查询,都会把用户输入的内容拼接到数据库查询语句里。如果开发人员直接用字符串拼接的方式写SQL,攻击者就可以通过输入特定的符号,比如单引号和连接符,把原本应该作为“数据”的内容变成“代码”的一部分。
用一个最简单的逻辑来类比:就像你去银行柜台填了一张取款单,结果给对方鞠了个躬说“今天天气不错取一万块顺带把别人的账户也取了”,而柜员居然照做了,因为他没有区分你是谁和你要办什么业务。SQL注入就是攻击者利用拼接漏洞,让数据库分不清“数据”和“指令”。
3.2 为什么不法分子总盯着它不放
因为数据库里存的是最有价值的东西。账号密码、手机号、订单、身份证,甚至整个后台的权限信息都躺在数据库里。一次成功的注入,轻则拖走某个表的数据,重则直接拿到数据库管理权限,进而控制整个后台。
从一个防御者的角度去复盘这类攻击,你会发现真正危险的地方在于,很多系统建设时间早,代码里充斥着大量手写的SQL。很多老项目一接手就是一堆历史债,要修也不是不能修,但没人愿意动,怕改坏了业务。
3.3 防御方案并没有那么玄乎
现在防御SQL注入最成熟的做法就是三个字:参数化。简单说,就是不让用户输入直接参与SQL语句的拼接,而是先把SQL结构固定好,再把用户输入单独作为一个参数传进去。数据库知道哪部分是结构、哪部分是数据,注入就失去了他混淆身份的前提。
-- 常见的错误写法 SELECT * FROM users WHERE username='" + input + "'; -- 参数化之后的写法 SELECT * FROM users WHERE username = ?;除了参数化,还有一个实用的做法是给数据库账号分配最低权限。很多项目为了省事,应用账号直接用的数据库管理员权限,这一个账号能删库、能建表、能改权限。一旦注入成功,攻击者拿到的是一个高权限账号,那整个数据库都属于他了。反过来说,如果应用账号只能查指定的表,即使注入成功,攻击范围也会被大大限制。
4. 第三种技术:XSS脚本注入,最容易低估的前端安全风险
4.1 XSS为什么可怕
如果说SQL注入攻击的是后端数据库,那XSS(跨站脚本攻击)攻击的就是浏览器里的用户。它的核心手法是把恶意脚本注入到页面里,让其他用户在打开这个页面的时候,不知不觉执行了攻击者写好的脚本。
举个例子,一个论坛支持发帖,但发帖时没有过滤评论里的HTML标签。攻击者发了一篇帖子,里面藏了一段脚本,其他用户一打开帖子,脚本就在他们的浏览器里跑起来了。脚本能做什么?它可以读取当前网站的Cookie,然后把Cookie发到攻击者的服务器。很多网站靠Cookie维持用户的登录状态,拿到Cookie基本就等于拿到了这个用户的账号权限。
按XSS的触发方式,一般分成三类:反射型、存储型和DOM型。反射型需要诱导用户点击一个特定的链接,恶意脚本体现在URL参数里;存储型就是把恶意代码直接存进数据库,用户访问页面时自动触发,危害最大;DOM型则更隐蔽,纯靠前端JavaScript逻辑处理不当导致,后端根本看不到攻击流量。
4.2 前端代码那些容易被忽视的坑
我现在经常跟开发同学说一句话:所有动态渲染用户内容的地方,都要默认当作不可信数据来处理。前端拿到的每个输入、每个接口返回值,在插入DOM之前都应该做转义。
举一个最常见的坑:很多团队为了图省事,直接通过字符串拼接的方式把数据塞进HTML里,用innerHTML来渲染。只要里面包含脚本标签或者事件属性,都可能被执行。
防御方面最有效的两个手段,一个是输出编码,所有输出到页面的用户内容统一做HTML实体编码,让浏览器把它当纯文本处理;另一个是CSP(内容安全策略),通过HTTP响应头告诉浏览器哪些来源的脚本可以执行,这样即使攻击者注入了脚本,浏览器也会直接拒绝加载。
CSP配置之后,即使前端有了XSS漏洞,攻击脚本也无法从外部域名加载,损失会被限制在很小的范围内。这是很多安全团队推荐的第二道防线。
5. 第四种技术:凭证攻击与暴力破解,突破认证的长鞭
5.1 弱口令是永远的话题
聊完Web层的两大攻击,来看认证层。攻击者要进系统,要么找漏洞,要么偷凭证。事实上,在大量攻防演练的结果里,利用弱口令直接登录后台的案件远比通过复杂漏洞攻破的多得多,这就是我说凭证攻击是长鞭的原因,它不依赖系统有多老,只依赖密码有多弱。
暴力破解的逻辑很简单:不断尝试账号密码组合,直到试对为止。不过现在很多系统加了验证码、锁定策略、登录频率限制,传统意义上的纯暴力破解变得比较难了,所以大家又发展出更聪明的方式,比如字典攻击和撞库攻击。字典攻击是把常见的弱密码组合整理成一个文件,按顺序试;撞库攻击则是利用用户在其他平台已经泄露的账号密码,来尝试登录目标平台,因为很多人习惯一套密码走天下。
5.2 钓鱼更是精准的陷阱
除了直接猜密码,另一种更有效的手段是钓鱼。攻击者伪造一个和真实网站长得几乎一模一样的登录页面,诱导用户把账号密码填进去。这种攻击和系统本身的技术漏洞无关,它攻击的是人的注意力。
我现在带着做安全培训,最常讲的一个内部案例是模拟钓鱼演练。某公司自己发了一封主题为“季度绩效确认”的邮件,链接到一个模拟的工资查询系统,结果大量员工在十秒内就输入了自己的域账号密码。这里说明的不是员工素质问题,而是人的信任一旦被利用,任何技术防线都挡不住。
5.3 防御:让凭证失效的价值变小
面对凭证攻击,防御思路要分两层。第一层是让密码变得难猜,强制密码复杂度、禁止使用常见弱口令、定期更新关键系统密码。第二层是让凭证就算泄露也不能直接使用,这就是多因素认证的核心价值。
多因素认证的本质是“你知道的东西 + 你拥有的东西”。即使攻击者拿到了密码,没有手机上的动态验证码,他也登录不了。现在很多安全的系统已经默认强制开启多因素认证,甚至对内部管理员账号要求硬件密钥,这种做法非常值得推广。
6. 第五种技术:流量嗅探与中间人攻击,从网线里偷东西
6.1 数据在网络上本来就是“裸奔”的
先做一个简单的想象:你在公司咖啡厅连上Wi-Fi,打开一个网站,输入了账号密码。如果你的数据包没有加密,那同一Wi-Fi下的任何一个人都可以用工具把数据包拦截下来,然后从里面翻出你输的账号密码。这个过程就是流量嗅探。
嗅探攻击的实施门槛比很多人想象得低得多。只要和攻击目标处于同一个网段,比如同一个公共Wi-Fi,攻击者就可以利用地址解析协议的特性,在局域网内伪装成网关,让目标的流量都经过攻击者手里,这就是中间人攻击的典型手法。
6.2 为什么不再需要担心
现在HTTP明文传输的场景越来越少,所以很多人觉得中间人攻击已经过时了。其实不然,难点只是从“直接抓包”变成了“解密包内容”。如果网站用的是HTTPS,流量本身是加密的,攻击者抓到的只是一堆乱码。
但这并不意味着可以大意。中间人攻击还有两种衍生手法依然活跃:一种是通过伪造证书来劫持加密连接,前提是用户点击了浏览器上的证书警告;另一种是攻击者直接降级连接,诱导用户访问HTTP版本的站点,让加密失效。
其实这里给防御者的启示很简单:所有对外业务必须全站HTTPS,并且开启HSTS,强制浏览器只能使用HTTPS访问。同时,公共区域的Wi-Fi要做到接入认证和隔离,避免陌生设备进入同一个广播域。
7. 第六种技术:权限提升与漏洞利用,打了第一关的人
7.1 从普通用户到系统的核心
前五种技术说的都是“怎么进得来”,而权限提升解决的则是“进来了之后怎么站得更稳”。攻击者拿到Webshell或者低权限账号之后,并不会满足于只当一个普通用户,他会继续寻找操作系统层面的漏洞,尝试把权限提升到管理员甚至系统最高权限。
权限提升的思路大概是这样的:先收集当前用户和系统的基本信息,比如补丁更新情况、内核版本、有哪些高权限服务、目录下有没有敏感文件,然后根据这些信息寻找可以利用的漏洞。很多系统管理员安全意识强,给应用服务用了低权限账号,但遗憾的是没有做更多的加固,攻击者可能通过一个提权漏洞瞬间从普通用户变成管理员。
7.2 打好补丁比想象中重要
梳理所有安全事件的成因,你会发现一个反复出现的规律:漏洞利用攻击的成功,绝大多数不是因为发现了一个刚出炉的零日漏洞,而是因为目标系统的补丁很久没有更新了。新漏洞从公布到被黑客大规模利用,通常只需要几天时间,但很多系统的补丁周期是按季度甚至按年算的。
防御端最容易被忽略、又最有效的工作,就是补丁管理和配置加固。每一条具体建议都很朴素:关闭不必要的服务,删除系统的默认账号,对关键文件做完整性监控,限制内网东西向流量,采用最小权限原则管理账号。这些不花哨的措施,往往比买一堆检测系统更管用。
不过我承认,上面说的这些工作在企业里推进起来确实很痛苦。补丁更新有可能影响业务兼容性,以这个理由拖着不及时修复漏洞的情况非常普遍。在这个问题上,我的经验是不要一刀切,而是按系统的重要程度分级处理:核心业务系统先做充分测试再更新补丁,非核心系统修复优先级提高,至少把最危险的漏洞堵住。
8. 一条可以照着走的学习路径与避坑指南
8.1 学习路径:从网络基础到系统复现
这里把我的一条实际经验分享给想入门的朋友。我见过太多人一上来就顶着攻击性的名号去使用各种工具,结果连TCP握手是什么都不清楚,看到一个扫描结果也判断不出问题在哪里。所以学习路径应当是循序渐进的:
第一个阶段是网络基础。把OSI七层模型、TCP/IP协议栈、DNS解析、HTTP报文这些基础吃透。你可以用包分析工具打开抓一个正常网站访问的数据包,看看三次握手长什么样子,HTTP请求头里有哪些字段,这些基础越牢,后面理解攻击细节就越轻松。
第二个阶段是掌握操作系统和脚本语言。Linux系统的基本命令、文件权限、用户管理要熟悉,Windows下的账号体系、组策略也要了解。脚本语言建议学一门弱类型的常用脚本语言,后续分析脚本类型的攻击样本和写自动化小工具都会用到。
第三个阶段是了解Web应用工作原理。用开发框架写一个小页面,把请求、响应、会话、Cookie这些概念跑通,再去看OWASP文档里列的常见Web漏洞,就会觉得容易理解许多。这个阶段里更重要的是“自己能写能被攻击的应用”,毕竟自己搭的靶场怎么折腾都没事。
第四个阶段是学习安全工具的使用和攻击手法的组合。从基础的信息收集工具到漏洞扫描工具,再到Web抓包工具和漏洞利用框架,每个工具至少要知道它的核心功能和工作方式。工具只是手段,关键是你知道自己每一步在做什么。
第五个阶段是合法靶场实操。给自己搭一套隔离的虚拟机环境,里面有意识地部署几个有漏洞的应用,重复做从信息收集到权限提升的完整流程,然后把每一步记录成报告。
第六个阶段是参与公开发布的攻防竞赛、漏洞挖掘计划,在授权环境下和同行交流,慢慢地从模仿变成独立分析。
8.2 常见问题与实操心得
这里整理几个我在带新人时被问得最多的问题:
- 学安全要不要先学会编程。要,但不用等编程学完才开始学安全。可以先学一周的基础语法,然后边做安全练习边补编程知识,效率更高。
- 扫描工具跑不出漏洞报告,是不是安全了。不是。扫描器覆盖面有限,业务逻辑漏洞、越权问题、弱口令,很大程度上依赖人去看,不能完全依赖自动化工具。
- 靶场搭不起来怎么办。可以先从在线靶场开始练习,再逐步在本地搭建自己的实验环境。环境问题往往是配置细节没处理好,多查文档比反复重装更有价值。
- 看视频教程学会了,自己动手还是不会。停止刷视频,拿到一个目标后开始操作。安全是动手的行业,不是看会的行业。
实操中还有一些值得留意的经验:每次做完攻防练习一定要写报告,记录自己的探测路径、尝试过哪些命令、遇到了什么报错。报告即复盘,你当时踩到的坑就是以后能教给别人的干货。另一个坑是很多人只知道用图形化工具,一旦去掉界面就无从下手,学习过程中要有意识地敲命令行,把数据和逻辑搞清楚,遇到需要自动化时会更顺手。
安全攻防这行,归根结底不是比谁掌握的攻击技巧多,而是比谁更懂系统里那些不值得被信任的输入、凭证、流量和权限关系。六种常见技术讲完了,你会发现它们背后其实是同一件事:攻击者一直在寻找系统里那些“默认信任”的缺口,而防御者的职责,就是把这些缺口补上,或者至少让它们不那么容易被人利用。