Categories
坐骑幻化

常见Web安全漏洞全解析:原理、危害、流程与防御Web安全漏洞是攻击者入侵系统、窃取数据的主要途径,不同漏洞的利用逻辑和危害程度存在差异,但核心均围绕"突破访问控制、执行未授权操作"展开。以下整合CSRF、SQL注入、SSRF、XSS、命令执行、文件上传六大核心漏洞的完整信息,涵盖原理、流程、危害及防御措施,并补充关键细节以形成体系化认知。

一、CSRF(跨站请求伪造)1. 核心定义攻击者利用已登录用户的合法身份(通过浏览器自动携带的Cookie/Session),诱导用户触发向目标网站的恶意请求,使目标网站误以为是用户主动操作,从而执行非法行为(如转账、改密码)。

2. 攻击流程(完整链路)用户身份前置:用户已登录目标网站(如银行APP、电商平台),浏览器保存了有效的Session/Cookie,身份验证状态未过期。诱导访问恶意资源:攻击者通过邮件、聊天工具、钓鱼链接等,诱导用户访问恶意网站/页面(如伪装成"优惠活动"的链接)。恶意请求自动触发:恶意页面中隐藏自动提交的表单(如

)或JavaScript脚本,无需用户手动操作,浏览器会自动携带用户的Cookie向目标网站发送请求。目标网站验证执行:目标网站仅验证Cookie/Session的有效性(未识别请求来源异常),判定为用户合法操作,执行恶意请求(如转账给攻击者账户、修改用户密码)。攻击完成:用户可能在不知情的情况下,权限被滥用,造成损失后才发现异常。3. 核心危害权限滥用:攻击者以用户身份执行操作,如修改个人信息、发送消息、操作资产(转账、下单)。数据安全受损:篡改用户关联的数据(如订单状态、收货地址),或删除关键信息(如聊天记录、备份文件)。财产与声誉损失:涉及资金操作(如充值、转账)时直接造成财产损失;若用户为企业账号,可能导致企业信息泄露、业务声誉受损。4. 防御措施(补充实操细节)添加Token验证:在所有关键请求(如转账、改密码)的表单或请求头中,加入随机生成的"CSRF Token"(由服务器下发,与用户Session绑定)。服务器接收请求时,需验证Token有效性,避免恶意请求伪造。验证请求来源(Referer/Origin):检查请求头中的Referer(请求来源页面URL)或Origin(请求来源域名),仅允许来自可信域名(如目标网站自身)的请求,拒绝外部恶意网站的请求。关键操作加验证码/二次验证:对涉及资产、权限的操作(如转账、修改手机号),强制要求用户输入图形验证码、短信验证码或进行生物识别(指纹/人脸),阻断自动化恶意请求。SameSite Cookie属性:在Cookie中设置SameSite=Strict/Lax,限制Cookie仅在"同站请求"(同一域名下的请求)中携带,避免跨站请求时自动发送Cookie,从源头减少攻击可能。二、SQL注入1. 核心定义攻击者通过在用户输入(如搜索框、登录表单、URL参数)中注入恶意SQL语句,使应用程序将其与合法SQL查询"拼接"后提交给数据库执行,最终实现操控数据库(窃取数据、修改权限)的目的。其本质是"应用程序未对用户输入做安全过滤,导致输入被当作代码执行"。

2. 基础前置知识(1)相关概念SQL语言:结构化查询语言,用于数据库的查询、更新、管理,核心语句类型包括:

数据查询(SELECT):获取数据库数据;数据操作(INSERT/UPDATE/DELETE):新增、修改、删除数据;数据控制(GRANT/REVOKE):分配/回收数据库权限;数据定义(CREATE/DROP):创建/删除表、库;事务处理(COMMIT/ROLLBACK):提交/回滚事务。常见数据库:MySQL、Oracle、SQL Server、Access、DB2、SQLite3(不同数据库的系统表、函数存在差异,注入语句需适配)。静态页面vs动态页面:

类型格式依赖数据库交互性安全风险静态页面HTML/HTM否差无SQL注入风险动态页面ASP/ASPX/PHP/JSP是好存在SQL注入风险(需与数据库交互)(2)关键系统表(以MySQL为例)数据库的"系统表"存储了库、表、列的元数据,是注入时获取信息的核心:

