1. 先从一件小事说起:为什么你总觉得黑客离你很远,又很近做安全攻防这些年,被问最多的一句话,既不是某个新漏洞的技术细节,也不是某个安全产品的配置方法,而是特别朴素的一句:黑客到底是怎么打进来的?每次听到这个问题,我都觉得一两句话很难讲清,因为攻击往往不是单一的一招,而是一条完整的链路。但反过来想,只要我们把这些最常见的手法逐个拆开,就会发现那些听起来唬人的名词,底层逻辑一点都不复杂。这篇文章里的7种攻击——SQL注入、XSS、CSRF、文件上传漏洞、目录遍历与敏感文件泄露、暴力破解与弱口令、DDoS——几乎覆盖了普通人能听到的大部分攻击类型。它们分别对应着偷数据、偷身份、开后门、翻底牌、猜密码、搞瘫服务这几件事。不管你是做开发的、做运维的、做测试的,还是单纯对黑客技术感到好奇的网友,把这7种攻击理解透,你就拿到了看懂安全圈大部分新闻的地基,往后自己排查系统也会更有方向。1.1 一次典型攻击的真实样子我先描述一个场景:某天,一家小公司的客服系统突然登录不上了。运维登上去一看,数据库里的客户信息被导走了,后台多了一个陌生账号,服务器上还跑着一个奇怪的进程。这一连串事情看着像闯空门,但拆开看就是典型的组合拳:先用弱口令猜到后台密码,登录后找到文件上传功能放了一个脚本,脚本被服务器执行后拿到系统权限,最后通过数据库备份功能把资料导走。你会发现,中间每一步用到的都是这篇文章要讲的“基础知识”。攻击者不是什么神人,他只是把几个常见问题串成了一条路。所以要理解黑客,先别急着背漏洞编号、记利用代码,把每种攻击“为什么能成功”想明白,比什么都强。1.2 7种攻击的共同逻辑这些攻击方式五花八门,但底层都有一个共同逻辑:攻击者总在寻找“信任边界”被打破的地方。网站信任了不该信任的用户输入,程序信任了不该信任的上传文件,用户信任了不该信任的链接,服务器暴露了不该暴露的信息。攻击者的工作,就是找到这份信任的边界在哪里,然后一脚踩过去。后面的内容,全都是围绕“边界失控”这四个字展开的。2. 7种攻击一次分清:一张表看明白每种攻击的“坏心思”2.1 攻击目标决定攻击方式不管攻击手法怎么变化,目的无非三种:偷数据、偷身份、搞瘫痪。偷数据主要面向数据库、文件、配置信息;偷身份面向账号体系;搞瘫痪则是让你无法对外服务。目的不同,攻击者会用完全不同的手段,上手前先把这个前提搞清楚,再去理解每种攻击就会清晰很多。这里要特别强调一点:攻击者不是一台机器,而是一个有耐心、有目标的人。他会先判断目标的“价值”在哪里,再决定用什么手段。一个只有静态页面的小博客和一家存着大量订单数据的电商平台,在攻击者眼里完全是两种东西。所以你会发现,有些攻击手法“低级”但天天有人用,因为它对某些目标特别有效。2.2 7种常见攻击速查表攻击类型通俗说法主要目标最后一击SQL注入让数据库把用户输入当命令执行数据库里的数据拖库、删库、改数据XSS在别人浏览器里跑你的脚本网站用户盗登录态、钓鱼、键盘记录CSRF借你的身份发请求已登录用户替你转账、改设置、发帖文件上传漏洞把一个可执行文件传上服务器网站服务器拿到服务器控制权目录遍历与敏感文件泄露看到不该看的文件源码、配置、备份为下一步攻击提供弹药暴力破解与弱口令一次一次试密码登录入口接管账号DDoS用海量请求堵死服务网站可用性服务宕机、业务停摆这张表建议收藏,后面每一类我都会拆开讲原理,也会聊到现实里最容易被忽视的细节。因为你光知道“有这种攻击”没用,得能判断自己的系统最容易栽在哪一类。2.3 攻击不是孤立行为攻击者很少只用一招。通常第一步是收集信息,可能是目录遍历、信息泄露;第二步是寻找入口,可能是弱口令、SQL注入;第三步是扩大战果,可能是文件上传、提权、横向移动。这篇文章先逐个讲清楚,后面我会专门把它们串成一条完整攻击链,那样你回头看这张表,会有更立体的感觉。3. SQL注入:数据库把用户输入当成了命令3.1 用登录场景拆解SQL注入SQL注入一句话原理:本该作为“数据”传进来的内容,被网站拼进了SQL语句,最后被数据库当成“命令”执行了。你品一下这句话,攻击的本质是数据和代码的边界被打破。正常情况下,用户输入只是数据,数据库只负责把它存进去或者查出来;可一旦开发人员把用户输入直接拼进SQL语句,用户输入就有了“代码”的资格。举个最典型的例子。一个登录框的查询本来是这样的:SELECT * FROM user WHERE name='用户名' AND password='密码'如果开发人员图省事,直接拿用户输入拼SQL,那他输入用户名时填了:admin' OR '1'='1拼接之后变成:SELECT * FROM user WHERE name='admin' OR '1'='1' AND password='随便填的空'注意,OR 的优先级会让整个条件永远成立,数据库就会返回第一行用户记录。如果第一行刚好是管理员,攻击者甚至不用知道密码就能直接登录系统。这一句看起来像玩笑的代码,正是过去十几年无数数据泄露事故的起点。有人可能会问:那攻击者是怎么知道字段名和表名的?这就是信息收集的功劳,有些系统报错直接暴露表结构,有些备份文件泄露了建表语句,甚至有些接口的注释里就写着SQL。所以SQL注入从来不是单纯靠“猜”,它和信息泄露是紧密配合的。3.2 参数化查询为什么能救命防SQL注入最有效的办法不是过滤关键字,而是参数化查询。在参数化查询里,用户输入永远不会被拼进SQL语句结构里,而是作为参数传给数据库。你可以把这条思路类比成点菜:你不会让客人一边说话一边由服务员改写厨房里的菜单,而是让他填一张固定的点餐单,后厨按格子取料。数据是数据,命令是命令,两者永远不会混在一起。实际项目里,只要是成熟的数据库访问组件,几乎都支持参数化查询,用起来也就多写一两行代码的事。问题是很多老系统、外包系统、临时脚本根本不给你这个机会,这时候就需要在下游补防护,比如给数据库账号做最小权限,让注入语句即使跑起来也干不了太多坏事。3.3 三个让SQL注入“死灰复燃”的坑只在登录框做防护,搜索框、排序参数、导出接口、订单号全都不设防。攻击者最爱挑业务功能最杂的地方下手,因为越复杂的业务越容易出现“临时拼SQL”。以为有WAF就万事大吉。WAF能做规则拦截,但编码绕过、特殊字符组合、参数污染都可能让规则失效。WAF更像防盗门,不是保险箱。黑名单过滤不安全。过滤了单引号,攻击者可以用十六进制编码、注释符、大小写变形绕过去。防注入的正确姿势是让参数无法进入SQL语句结构,而不是试图把所有怪输入都拦下来。实操心得:我评估过一个小程序后台,开发说登录、注册都做了参数化,但我翻订单查询接口时发现一个直接把前端传的排序字段拼进 ORDER BY 的例子。排序字段用参数化不好处理,就需要用白名单,只允许固定的几个字段名,其他一律拒绝。所以安全审计要看的从来不是“你有没有做防护”,而是“每个入口都做防护了没有”。4. XSS:浏览器替攻击者传话4.1 XSS的三种形态XSS全称是跨站脚本攻击,本质是攻击者把一段JavaScript注入到网页里,让它在其他用户的浏览器里执行。网站自己没被攻破,但它成了传话筒,把恶意代码“唊”给了每一个访问者。根据恶意代码存放的位置不同,XSS分成三种形态:存储型:恶意脚本被存在服务器上,所有访问这个页面的人都会中招,最常见,也最危险。这种攻击更像是“投毒”。反射型:恶意脚本藏在URL参数里,只有当受害者点击了特定链接时才会触发。这种攻击更像“钓鱼”,等人咬钩。DOM型:不经过服务器,脚本在前端DOM处理过程中被执行,隐蔽性更高,而且很多时候WAF根本看不见。判断一个XSS是哪一种,最关键的是看恶意脚本会不会被保存和复用。存储型之所以危险,是因为它不需要诱导每个用户点击特定链接,只要有人访问那个被污染的页面就会触发。4.2 一条存储型XSS的攻击链我经常用一个比喻:论坛的留言板就是黑客的“留言墙”。攻击者在评论区提交一条看起来很正常、还带点艺术感的帖子,里面嵌入了一段获取Cookie的JavaScript。管理员审核时看到了文字,却忽略了脚本标签。后续所有浏览这个帖子的用户,浏览器都会执行这段脚本,把各自的登录态悄悄发给攻击者。拿到Cookie之后,攻击者就能伪装成用户,发帖、改资料、私信,甚至诱导更多人点钓鱼链接。如果中招的是管理员,攻击者连后台都能进。你可能觉得“偷个Cookie而已,又不致命”,但结合键盘记录、钓鱼页面,XSS能直接变成完整账号接管;如果系统里有转账功能,后果更严重。4.3 守住XSS的防线输出编码。这是最基础的一条,所有用户输入在输出到HTML时都要做HTML实体编码,让<script>变成一串无害的字符,浏览器不会把它当成代码执行。内容安全策略(CSP)。给页面设置安全策略,比如禁止加载外部域的脚本、禁止内联脚本,让注入进来的代码根本执行不了。现代前端框架默认转义。主流前端框架在默认情况下会对文本内容做转义,但如果你用了类似v-html、dangerouslySetInnerHTML这类接口直接输出HTML,转义就失效了,必须自己确保内容干净。注意事项:很多人以为XSS是“前端的事”,后端不关心。其实后端不做输出编码,光靠前端框架兜底是不保险的,尤其是接口被直接调用、页面静态渲染的场景,后端照样得做编码。XSS的防护一定是前后端配合,不能甩锅。5. CSRF:你不知情时,系统以为是你5.1 CSRF的经典剧本CSRF(跨站请求伪造),简单说就是:攻击者没法直接登你的账号,但他能让你在不知情的情况下,替它发一个请求,而且服务器会认为这个请求是你本人发出的。这种攻击特别像“借刀杀人”,全程你都是“被借的那把刀”。设想一下:你已经在某个网站登录过,浏览器里存着登录Cookie。这时攻击者在另一个网页里放了一个自动提交的表单,或者一张带恶意地址的图片。你只是打开这个网页,浏览器就把请求带了过去,Cookie也会一并带上。服务器一看,这是合法登录用户发来的,于是执行了修改密码、转账、发帖之类的操作。整个过程你可能毫无感知,也许只是在刷一个陌生页面,就在不知不觉中完成了攻击者想要的操作。5.2 为什么CSRF在现实里依然常见很多人觉得CSRF技术不高级,但现实里中招的依然不少,原因有三点:一是很多老旧系统只靠Cookie做身份认证,没有额外的校验措施;二是业务上总有一些“服务端无法校验来源”的接口,比如App、小程序与纯Web站点共存时,来源校验不好做;三是攻击者有很多办法诱导用户点链接,不是只有笨拙的弹窗和对话框。这里要区分一下XSS和CSRF:XSS是攻击者在网页里执行脚本,属于“篡改页面”;CSRF是攻击者让浏览器替你发请求,属于“冒用身份”。两者经常被混淆,但防护思路完全不同。XSS的核心是控制输出,CSRF的核心是校验请求来源。5.3 防御CSRF的三板斧CSRF Token。服务器在渲染表单时生成一个随机Token存在会话里,提交请求时必须带回来并校验。攻击者不知道你的Token,伪造请求自然失败。SameSite Cookie。给Cookie加上SameSite属性,限制跨站请求自动携带Cookie,这是近几年浏览器层面最有效的兜底方案。校验Origin/Referer。关键操作多一步来源头校验,拒绝来自陌生域名的请求。实操心得:很多开发觉得自己系统接口都有Token校验就安全,但忘了校验接口本身是否区分了“数据型请求”和“状态变更型请求”。比如一个查询接口不需要Token,一个下单接口需要Token,但如果下单接口同时允许多种Content-Type提交,就可能被绕过。最好对所有状态变更接口统一启用Token校验,并配合SameSite属性双保险。这里没有捷径,只有把每类接口的校验规则想周全。6. 文件上传漏洞:一个头像图片带走了服务器6.1 上传功能为什么危险文件上传功能很常见:传头像、传附件、传文档。如果一个系统允许用户上传文件,却没有严格限制文件类型和内容,攻击者就可能把一段服务端脚本(比如PHP、JSP)伪装成图片传上去,再从浏览器访问这个文件,让它执行。这段脚本在安全圈里有个俗称叫Webshell,你可以把它理解成给服务器装了一个“远程遥控器”。攻击者通过它执行命令、查看文件、修改代码,最终拿下整个服务器。你可能觉得“我上传的明明是图片,怎么会变成脚本?”这里的关键是:服务器到底把上传的文件当成什么来解析,取决于文件的后缀、存储位置和服务器配置,而不是取决于文件的真实内容。这也正是文件上传漏洞最阴险的地方。6.2 攻击者绕过后缀检查的常见套路很多系统会对上传文件做后缀名检查,但攻击者的绕过思路从来不只一条:改后缀。把shell.php改成shell.php5、shell.phtml,如果服务器没有正确配置对这些后缀的解析规则,就可能被直接执行。伪造Content-Type。上传时把请求里的Content-Type改成image/jpeg,只检查MIME类型的系统就这样被蒙混过去。图片马。把脚本代码拼到一张正常图片的尾部。有些服务器存在解析漏洞,会把图片当脚本执行。这种方式在CTF里特别经典,也特别容易让人产生“图片怎么可能执行”的错觉。双写后缀或大小写混淆。shell.php.jpg、shell.PhP这类写法专门用来测试解析逻辑不够严谨的中间件。这不是什么高科技,很多就是“猜配置”的过程。攻击者会反复试探,直到找到一个能执行脚本的组合。所以当你在本地觉得自己系统已经做得很严了,不妨多问自己一句:换个后缀名试试?换几种方式提交试试?6.3 安全的文件上传如何设计后缀名白名单。只允许指定类型,例如jpg、png、pdf,而不是靠黑名单。黑名单永远列不全,白名单则把门关死。重命名文件。上传后不要使用用户提供的文件名,改成随机字符串,从根源上杜绝攻击者控制路径和后缀。隔离存储与执行。上传目录放在Web访问不到的位置,或者禁止该目录执行任何脚本。内容与类型双重校验。不光看Content-Type,还读取文件头、图像宽高等信息做校验。限制上传大小和数量,减少用来存储恶意文件的可能。注意事项:曾经遇到一个项目,开发把所有上传文件都存到服务器同一目录,服务器软件还开启了目录浏览,结果不只文件上传漏洞危险,连所有用户头像都被爬了个遍。文件上传的防护,从来不是只看上传那一刻,而是从上传、存储、访问、执行整个链路都要管好。7. 目录遍历与敏感文件泄露:当网站把底牌亮给你7.1 最常见的泄露源攻击者最怕的不是系统难打,而是信息不够。而现实里,很多系统会主动把底牌亮出来。我总结过最常见的信息泄露源:网站目录开启了目录列表,直接看到文件结构。备份文件被放在Web目录下,比如www.zip、backup.sql。版本控制目录泄露,攻击者可以直接下载源码和提交历史。配置文件、日志文件权限设置不当。报错页面展示了堆栈、数据库连接信息。调试接口和处理异常的环境变量被暴露。这些看似“小信息”,组合起来就是攻击者的作战地图。你可能会想:一个备份文件而已,能有多大危害?但备份文件里往往就有完整的数据库密码、接口密钥、内部网络拓扑,攻击者拿到这些信息后,后面甚至不需要再用什么漏洞,直接拿钥匙开门就行。7.2 路径穿越是怎么发生的目录遍历里最有名的就是路径穿越。如果一个下载接口把文件名直接拼在路径里,攻击者就可以用../往上跳目录。例如:正常请求 /download?file=report.pdf 攻击请求 /download?file=../../etc/passwd如果后端没有做路径规范化校验,文件系统就会乖乖把越界的内容读出来。等你拿到配置文件和密码字典,后面的事情就容易多了。防御上,除了对用户输入做规范化处理、禁止文件名包含路径分隔符,更重要的是别把文件读取逻辑直接暴露给用户输入。这里还有一层容易忽略的:即使没有路径穿越,很多系统也存在“功能越权”式泄露。你猜到一个订单号、一个用户ID,就能查看别人的详情,这本质上和目录遍历一样,都是“没做好访问控制”。7.3 信息泄露是组合攻击的催化剂我常说“一次信息泄露往往比一个直接漏洞更可怕”,因为在真实攻防里,信息泄露给攻击者提供了精确打击的坐标。比如拿到源码后,攻击者能直接审计出SQL注入和数据越权的位置;拿到数据库配置,能少走很多弯路直接连库;拿到备份文件,甚至可能有现成的管理员账号密码。防御的核心思路不是“删除所有日志”,而是控制边界:公网不暴露内网信息,错误页只展示用户能看的提示,日志与源码不等于任何人可访问的资源。给目录加访问控制、把备份移出Web根目录、关闭目录列表,这些动作成本不高,效果立竿见影。实操心得:我自己检查一个内部系统时,随手在路径后加了一个/,服务器直接把整个目录列表打了出来,连数据库连接配置文件都在里面。那一刻我突然理解,很多大事故真的不是高手用多精妙的技巧打出来的,而是像这样,一个明晃晃的漏洞摆在那里等用户发现。8. 暴力破解与弱口令:最朴素却最有效的敲门砖8.1 暴力破解的进化史暴力破解最容易理解:就是个一个试。早期攻击者拿字典逐个试用户名和密码,速度快慢取决于网络和服务器性能。现在则有更聪明的玩法,先用泄露的密码库做组合碰撞,再配合撞库、拖库数据,威胁面一下子大了很多。现实中大量账号失守,不是被什么高级漏洞打下来的,而是自己用了弱密码、或者在多个平台用了同一套密码。攻击者根本不需要“破解”,只需要拿着已经泄露的密码去碰碰运气。你可能会想:我又不是什么大人物,谁会来暴力破解我的账号?但在自动化工具的加持下,攻击者不会逐个手动试,而是拿一整个字典批量扫成千上万个账号。只要你的密码足够简单,被扫中是迟早的事。8.2 攻击者如何绕过常见防护验证码。简单的四位数字验证码可以直接OCR识别;更常见的是验证码不失效、可重复使用。很多验证码系统实际只防了人,没防住脚本。次数限制。有的系统只对单个IP做限制,攻击者换一批IP就能绕过。锁定策略。不加锁或者锁定期太短,撞库工具完全可以卡着时间差来打。这里的关键是:几乎所有单点防护都能被绕过,真正的防线靠组合。验证码要一次性、要随机,IP限制要配合账号纬度限制,锁定策略要有弹性,不能锁死正常用户,但又不能让攻击者钻空子。8.3 真正有效的防暴力破解组合强制使用高复杂度密码,同时开启多因素认证,这比什么都有效。密码被泄露了,认证器还能兜底。登录接口限速与锁定。同一个账号连续失败几次就锁定,同一IP高频请求自动拉黑。行为分析。结合登录时间、设备指纹、地理位置判断异常,让攻击者即使拿到密码也要多次验证。统一账号体系。减少“一个系统一套密码”的混乱情况,降低被撞库的风险。个人体会:我见过一次内网安全演练,攻击者两个小时就拿到了整个测试环境的权限,路径就是从某个外包系统的默认后台密码开始的。安全建设里,弱口令问题永远不是一张表能解决的问题,它需要流程和管理制度兜底。运维列一个“强制改密清单”,开发把所有默认密码全部换掉,这一步比装任何安全设备都值钱。9. DDoS:不偷数据,但直接让你停摆9.1 DDoS的本质是“堵车”DDoS全称是分布式拒绝服务,本质特别像把一条路堵死:大量“车辆”同时涌向一个路口,真正想通过的人反而进不去。攻击者不一定需要入侵你的系统,只需要让你无法对外提供正常服务。对今天高度依赖线上业务的系统来说,服务不可用就是实打实的损失,几小时的宕机可能直接影响收入、用户信任和品牌声誉。理解DDoS,先要颠覆一个直觉:它不像前面那些攻击一样‘利用漏洞’,它利用的是“系统可用性有限”这个事实。服务器能处理的并发请求有限,带宽有限,内存有限。攻击者不需要找到逻辑漏洞,只需要把资源耗尽,你就输了。9.2 三种常见的DDoS类型流量型攻击。用海量请求把带宽打满,比如UDP洪水、ICMP洪水。流量一满,正常用户连网页都打不开。连接型攻击。TCP层的SYN Flood,不断发送握手请求但不完成握手,把服务器的连接表占满,让新连接无法建立。应用层攻击。HTTP请求洪水、慢速攻击。请求量不大,但每个请求都耗服务器资源,对业务接口形成持续消耗。这一类最难防御,因为从流量上看都是“正常请求”。对普通站点来说,最头疼的是应用层攻击,因为流量看似正常,防火墙和Web应用防火墙很难区分哪个请求是攻击者的、哪个是用户的。你总不能把所有带"GET /"的请求都拦了吧,那用户也进不来了。9.3 防御DDoS的常识与误区防御的目标不是“挡住所有攻击”,而是“让正常用户能访问”。常见手段包括:带宽与容量冗余,给系统留一定的缓冲空间。在网络边缘做流量清洗,识别并丢弃异常流量,只把正常流量转发给源站。使用CDN和高防节点分散压力,让攻击者无法直接打爆源站IP。对应用层做限流、频控、人机校验,让脚本请求消耗的成本远高于正常用户。误区是不少人以为买了高防就万事大吉,结果攻击者直接找到源站IP,绕过防护,照样打瘫。DDoS防御要连源站保护一起做,不能只靠单点。源站IP一旦暴露,任何高防都等于白买。所以源站防护、IP隐藏、访问控制这些事,都必须纳入整体方案。经验:我自己参与过的应急响应里,应用层攻击比流量型攻击难处理得多。流量型可以靠调度和清洗解决,应用层必须从业务架构上多做几层缓存和限流,否则再大的带宽也经不起无限请求。很多时候,给查询接口加缓存、给写操作加队列,反而比单纯堆带宽管用。10. 把7种攻击串成一条链:攻击者的完整作业路线10.1 攻击者的心态攻击者不会一上来就放大招。他心里有个优先级:先找最容易的点,再找影响最大的路径。所以很多攻击的起点,不是什么稀罕的漏洞,而是一台被人忘记的测试机、一个没有锁的后台入口、一份随处可下的备份文件。攻击者像一个小偷,会先绕着房子转一圈,看哪个窗户没关,而不是非要撬开保险柜的大门。所以我们防御时,不能只盯着最“高级”的漏洞。那些不起眼的点:一个开放的目录、一个弱密码、一条多余的报错信息,才是攻击者最喜欢踩的地砖。10.2 一次典型组合攻击的推演把前面7种攻击放在同一条时间线上:先用目录遍历和信息收集,找到后台路径、源码版本、数据库配置线索。用弱口令或暴力破解突破一个低权限账号,进入后台。发现后台有上传功能,用图片马或后缀绕过放上Webshell。通过Webshell执行命令,读取服务器上的数据库配置,连接数据库。用SQL注入手法尝试拖库,或者直接把数据备份下载。如果服务是核心,最后补一发DDoS让系统彻底停止响应,掩盖痕迹或者制造更大的混乱。你会发现每一步单独看都不算“神操作”,但组合起来就能造成巨大的破坏。攻击者最擅长的,是把别人的疏忽变成自己的路径。这也就解释了为什么攻击链的每一环都值得防守——你堵住任何一环,他后面就都走不通了。10.3 防御者的分层应对对应的防御思路是纵深防御:每层都设防,就算第一层被突破,第二层第三层仍在工作。入口要管好弱口令和上传;中间要管好权限和隔离;数据库要管好最小权限和审计。安全不是加一台WAF就完成的事,而是所有环节都尽量降低攻击者的收益、延长攻击者的时间。攻击者的路径越长、成本越高,他放弃的概率就越大。纵深防御还有一个现实意义:它能让你有“发现”的机会。如果只有一层防护,攻击者一次突破你就完全失守;如果有多层防护,哪怕他踩过第一层,日志里也会留下痕迹,你就有时间去发现、阻断和溯源。11. 最后说点实在话:给普通开发者和运维的几条经验11.1 从最小成本开始改造如果你不是专职安全人员,面对这一大堆攻击方式可能觉得无从下手。我的建议是从最小成本清单开始:把默认后台地址改掉,弱口令全部强制改复杂密码。给关键接口完全不信任前端参数,用白名单。把备份文件和源码迁出Web根目录。关闭公网目录列表、报错页面。给状态变更请求加Token校验。这几点加起来不到半天时间,能挡住一大半脚本小子级别的攻击。安全不是说一定要上多贵的设备,而是先把这些零成本、低成本的事做到位。11.2 学会站在攻击者角度看系统安全评估最有效的方法,就是把自己当成第一次看到这个系统的陌生人:你能不能找到后台?能不能看到目录?能不能猜到密码?能不能上传可执行文件?沿着这个思路走一遍,你往往比任何扫描器都更能发现问题。这个习惯一开始做会有点别扭,因为你对自己系统太熟了,总觉得“这地方很正常啊”。可攻击者恰恰相反,他什么都不知道,所以他会试探每一个入口。你试着把已知信息全部忘掉,只留一个浏览器,从用户角度把所有功能和页面都过一遍,很快就能找到“哦这里好像能多传个东西”“这里报错信息太多了”的疏漏。11.3 一个很容易被忽略的细节最后分享一个小细节:平时排查登录和业务接口时,多留意一下报错提示。很多系统把“用户不存在”和“密码错误”分得太清楚,等于告诉攻击者哪个账号是存在的,这会让弱口令攻击精准很多。把报错改成统一提示,成本为零,效果却立竿见影。做安全这几年,最大的体会就是:攻击技术永远在变,但核心逻辑始终是那么几条——信任边界模糊、输入不可控、权限太大、信息暴露太多。把这几条理解透,再去看任何新的漏洞和攻击方式,你都会觉得似曾相识。与其追着每一条新漏洞新闻跑,不如先把这7种最基础的攻击吃透,因为后面所有高级手法,都是在这几块地基上盖起来的。
1. 先从一件小事说起:为什么你总觉得黑客离你很远,又很近做安全攻防这些年,被问最多的一句话,既不是某个新漏洞的技术细节,也不是某个安全产品的配置方法,而是特别朴素的一句:黑客到底是怎么打进来的?每次听到这个问题,我都觉得一两句话很难讲清,因为攻击往往不是单一的一招,而是一条完整的链路。但反过来想,只要我们把这些最常见的手法逐个拆开,就会发现那些听起来唬人的名词,底层逻辑一点都不复杂。这篇文章里的7种攻击——SQL注入、XSS、CSRF、文件上传漏洞、目录遍历与敏感文件泄露、暴力破解与弱口令、DDoS——几乎覆盖了普通人能听到的大部分攻击类型。它们分别对应着偷数据、偷身份、开后门、翻底牌、猜密码、搞瘫服务这几件事。不管你是做开发的、做运维的、做测试的,还是单纯对黑客技术感到好奇的网友,把这7种攻击理解透,你就拿到了看懂安全圈大部分新闻的地基,往后自己排查系统也会更有方向。1.1 一次典型攻击的真实样子我先描述一个场景:某天,一家小公司的客服系统突然登录不上了。运维登上去一看,数据库里的客户信息被导走了,后台多了一个陌生账号,服务器上还跑着一个奇怪的进程。这一连串事情看着像闯空门,但拆开看就是典型的组合拳:先用弱口令猜到后台密码,登录后找到文件上传功能放了一个脚本,脚本被服务器执行后拿到系统权限,最后通过数据库备份功能把资料导走。你会发现,中间每一步用到的都是这篇文章要讲的“基础知识”。攻击者不是什么神人,他只是把几个常见问题串成了一条路。所以要理解黑客,先别急着背漏洞编号、记利用代码,把每种攻击“为什么能成功”想明白,比什么都强。1.2 7种攻击的共同逻辑这些攻击方式五花八门,但底层都有一个共同逻辑:攻击者总在寻找“信任边界”被打破的地方。网站信任了不该信任的用户输入,程序信任了不该信任的上传文件,用户信任了不该信任的链接,服务器暴露了不该暴露的信息。攻击者的工作,就是找到这份信任的边界在哪里,然后一脚踩过去。后面的内容,全都是围绕“边界失控”这四个字展开的。2. 7种攻击一次分清:一张表看明白每种攻击的“坏心思”2.1 攻击目标决定攻击方式不管攻击手法怎么变化,目的无非三种:偷数据、偷身份、搞瘫痪。偷数据主要面向数据库、文件、配置信息;偷身份面向账号体系;搞瘫痪则是让你无法对外服务。目的不同,攻击者会用完全不同的手段,上手前先把这个前提搞清楚,再去理解每种攻击就会清晰很多。这里要特别强调一点:攻击者不是一台机器,而是一个有耐心、有目标的人。他会先判断目标的“价值”在哪里,再决定用什么手段。一个只有静态页面的小博客和一家存着大量订单数据的电商平台,在攻击者眼里完全是两种东西。所以你会发现,有些攻击手法“低级”但天天有人用,因为它对某些目标特别有效。2.2 7种常见攻击速查表攻击类型通俗说法主要目标最后一击SQL注入让数据库把用户输入当命令执行数据库里的数据拖库、删库、改数据XSS在别人浏览器里跑你的脚本网站用户盗登录态、钓鱼、键盘记录CSRF借你的身份发请求已登录用户替你转账、改设置、发帖文件上传漏洞把一个可执行文件传上服务器网站服务器拿到服务器控制权目录遍历与敏感文件泄露看到不该看的文件源码、配置、备份为下一步攻击提供弹药暴力破解与弱口令一次一次试密码登录入口接管账号DDoS用海量请求堵死服务网站可用性服务宕机、业务停摆这张表建议收藏,后面每一类我都会拆开讲原理,也会聊到现实里最容易被忽视的细节。因为你光知道“有这种攻击”没用,得能判断自己的系统最容易栽在哪一类。2.3 攻击不是孤立行为攻击者很少只用一招。通常第一步是收集信息,可能是目录遍历、信息泄露;第二步是寻找入口,可能是弱口令、SQL注入;第三步是扩大战果,可能是文件上传、提权、横向移动。这篇文章先逐个讲清楚,后面我会专门把它们串成一条完整攻击链,那样你回头看这张表,会有更立体的感觉。3. SQL注入:数据库把用户输入当成了命令3.1 用登录场景拆解SQL注入SQL注入一句话原理:本该作为“数据”传进来的内容,被网站拼进了SQL语句,最后被数据库当成“命令”执行了。你品一下这句话,攻击的本质是数据和代码的边界被打破。正常情况下,用户输入只是数据,数据库只负责把它存进去或者查出来;可一旦开发人员把用户输入直接拼进SQL语句,用户输入就有了“代码”的资格。举个最典型的例子。一个登录框的查询本来是这样的:SELECT * FROM user WHERE name='用户名' AND password='密码'如果开发人员图省事,直接拿用户输入拼SQL,那他输入用户名时填了:admin' OR '1'='1拼接之后变成:SELECT * FROM user WHERE name='admin' OR '1'='1' AND password='随便填的空'注意,OR 的优先级会让整个条件永远成立,数据库就会返回第一行用户记录。如果第一行刚好是管理员,攻击者甚至不用知道密码就能直接登录系统。这一句看起来像玩笑的代码,正是过去十几年无数数据泄露事故的起点。有人可能会问:那攻击者是怎么知道字段名和表名的?这就是信息收集的功劳,有些系统报错直接暴露表结构,有些备份文件泄露了建表语句,甚至有些接口的注释里就写着SQL。所以SQL注入从来不是单纯靠“猜”,它和信息泄露是紧密配合的。3.2 参数化查询为什么能救命防SQL注入最有效的办法不是过滤关键字,而是参数化查询。在参数化查询里,用户输入永远不会被拼进SQL语句结构里,而是作为参数传给数据库。你可以把这条思路类比成点菜:你不会让客人一边说话一边由服务员改写厨房里的菜单,而是让他填一张固定的点餐单,后厨按格子取料。数据是数据,命令是命令,两者永远不会混在一起。实际项目里,只要是成熟的数据库访问组件,几乎都支持参数化查询,用起来也就多写一两行代码的事。问题是很多老系统、外包系统、临时脚本根本不给你这个机会,这时候就需要在下游补防护,比如给数据库账号做最小权限,让注入语句即使跑起来也干不了太多坏事。3.3 三个让SQL注入“死灰复燃”的坑只在登录框做防护,搜索框、排序参数、导出接口、订单号全都不设防。攻击者最爱挑业务功能最杂的地方下手,因为越复杂的业务越容易出现“临时拼SQL”。以为有WAF就万事大吉。WAF能做规则拦截,但编码绕过、特殊字符组合、参数污染都可能让规则失效。WAF更像防盗门,不是保险箱。黑名单过滤不安全。过滤了单引号,攻击者可以用十六进制编码、注释符、大小写变形绕过去。防注入的正确姿势是让参数无法进入SQL语句结构,而不是试图把所有怪输入都拦下来。实操心得:我评估过一个小程序后台,开发说登录、注册都做了参数化,但我翻订单查询接口时发现一个直接把前端传的排序字段拼进 ORDER BY 的例子。排序字段用参数化不好处理,就需要用白名单,只允许固定的几个字段名,其他一律拒绝。所以安全审计要看的从来不是“你有没有做防护”,而是“每个入口都做防护了没有”。4. XSS:浏览器替攻击者传话4.1 XSS的三种形态XSS全称是跨站脚本攻击,本质是攻击者把一段JavaScript注入到网页里,让它在其他用户的浏览器里执行。网站自己没被攻破,但它成了传话筒,把恶意代码“唊”给了每一个访问者。根据恶意代码存放的位置不同,XSS分成三种形态:存储型:恶意脚本被存在服务器上,所有访问这个页面的人都会中招,最常见,也最危险。这种攻击更像是“投毒”。反射型:恶意脚本藏在URL参数里,只有当受害者点击了特定链接时才会触发。这种攻击更像“钓鱼”,等人咬钩。DOM型:不经过服务器,脚本在前端DOM处理过程中被执行,隐蔽性更高,而且很多时候WAF根本看不见。判断一个XSS是哪一种,最关键的是看恶意脚本会不会被保存和复用。存储型之所以危险,是因为它不需要诱导每个用户点击特定链接,只要有人访问那个被污染的页面就会触发。4.2 一条存储型XSS的攻击链我经常用一个比喻:论坛的留言板就是黑客的“留言墙”。攻击者在评论区提交一条看起来很正常、还带点艺术感的帖子,里面嵌入了一段获取Cookie的JavaScript。管理员审核时看到了文字,却忽略了脚本标签。后续所有浏览这个帖子的用户,浏览器都会执行这段脚本,把各自的登录态悄悄发给攻击者。拿到Cookie之后,攻击者就能伪装成用户,发帖、改资料、私信,甚至诱导更多人点钓鱼链接。如果中招的是管理员,攻击者连后台都能进。你可能觉得“偷个Cookie而已,又不致命”,但结合键盘记录、钓鱼页面,XSS能直接变成完整账号接管;如果系统里有转账功能,后果更严重。4.3 守住XSS的防线输出编码。这是最基础的一条,所有用户输入在输出到HTML时都要做HTML实体编码,让<script>变成一串无害的字符,浏览器不会把它当成代码执行。内容安全策略(CSP)。给页面设置安全策略,比如禁止加载外部域的脚本、禁止内联脚本,让注入进来的代码根本执行不了。现代前端框架默认转义。主流前端框架在默认情况下会对文本内容做转义,但如果你用了类似v-html、dangerouslySetInnerHTML这类接口直接输出HTML,转义就失效了,必须自己确保内容干净。注意事项:很多人以为XSS是“前端的事”,后端不关心。其实后端不做输出编码,光靠前端框架兜底是不保险的,尤其是接口被直接调用、页面静态渲染的场景,后端照样得做编码。XSS的防护一定是前后端配合,不能甩锅。5. CSRF:你不知情时,系统以为是你5.1 CSRF的经典剧本CSRF(跨站请求伪造),简单说就是:攻击者没法直接登你的账号,但他能让你在不知情的情况下,替它发一个请求,而且服务器会认为这个请求是你本人发出的。这种攻击特别像“借刀杀人”,全程你都是“被借的那把刀”。设想一下:你已经在某个网站登录过,浏览器里存着登录Cookie。这时攻击者在另一个网页里放了一个自动提交的表单,或者一张带恶意地址的图片。你只是打开这个网页,浏览器就把请求带了过去,Cookie也会一并带上。服务器一看,这是合法登录用户发来的,于是执行了修改密码、转账、发帖之类的操作。整个过程你可能毫无感知,也许只是在刷一个陌生页面,就在不知不觉中完成了攻击者想要的操作。5.2 为什么CSRF在现实里依然常见很多人觉得CSRF技术不高级,但现实里中招的依然不少,原因有三点:一是很多老旧系统只靠Cookie做身份认证,没有额外的校验措施;二是业务上总有一些“服务端无法校验来源”的接口,比如App、小程序与纯Web站点共存时,来源校验不好做;三是攻击者有很多办法诱导用户点链接,不是只有笨拙的弹窗和对话框。这里要区分一下XSS和CSRF:XSS是攻击者在网页里执行脚本,属于“篡改页面”;CSRF是攻击者让浏览器替你发请求,属于“冒用身份”。两者经常被混淆,但防护思路完全不同。XSS的核心是控制输出,CSRF的核心是校验请求来源。5.3 防御CSRF的三板斧CSRF Token。服务器在渲染表单时生成一个随机Token存在会话里,提交请求时必须带回来并校验。攻击者不知道你的Token,伪造请求自然失败。SameSite Cookie。给Cookie加上SameSite属性,限制跨站请求自动携带Cookie,这是近几年浏览器层面最有效的兜底方案。校验Origin/Referer。关键操作多一步来源头校验,拒绝来自陌生域名的请求。实操心得:很多开发觉得自己系统接口都有Token校验就安全,但忘了校验接口本身是否区分了“数据型请求”和“状态变更型请求”。比如一个查询接口不需要Token,一个下单接口需要Token,但如果下单接口同时允许多种Content-Type提交,就可能被绕过。最好对所有状态变更接口统一启用Token校验,并配合SameSite属性双保险。这里没有捷径,只有把每类接口的校验规则想周全。6. 文件上传漏洞:一个头像图片带走了服务器6.1 上传功能为什么危险文件上传功能很常见:传头像、传附件、传文档。如果一个系统允许用户上传文件,却没有严格限制文件类型和内容,攻击者就可能把一段服务端脚本(比如PHP、JSP)伪装成图片传上去,再从浏览器访问这个文件,让它执行。这段脚本在安全圈里有个俗称叫Webshell,你可以把它理解成给服务器装了一个“远程遥控器”。攻击者通过它执行命令、查看文件、修改代码,最终拿下整个服务器。你可能觉得“我上传的明明是图片,怎么会变成脚本?”这里的关键是:服务器到底把上传的文件当成什么来解析,取决于文件的后缀、存储位置和服务器配置,而不是取决于文件的真实内容。这也正是文件上传漏洞最阴险的地方。6.2 攻击者绕过后缀检查的常见套路很多系统会对上传文件做后缀名检查,但攻击者的绕过思路从来不只一条:改后缀。把shell.php改成shell.php5、shell.phtml,如果服务器没有正确配置对这些后缀的解析规则,就可能被直接执行。伪造Content-Type。上传时把请求里的Content-Type改成image/jpeg,只检查MIME类型的系统就这样被蒙混过去。图片马。把脚本代码拼到一张正常图片的尾部。有些服务器存在解析漏洞,会把图片当脚本执行。这种方式在CTF里特别经典,也特别容易让人产生“图片怎么可能执行”的错觉。双写后缀或大小写混淆。shell.php.jpg、shell.PhP这类写法专门用来测试解析逻辑不够严谨的中间件。这不是什么高科技,很多就是“猜配置”的过程。攻击者会反复试探,直到找到一个能执行脚本的组合。所以当你在本地觉得自己系统已经做得很严了,不妨多问自己一句:换个后缀名试试?换几种方式提交试试?6.3 安全的文件上传如何设计后缀名白名单。只允许指定类型,例如jpg、png、pdf,而不是靠黑名单。黑名单永远列不全,白名单则把门关死。重命名文件。上传后不要使用用户提供的文件名,改成随机字符串,从根源上杜绝攻击者控制路径和后缀。隔离存储与执行。上传目录放在Web访问不到的位置,或者禁止该目录执行任何脚本。内容与类型双重校验。不光看Content-Type,还读取文件头、图像宽高等信息做校验。限制上传大小和数量,减少用来存储恶意文件的可能。注意事项:曾经遇到一个项目,开发把所有上传文件都存到服务器同一目录,服务器软件还开启了目录浏览,结果不只文件上传漏洞危险,连所有用户头像都被爬了个遍。文件上传的防护,从来不是只看上传那一刻,而是从上传、存储、访问、执行整个链路都要管好。7. 目录遍历与敏感文件泄露:当网站把底牌亮给你7.1 最常见的泄露源攻击者最怕的不是系统难打,而是信息不够。而现实里,很多系统会主动把底牌亮出来。我总结过最常见的信息泄露源:网站目录开启了目录列表,直接看到文件结构。备份文件被放在Web目录下,比如www.zip、backup.sql。版本控制目录泄露,攻击者可以直接下载源码和提交历史。配置文件、日志文件权限设置不当。报错页面展示了堆栈、数据库连接信息。调试接口和处理异常的环境变量被暴露。这些看似“小信息”,组合起来就是攻击者的作战地图。你可能会想:一个备份文件而已,能有多大危害?但备份文件里往往就有完整的数据库密码、接口密钥、内部网络拓扑,攻击者拿到这些信息后,后面甚至不需要再用什么漏洞,直接拿钥匙开门就行。7.2 路径穿越是怎么发生的目录遍历里最有名的就是路径穿越。如果一个下载接口把文件名直接拼在路径里,攻击者就可以用../往上跳目录。例如:正常请求 /download?file=report.pdf 攻击请求 /download?file=../../etc/passwd如果后端没有做路径规范化校验,文件系统就会乖乖把越界的内容读出来。等你拿到配置文件和密码字典,后面的事情就容易多了。防御上,除了对用户输入做规范化处理、禁止文件名包含路径分隔符,更重要的是别把文件读取逻辑直接暴露给用户输入。这里还有一层容易忽略的:即使没有路径穿越,很多系统也存在“功能越权”式泄露。你猜到一个订单号、一个用户ID,就能查看别人的详情,这本质上和目录遍历一样,都是“没做好访问控制”。7.3 信息泄露是组合攻击的催化剂我常说“一次信息泄露往往比一个直接漏洞更可怕”,因为在真实攻防里,信息泄露给攻击者提供了精确打击的坐标。比如拿到源码后,攻击者能直接审计出SQL注入和数据越权的位置;拿到数据库配置,能少走很多弯路直接连库;拿到备份文件,甚至可能有现成的管理员账号密码。防御的核心思路不是“删除所有日志”,而是控制边界:公网不暴露内网信息,错误页只展示用户能看的提示,日志与源码不等于任何人可访问的资源。给目录加访问控制、把备份移出Web根目录、关闭目录列表,这些动作成本不高,效果立竿见影。实操心得:我自己检查一个内部系统时,随手在路径后加了一个/,服务器直接把整个目录列表打了出来,连数据库连接配置文件都在里面。那一刻我突然理解,很多大事故真的不是高手用多精妙的技巧打出来的,而是像这样,一个明晃晃的漏洞摆在那里等用户发现。8. 暴力破解与弱口令:最朴素却最有效的敲门砖8.1 暴力破解的进化史暴力破解最容易理解:就是个一个试。早期攻击者拿字典逐个试用户名和密码,速度快慢取决于网络和服务器性能。现在则有更聪明的玩法,先用泄露的密码库做组合碰撞,再配合撞库、拖库数据,威胁面一下子大了很多。现实中大量账号失守,不是被什么高级漏洞打下来的,而是自己用了弱密码、或者在多个平台用了同一套密码。攻击者根本不需要“破解”,只需要拿着已经泄露的密码去碰碰运气。你可能会想:我又不是什么大人物,谁会来暴力破解我的账号?但在自动化工具的加持下,攻击者不会逐个手动试,而是拿一整个字典批量扫成千上万个账号。只要你的密码足够简单,被扫中是迟早的事。8.2 攻击者如何绕过常见防护验证码。简单的四位数字验证码可以直接OCR识别;更常见的是验证码不失效、可重复使用。很多验证码系统实际只防了人,没防住脚本。次数限制。有的系统只对单个IP做限制,攻击者换一批IP就能绕过。锁定策略。不加锁或者锁定期太短,撞库工具完全可以卡着时间差来打。这里的关键是:几乎所有单点防护都能被绕过,真正的防线靠组合。验证码要一次性、要随机,IP限制要配合账号纬度限制,锁定策略要有弹性,不能锁死正常用户,但又不能让攻击者钻空子。8.3 真正有效的防暴力破解组合强制使用高复杂度密码,同时开启多因素认证,这比什么都有效。密码被泄露了,认证器还能兜底。登录接口限速与锁定。同一个账号连续失败几次就锁定,同一IP高频请求自动拉黑。行为分析。结合登录时间、设备指纹、地理位置判断异常,让攻击者即使拿到密码也要多次验证。统一账号体系。减少“一个系统一套密码”的混乱情况,降低被撞库的风险。个人体会:我见过一次内网安全演练,攻击者两个小时就拿到了整个测试环境的权限,路径就是从某个外包系统的默认后台密码开始的。安全建设里,弱口令问题永远不是一张表能解决的问题,它需要流程和管理制度兜底。运维列一个“强制改密清单”,开发把所有默认密码全部换掉,这一步比装任何安全设备都值钱。9. DDoS:不偷数据,但直接让你停摆9.1 DDoS的本质是“堵车”DDoS全称是分布式拒绝服务,本质特别像把一条路堵死:大量“车辆”同时涌向一个路口,真正想通过的人反而进不去。攻击者不一定需要入侵你的系统,只需要让你无法对外提供正常服务。对今天高度依赖线上业务的系统来说,服务不可用就是实打实的损失,几小时的宕机可能直接影响收入、用户信任和品牌声誉。理解DDoS,先要颠覆一个直觉:它不像前面那些攻击一样‘利用漏洞’,它利用的是“系统可用性有限”这个事实。服务器能处理的并发请求有限,带宽有限,内存有限。攻击者不需要找到逻辑漏洞,只需要把资源耗尽,你就输了。9.2 三种常见的DDoS类型流量型攻击。用海量请求把带宽打满,比如UDP洪水、ICMP洪水。流量一满,正常用户连网页都打不开。连接型攻击。TCP层的SYN Flood,不断发送握手请求但不完成握手,把服务器的连接表占满,让新连接无法建立。应用层攻击。HTTP请求洪水、慢速攻击。请求量不大,但每个请求都耗服务器资源,对业务接口形成持续消耗。这一类最难防御,因为从流量上看都是“正常请求”。对普通站点来说,最头疼的是应用层攻击,因为流量看似正常,防火墙和Web应用防火墙很难区分哪个请求是攻击者的、哪个是用户的。你总不能把所有带"GET /"的请求都拦了吧,那用户也进不来了。9.3 防御DDoS的常识与误区防御的目标不是“挡住所有攻击”,而是“让正常用户能访问”。常见手段包括:带宽与容量冗余,给系统留一定的缓冲空间。在网络边缘做流量清洗,识别并丢弃异常流量,只把正常流量转发给源站。使用CDN和高防节点分散压力,让攻击者无法直接打爆源站IP。对应用层做限流、频控、人机校验,让脚本请求消耗的成本远高于正常用户。误区是不少人以为买了高防就万事大吉,结果攻击者直接找到源站IP,绕过防护,照样打瘫。DDoS防御要连源站保护一起做,不能只靠单点。源站IP一旦暴露,任何高防都等于白买。所以源站防护、IP隐藏、访问控制这些事,都必须纳入整体方案。经验:我自己参与过的应急响应里,应用层攻击比流量型攻击难处理得多。流量型可以靠调度和清洗解决,应用层必须从业务架构上多做几层缓存和限流,否则再大的带宽也经不起无限请求。很多时候,给查询接口加缓存、给写操作加队列,反而比单纯堆带宽管用。10. 把7种攻击串成一条链:攻击者的完整作业路线10.1 攻击者的心态攻击者不会一上来就放大招。他心里有个优先级:先找最容易的点,再找影响最大的路径。所以很多攻击的起点,不是什么稀罕的漏洞,而是一台被人忘记的测试机、一个没有锁的后台入口、一份随处可下的备份文件。攻击者像一个小偷,会先绕着房子转一圈,看哪个窗户没关,而不是非要撬开保险柜的大门。所以我们防御时,不能只盯着最“高级”的漏洞。那些不起眼的点:一个开放的目录、一个弱密码、一条多余的报错信息,才是攻击者最喜欢踩的地砖。10.2 一次典型组合攻击的推演把前面7种攻击放在同一条时间线上:先用目录遍历和信息收集,找到后台路径、源码版本、数据库配置线索。用弱口令或暴力破解突破一个低权限账号,进入后台。发现后台有上传功能,用图片马或后缀绕过放上Webshell。通过Webshell执行命令,读取服务器上的数据库配置,连接数据库。用SQL注入手法尝试拖库,或者直接把数据备份下载。如果服务是核心,最后补一发DDoS让系统彻底停止响应,掩盖痕迹或者制造更大的混乱。你会发现每一步单独看都不算“神操作”,但组合起来就能造成巨大的破坏。攻击者最擅长的,是把别人的疏忽变成自己的路径。这也就解释了为什么攻击链的每一环都值得防守——你堵住任何一环,他后面就都走不通了。10.3 防御者的分层应对对应的防御思路是纵深防御:每层都设防,就算第一层被突破,第二层第三层仍在工作。入口要管好弱口令和上传;中间要管好权限和隔离;数据库要管好最小权限和审计。安全不是加一台WAF就完成的事,而是所有环节都尽量降低攻击者的收益、延长攻击者的时间。攻击者的路径越长、成本越高,他放弃的概率就越大。纵深防御还有一个现实意义:它能让你有“发现”的机会。如果只有一层防护,攻击者一次突破你就完全失守;如果有多层防护,哪怕他踩过第一层,日志里也会留下痕迹,你就有时间去发现、阻断和溯源。11. 最后说点实在话:给普通开发者和运维的几条经验11.1 从最小成本开始改造如果你不是专职安全人员,面对这一大堆攻击方式可能觉得无从下手。我的建议是从最小成本清单开始:把默认后台地址改掉,弱口令全部强制改复杂密码。给关键接口完全不信任前端参数,用白名单。把备份文件和源码迁出Web根目录。关闭公网目录列表、报错页面。给状态变更请求加Token校验。这几点加起来不到半天时间,能挡住一大半脚本小子级别的攻击。安全不是说一定要上多贵的设备,而是先把这些零成本、低成本的事做到位。11.2 学会站在攻击者角度看系统安全评估最有效的方法,就是把自己当成第一次看到这个系统的陌生人:你能不能找到后台?能不能看到目录?能不能猜到密码?能不能上传可执行文件?沿着这个思路走一遍,你往往比任何扫描器都更能发现问题。这个习惯一开始做会有点别扭,因为你对自己系统太熟了,总觉得“这地方很正常啊”。可攻击者恰恰相反,他什么都不知道,所以他会试探每一个入口。你试着把已知信息全部忘掉,只留一个浏览器,从用户角度把所有功能和页面都过一遍,很快就能找到“哦这里好像能多传个东西”“这里报错信息太多了”的疏漏。11.3 一个很容易被忽略的细节最后分享一个小细节:平时排查登录和业务接口时,多留意一下报错提示。很多系统把“用户不存在”和“密码错误”分得太清楚,等于告诉攻击者哪个账号是存在的,这会让弱口令攻击精准很多。把报错改成统一提示,成本为零,效果却立竿见影。做安全这几年,最大的体会就是:攻击技术永远在变,但核心逻辑始终是那么几条——信任边界模糊、输入不可控、权限太大、信息暴露太多。把这几条理解透,再去看任何新的漏洞和攻击方式,你都会觉得似曾相识。与其追着每一条新漏洞新闻跑,不如先把这7种最基础的攻击吃透,因为后面所有高级手法,都是在这几块地基上盖起来的。