information_schema.SCHEMATA:存储所有数据库名称,关键列schema_name(查询语句:SELECT DISTINCT schema_name FROM information_schema.SCHEMATA;);information_schema.TABLES:存储所有表信息,关键列table_schema(所属数据库)、table_name(表名)(查询语句:SELECT DISTINCT table_name FROM information_schema.TABLES WHERE table_schema='目标数据库名';);information_schema.COLUMNS:存储所有列信息,关键列table_schema(所属数据库)、table_name(所属表)、column_name(列名)(查询语句:SELECT DISTINCT column_name FROM information_schema.COLUMNS WHERE table_schema='目标数据库名' AND table_name='目标表名';)。(3)常用MySQL函数注入时用于判断环境、获取敏感信息:

身份相关:user()(当前用户名)、current_user()(当前登录用户)、system_user()(系统用户名);数据库信息:database()(当前数据库名)、version()(数据库版本);路径相关:@@datadir(数据库存储路径)、@@basedir(MySQL安装路径);文件操作:load_file()(读取本地文件,如load_file('/etc/passwd')读取Linux用户密码文件);系统信息:@@version_compile_os(操作系统类型)。3. 漏洞触发条件与场景(1)触发条件输入未验证/过滤:应用程序未对用户输入的特殊字符(如'、;、UNION、OR)做过滤或转义;SQL语句拼接:后端通过"字符串拼接"方式构造SQL查询(如$sql = "SELECT * FROM user WHERE username='$username' AND password='$password'";),注入的恶意代码会直接融入查询语句;执行未授权SQL:数据库账户权限过高(如root权限),允许执行DROP、GRANT等高危操作。(2)常见触发场景GET参数:URL中的参数(如/search?id=1,注入为/search?id=1' OR 1=1--);POST参数:表单提交的参数(如登录表单的username/password、注册表单的手机号/邮箱);Cookie参数:Cookie中的身份标识(如user_id=123,注入为user_id=123' UNION SELECT...--);其他输入:HTTP头(如User-Agent、Referer)、文件上传的文件名(若文件名参与数据库存储查询)。4. SQL注入分类(按利用方式)(1)联合查询注入原理:利用UNION关键字将"攻击者构造的查询"与"合法查询"的结果合并,当合法查询无结果(如WHERE 1=2)时,仅显示攻击者查询的内容。适用场景:目标页面会直接显示SQL查询的结果(如搜索结果页、用户信息页)。示例:若合法查询为SELECT username, password FROM user WHERE id=1,注入后为SELECT username, password FROM user WHERE id=1 UNION SELECT schema_name, NULL FROM information_schema.SCHEMATA--,可获取所有数据库名。(2)错误型注入原理:故意构造错误的SQL语句(如'、AND 1=CONVERT(int, (SELECT @@version))),触发数据库报错,利用错误信息(如"Unknown column ‘xxx’ in ‘field list’")推测表名、列名或数据。适用场景:目标网站未屏蔽数据库错误信息,直接将错误详情返回给用户(如开发环境未关闭"错误调试模式")。(3)布尔盲注原理:目标页面不显示数据库数据,但会根据SQL查询结果的"TRUE/FALSE"返回不同页面(如TRUE时显示"存在",FALSE时显示"不存在")。攻击者通过构造"条件语句"(如OR SUBSTR(database(),1,1)='a'),逐位猜解数据。适用场景:页面仅反馈"成功/失败",无具体数据或错误信息。示例:猜解当前数据库名的第一个字符:/search?id=1' OR SUBSTR(database(),1,1)='s'--,若页面显示"存在",则第一个字符为s。(4)时间盲注原理:目标页面无论SQL查询结果为TRUE/FALSE,显示内容均相同,无法通过页面差异判断。攻击者利用SLEEP()等延时函数(如IF(条件, SLEEP(5), 0)),让TRUE时请求延时5秒,FALSE时正常响应,通过"响应时间"推断条件是否成立,逐位猜解数据。适用场景:页面无任何反馈差异(如无论查询是否成功,均显示"加载中")。示例:猜解当前数据库名长度:/search?id=1' OR IF(LENGTH(database())=8, SLEEP(5), 0)--,若请求耗时超过5秒,则数据库名长度为8。时间盲注补充函数示例:

-- 不同数据库的延时函数

MySQL: SLEEP(5)、BENCHMARK(1000000,MD5('test'))

PostgreSQL: PG_SLEEP(5)

SQL Server: WAITFOR DELAY '0:0:5'

Oracle: DBMS_LOCK.SLEEP(5)

5. 核心危害数据泄露:窃取数据库中的敏感信息,如用户账号密码(SELECT username, password FROM user)、银行卡号、身份证号、业务数据(订单、交易记录);权限提升:通过GRANT语句获取数据库高权限(如GRANT ALL PRIVILEGES ON *.* TO 'attacker'@'%' WITH GRANT OPTION;),甚至控制数据库服务器;数据篡改/删除:修改数据(如UPDATE user SET balance=100000 WHERE username='attacker')、删除表/库(如DROP TABLE user;),导致业务瘫痪;执行系统命令:部分数据库支持通过扩展功能执行系统命令(如MySQL的xp_cmdshell插件,EXEC master..xp_cmdshell 'ipconfig'),直接控制服务器操作系统;服务中断:构造复杂SQL语句(如SELECT * FROM user WHERE id=1 OR (SELECT COUNT(*) FROM information_schema.tables) > 0)导致数据库查询拥堵,甚至崩溃,影响系统可用性。6. 防御措施(补充落地细节)使用参数化查询(预编译语句):核心防御手段,将SQL语句的"结构"与"参数"分离,参数仅作为"数据"处理,不参与SQL解析。示例(PHP+MySQLi):$stmt = $conn->prepare("SELECT * FROM user WHERE username = ? AND password = ?");

$stmt->bind_param("ss", $username, $password); // 绑定参数,"ss"表示两个字符串类型

$stmt->execute(); 严格输入验证(白名单优先):

对数字型输入(如ID、年龄),强制验证为整数(如is_numeric()函数);对字符型输入(如用户名、邮箱),仅允许合法字符(如字母、数字、@、.),过滤或转义特殊字符(如'、;、UNION);避免使用"黑名单"(易遗漏特殊字符),优先采用"白名单"(仅允许指定字符)。数据库账户降权(最小权限原则):

应用程序使用的数据库账户仅授予"必要权限"(如仅SELECT/INSERT/UPDATE,禁止DROP/GRANT/LOAD_FILE);禁止使用root、sa等超级账户连接应用;不同业务模块使用不同数据库账户(如用户模块账户仅访问user表,订单模块账户仅访问order表)。隐藏错误信息:生产环境关闭数据库错误详情显示,统一返回模糊错误(如"操作失败,请稍后重试"),避免泄露表名、列名、路径等敏感信息。部署Web应用防火墙(WAF):通过WAF拦截常见注入语句(如包含UNION、OR 1=1、SLEEP()的请求),作为外层防护。定期审计与扫描:使用SQL注入扫描工具(如SQLMap)定期检测应用,同时审计代码中SQL语句的构造方式,排查拼接风险。三、SSRF(服务器端请求伪造)1. 核心定义攻击者利用应用程序中"服务器主动发起请求"的功能(如URL预览、远程图片加载、API调用),伪造服务器的请求目标,使服务器作为"代理"访问非预期资源(如内网系统、本地文件、其他服务器端口),进而实现端口扫描、攻击内网或读取敏感文件的目的。

2. 漏洞触发场景应用程序存在"服务器端请求"功能且未做限制时,易触发SSRF:

URL预览:如论坛、社交平台的"链接预览"功能,用户输入URL后,服务器主动请求该URL获取标题、图片,若未限制目标地址,可被伪造;远程资源加载:如CMS系统的"远程模板导入"(输入URL加载模板文件)、图片爬虫(输入URL下载图片);第三方API调用:应用程序调用第三方服务(如地图API、支付API)时,若目标API地址可由用户控制,可被篡改。3. 常见利用方式(补充技术细节)端口扫描:通过服务器请求目标IP的不同端口(如22 SSH、3306 MySQL、8080 Tomcat),根据响应判断端口是否开放,获取服务banner信息(如http://target.com/ssrf?url=http://192.168.1.1:22,若返回"SSH-2.0-OpenSSH",则22端口开放);攻击内网应用:内网系统(如192.168.x.x、10.x.x.x)通常不对外网开放,安全性较低,攻击者可通过SSRF让服务器访问内网服务(如内网OA系统、数据库管理界面),尝试弱密码登录或利用内网漏洞;读取本地文件:利用file协议(部分应用支持)让服务器读取本地文件(如http://target.com/ssrf?url=file:///etc/passwd读取Linux用户密码文件,file:///C:/Windows/win.ini读取Windows系统配置文件);指纹识别:通过请求内网Web服务的默认页面(如http://192.168.1.100:8080/manager/html),根据返回的页面特征(如标题、图标)判断应用类型(如Tomcat、Jenkins),为后续攻击做准备;绕过限制:若应用存在IP/协议黑名单,攻击者可通过以下方式绕过:

短网址转换:将内网IP(如192.168.1.1)生成短网址(如https://t.cn/A6xXxXx),服务器解析短网址后访问内网;进制转换:将IP转为十进制/八进制(如192.168.1.1的十进制为3232235777,请求http://3232235777等同于访问192.168.1.1);HTTP基本认证:构造http://username:password@192.168.1.1,绕过简单的IP限制;特殊域名:使用localhost、0.0.0.0等特殊地址,部分配置中可能未将其加入内网黑名单。4. 核心危害内网探测与攻击:突破外网访问限制,获取内网拓扑(如IP段、开放服务),攻击内网脆弱系统(如未打补丁的服务器、弱密码设备);本地文件泄露:读取服务器本地敏感文件(如配置文件、密钥、日志),获取数据库密码、API密钥等信息;端口扫描与服务暴露:探测目标服务器及内网的开放端口,为后续攻击(如暴力破解、漏洞利用)提供信息;间接攻击第三方服务:利用服务器的IP地址请求第三方服务(如云服务API),可能绕过第三方的IP白名单限制,实施攻击。5. 防御措施(补充实操规则)过滤返回信息:服务器接收远程请求的响应后,仅保留业务所需内容(如URL预览仅提取标题和图片链接),过滤响应中的IP、端口、服务banner等敏感信息,避免攻击者通过返回内容判断目标状态;统一错误信息:无论请求失败原因(如"连接超时"“IP不可达”“端口关闭”),均返回统一的模糊提示(如"资源加载失败"),禁止返回具体错误(如"Connection refused to 192.168.1.1:3306");限制请求端口:仅允许服务器向HTTP/HTTPS常用端口发起请求,如80(HTTP)、443(HTTPS)、8080(HTTP备用)、8443(HTTPS备用),禁止访问22(SSH)、3306(MySQL)、1433(SQL Server)等非Web端口;黑名单+白名单管控目标地址:

黑名单:禁止请求内网IP段(如192.168.0.0/16、10.0.0.0/8、172.16.0.0/12、localhost、0.0.0.0)及已知危险地址;白名单:若业务明确仅需访问特定域名(如"仅允许加载微信、微博的图片"),则仅放行白名单域名,优先级高于黑名单;禁用危险协议:仅允许HTTP、HTTPS协议,禁止file(读取本地文件)、ftp(文件传输)、gopher(可构造复杂请求)、telnet(远程登录)等协议;验证请求目标合法性:对用户输入的URL,解析其真实IP(避免短网址、进制转换绕过),再判断是否在允许范围内;若为域名,需验证域名是否属于可信范围(如通过DNS解析后检查IP)。四、XSS(跨站脚本攻击)1. 核心定义攻击者通过在网页中注入恶意JavaScript脚本(或其他客户端脚本,如VBScript),当用户访问被注入的页面时,脚本在用户浏览器中自动执行,进而窃取用户敏感信息(如Cookie、Token)、伪造用户操作或篡改页面内容。其本质是"应用程序将用户输入的恶意脚本当作正常内容返回,浏览器未识别其为恶意代码而执行"。

2. XSS分类(按注入与触发方式)(1)存储型XSS(持久型XSS)核心特征:恶意脚本被永久存储在服务器端(如数据库、文件),所有访问该页面的用户都会触发脚本执行,影响范围广。攻击流程:

攻击者在用户输入框(如评论、帖子、私信)中提交恶意脚本(如);服务器未过滤脚本,将其存储到数据库;普通用户访问包含恶意脚本的页面(如评论列表页、帖子详情页);服务器从数据库读取恶意脚本,作为页面内容返回给用户;用户浏览器解析页面时,执行恶意脚本,窃取Cookie并发送给攻击者。典型场景:

社交媒体:用户帖子、评论、私信(如微博评论、论坛回帖);电商平台:商品评价、用户问答(如淘宝商品评论、京东问答区);企业应用:工单系统、内部公告(如公司OA的公告发布功能);教育平台:课程讨论、作业提交(如学习通的讨论区)。防御重点:输入过滤(存储前过滤恶意脚本)+ 输出转义(返回给页面时转义特殊字符)。(2)反射型XSS(非持久型XSS)核心特征:恶意脚本仅存在于URL参数或短期请求中,不存储到服务器,需通过诱导用户点击恶意URL触发,仅影响点击链接的特定用户。攻击流程:

攻击者构造包含恶意脚本的URL(如http://target.com/search?q=);通过邮件、聊天工具等诱导用户点击该URL;用户点击后,服务器将URL中的恶意脚本"反射"回页面(如搜索结果页显示"搜索内容:");用户浏览器执行脚本,完成攻击。典型场景:

搜索功能:URL中的搜索关键词参数(如/search?q=xxx);错误页面:URL中的错误信息参数(如/error?msg=xxx);登录跳转:URL中的返回地址参数(如/login?returnUrl=javascript:alert(1));API响应:JSONP回调函数注入(如/api/data?callback=)。防御重点:输出转义(将URL参数中的特殊字符转义后再显示),禁止直接将URL参数作为页面内容输出。(3)DOM型XSS核心特征:恶意脚本的注入和执行完全在客户端DOM中完成,服务器未参与数据处理(仅返回静态页面),漏洞源于前端JavaScript对用户输入的不当处理。攻击流程:

攻击者构造包含恶意脚本的URL(如http://target.com/page.html#name=,#后的内容仅在客户端解析,不发送给服务器);用户访问该URL;前端JavaScript读取URL参数(如location.hash)或DOM元素内容,未做过滤直接插入DOM(如document.getElementById('name').innerHTML = location.hash);浏览器执行插入的恶意脚本。典型场景:

单页面应用(SPA):前端路由参数(如Vue/React的this.$route.params)、状态管理(如Vuex、Redux)中的用户输入;动态内容加载:Ajax响应数据未过滤直接插入DOM(如$.get('/data', function(res){ $('#content').html(res.data) }));浏览器扩展:操作页面DOM的插件(如广告拦截插件、翻译插件);第三方组件:不安全的UI组件库(如未过滤输入的富文本编辑器)。防御重点:安全的DOM操作(避免使用innerHTML、outerHTML等直接插入HTML的方法,优先使用textContent、setAttribute等仅处理文本的方法)。3. 核心危害(补充具体场景)身份窃取:通过document.cookie窃取用户Session Cookie或Token,攻击者使用该Cookie登录用户账号,冒充用户身份;敏感信息泄露:读取本地存储(localStorage、sessionStorage)中的敏感数据(如保存的密码、收货地址),或监听表单输入(如信用卡号、验证码)并发送给攻击者;恶意操作:通过fetch或XMLHttpRequest模拟用户请求,执行自动操作(如转账、发布恶意帖子、修改用户密码);界面篡改:修改页面DOM内容(如替换"登录按钮"为钓鱼链接、插入虚假中奖提示),诱导用户点击或输入敏感信息;监听用户行为:通过addEventListener监听用户的鼠标点击、键盘输入,获取用户操作轨迹;广告与恶意内容推送:插入弹窗广告、虚假链接,或跳转至恶意网站(如钓鱼网站、病毒下载站);传播恶意代码:脚本自动向用户的联系人发送恶意链接(如微信、QQ的网页版),扩大攻击范围。4. 防御措施(补充技术细节)输入验证与过滤:

对用户输入的特殊字符(如<、>、'、"、&、javascript:)进行过滤或转义;使用成熟的过滤库(如PHP的htmlspecialchars()、JavaScript的DOMPurify),避免手动过滤遗漏;对富文本输入(如帖子编辑器),仅允许安全的HTML标签(如),禁止):将特殊字符转义为JavaScript转义序列(如"转义为\",\转义为\\);URL上下文(如):使用encodeURIComponent()对输入进行URL编码,避免注入javascript:伪协议。使用内容安全策略(CSP):

通过HTTP响应头Content-Security-Policy(CSP)限制浏览器加载和执行的资源来源,例如:Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.jsdelivr.net; style-src 'self'; img-src 'self' data:; 上述配置表示:仅允许从自身域名加载默认资源,仅允许从自身和cdn.jsdelivr.net加载脚本,禁止执行内联脚本(如)和eval()函数,从源头阻止恶意脚本执行。禁用不安全的API:

前端避免使用innerHTML、outerHTML、document.write()等直接插入HTML的方法,优先使用textContent(设置文本内容)、setAttribute(设置属性);禁用eval()、Function()、setTimeout(string)等可执行字符串的函数,防止脚本注入。设置Cookie安全属性:

HttpOnly:禁止JavaScript通过document.cookie读取Cookie,防止XSS窃取Cookie;Secure:仅允许HTTPS协议传输Cookie,避免HTTP协议下的Cookie被劫持;SameSite=Strict/Lax:限制Cookie仅在同站请求中携带,减少跨站场景下的Cookie泄露风险。部署WAF:通过WAF拦截包含恶意脚本的请求(如