第42天:WEB攻防-PHP应用MYSQL架构SQL注入跨库查询文件读写_笔记|小迪安全2023-2024|web安全|渗透测试|

张开发
2026/4/19 18:15:09 15 分钟阅读

分享文章

第42天:WEB攻防-PHP应用MYSQL架构SQL注入跨库查询文件读写_笔记|小迪安全2023-2024|web安全|渗透测试|
第42天WEB攻防-PHP应用MYSQL架构SQL注入跨库查询文件读写_笔记一、知识点00:08课程定位: WEB安全攻防系列课程中的PHP应用安全专题重点讲解SQL注入漏洞语言特性差异: 不同编程语言(JS/ASP/PHP/NET/JAVA/Python)的漏洞原理相似但存在实现差异学习路径: 通过PHP语言掌握漏洞原理后其他语言的学习会更快二、课程要点01:54SQL注入专题: 将用3-4次直播全面讲解包括常规查询、跨库查询和文件读写实战价值: 虽然SQL注入漏洞出现频率降低但仍是WEB安全基础知识点架构重点: PHP应用通常与MySQL数据库组合使用需理解其架构特点三、PHP-MYSQL-WEB组成架构02:371. PHP-MYSQL-Web组成架构介绍02:41基本组成: 服务器安装MySQL数据库可搭建单个或多个站点数据库集中存储在MySQL中管理方式:统一使用root用户管理所有数据库为每个网站创建独立用户管理对应数据库(推荐)2. 服务器安装与多站点搭建02:50环境搭建: 使用phpStudy等集成环境可快速搭建多个站点站点配置:每个站点可绑定不同域名或端口(如81/82端口)指向独立的网站目录(如Z-Blog和demo01)数据库连接: 网站源码中包含数据库配置文件指定连接用户和数据库名3. 不同管理方式的差异与选择08:26统一管理(root用户):所有网站数据库都由MySQL的root用户管理优点管理简单缺点安全性较低一旦泄露影响所有数据库独立用户管理:为每个网站创建专属数据库用户(如zblog用户管理zblog数据库)优点权限隔离安全性高缺点管理稍复杂4. 架构模型总结与实战应用09:40模型对比:模型1MySQL → root用户 → 网站A(testA库)/网站B(testB库)模型2MySQL → testA用户 → testA库 / testB用户 → testB库实战意义:影响SQL注入攻击的思路和方法统一管理模式下可通过root用户进行跨库查询独立用户模式下攻击面受限于单个数据库权限四、PHP注入13:101. 代码结构分析文件包含代码开头包含config.php文件这是数据库配置文件模板加载使用file_get_contents()函数加载new.html模板文件ID参数处理通过$_GET[‘id’]获取URL参数未传值时默认设为’1’SQL拼接直接将ID参数拼接到SQL语句中存在注入漏洞查询执行使用mysqli_query()执行SQL语句并输出结果2. 关键函数解析函数作用将整个文件读入一个字符串的首选方法参数说明$filename要读取的文件名$use_include_path是否在include路径中查找文件$context资源上下文$offset开始读取的位置$maxlen最大读取长度性能优化操作系统支持时会使用内存映射技术增强性能注意事项URL包含特殊字符(如空格)时需要先进行URL编码3. 注入原理分析默认值处理当不传ID参数时默认设为’1’执行查询SQL拼接方式直接拼接$_GET[‘id’]到SQL语句中未做任何过滤查询执行通过mysqli_query()执行拼接后的SQL语句结果输出使用mysqli_fetch_row()遍历查询结果并输出到模板4. 实际运行演示默认查询访问不带ID参数的URL时自动执行select * from news where id1SQL输出代码中通过echo$sql显示实际执行的SQL语句结果渲染查询结果被填充到模板对应位置后输出完整页面5. 数据库连接验证数据库环境使用MySQL 5.7.26版本连接信息通过localhost的3306端口连接表结构news表包含id、page_title、heading、subheading、content、item等字段权限说明演示中使用root用户连接实际开发中应避免使用高权限账户五、SQL注入原理15:041. 例题1:SQL注入实例演示基本流程通过修改URL中的id参数值可以查询不同新闻内容。例如id1查询小迪安全博客内容id2查询萧瑟迪安全博客内容。数据库操作实际执行的是SELECT * FROM news WHERE idid语句id直接从URL参数获取未经过滤。注入验证当id3时页面无内容说明数据库中没有id3的记录这为后续注入创造了条件。数据修改通过数据库工具直接插入id3的记录后页面可以正常显示新增内容小瑟迪安全博客。关键发现页面内容完全由数据库查询结果决定且参数值直接拼接到SQL语句中。2. 例题2:SQL注入获取管理员账号密码18:56攻击方法使用联合查询UNION SELECT获取其他表数据如id3 union select 1,2,username,password,5,6 from admin。结果展示成功获取admin表中的用户名和密码admin/123456和xiaodi/xiaodisec。原理验证通过Navicat执行相同SQL语句确认返回结果与网页显示一致。参数构造需要将空格编码为%20等特殊字符如id3%20union%20select…。字段匹配必须确保UNION前后查询的字段数量相同通过数字占位确定显示位置。限制绕过添加limit 0,1可以控制返回的记录数量。3. SQL注入的架构23:56核心原理接受的参数值未进行过滤直接带入SQL查询如ididid_GET[‘id’]直接拼接到SQL语句。攻击本质利用SQL语句执行任意查询SQL语句能实现的功能就是注入能实现的攻击范围。数据库差异不同数据库MySQL/Oracle等的SQL语法差异导致注入技术不同功能支持决定攻击危害。最小权限原则为每个网站创建单独数据库用户如zblog用户只能访问zblog数据库。参数过滤应对所有输入参数进行严格过滤和转义。预处理语句使用参数化查询避免SQL拼接这是最有效的防御方式。六、实战案例24:221. 案例展示环境搭建演示通过phpstudy搭建的网站环境访问端口为81和82分别对应Z-Blog和demo01两个站点数据库连接使用Navicat连接MySQL数据库展示demo01数据库中的admin表结构包含username、password等字段2. 数据库架构与用户管理26:51管理方式统一管理所有网站数据库由root用户统一管理一对一管理推荐方式每个网站创建独立用户管理对应数据库版本问题演示中出现的语法错误是由于PHP版本兼容性问题导致更换版本后解决3. SQL注入与数据库信息获取31:11数据层级数据库名如demo01、zblog等表名如admin、news等列名/字段如username、password等数据表中存储的具体记录与Access区别Access单层结构直接通过字典猜测表名和字段名MySQL多层结构可通过information_schema系统数据库获取信息4. information_schema数据库介绍31:47作用MySQL 5.0以上版本自带的元数据库存储所有数据库名、表名和列名信息版本限制仅MySQL 5.7及以下版本完整支持information_schema查询5. SCHEMATA表介绍32:11功能记录MySQL服务器中所有数据库的名称信息关键字段SCHEMA_NAME字段存储所有数据库名称查询示例SELECT * FROM information_schema.SCHEMATA6. 数据库查询操作33:50点表示法使用数据库名.表名格式进行跨数据库查询示例SELECT * FROM zblog.zbp_member当前数据库未指定数据库名时默认在当前数据库查询7. TABLES表介绍35:17功能记录所有数据库中的表信息关键字段TABLE_SCHEMA表所属的数据库名TABLE_NAME表名本身应用通过查询此表可获取指定数据库中的所有表名七、SQL注入基础35:581. 信息架构information_schema: MySQL 5.0自带的核心数据库存储所有数据库元数据schemata表: 记录所有数据库名称信息tables表: 记录所有表名信息columns表: 记录所有列名信息2. 关键查询技术数据库枚举: union select 1,2,3,group_concat(schema_name),6 from information_schema.schemata表名枚举: union select 1,2,3,group_concat(table_name),6 from information_schema.tables where table_schema‘zblog’列名枚举: union select 1,2,3,group_concat(column_name),6 from information_schema.columns where table_name‘zbp_member’3. 文件读写操作必要条件:当前数据库用户有文件权限secure-file-priv设置允许文件读取: union select 1,load_file(‘d:\1.txt’),3,4,5,6文件写入: union select 1,‘xiaodi’,3,4,5,6 into outfile ‘d:\2.txt’4. 系统表结构关键字段:schema_name: 记录数据库名table_schema: 关联数据库名table_name: 记录表名column_name: 记录列名5. 注入技术对比MySQL优势: 可直接查询information_schema获取元数据Access劣势: 需要字典猜测表名和列名数据类型: 需注意不同数据库的语法差异6. 实战查询示例用户信息查询: select * from news where id3 union select 1,2,username,password,5,6 from admin系统信息查询:union select 1,2,3,database(),user(),6union select 1,2,3,version(),version_compile_os,67. 防御措施输入过滤: 对所有用户输入进行严格验证权限控制: 数据库用户使用最小权限原则安全配置: 禁用不必要的文件系统访问权限八、火狐浏览器38:35界面配置建议使用黑色主题更易于理解虽然未安装特定插件但可以使用火狐自带的工具功能文件搜索功能支持使用系统通配符?“和”*进行本地文件快速查找例如搜索我的工作计划文档九、手工注入39:081. 手工注入的判断与理解39:14order by作用用于判断数据库表中字段数量通过不断调整数字直到页面显示异常可以确定字段数手工注入步骤先测试order by语句如order by 7通过页面是否报错判断字段数确定字段数后(如6个)再构造完整查询语句建议手工编写SQL语句而非使用插件有助于深入理解注入原理报错技巧若页面不报错可在参数前加减号强制报错如-id1关键信息查询通常需要查询以下四项数据库版本(判断是否大于5.0影响information_schema可用性)数据库用户(权限判断)操作系统(影响路径大小写敏感性Linux区分大小写而Windows不区分)当前数据库名(后续查询的基础)information_schemaMySQL系统数据库存储表结构等元数据但仅适用于5.0以上版本十、查询数据库版本42:21查询语法通过内置语句可同时查询数据库版本、数据库名和操作系统信息显示结果数据库版本5.7.26数据库名dom01操作系统WINDOWS 64位注意这是MySQL内置的固定查询语法不需要理解为什么这样写十一、查询表名43:281. 基础查询语法核心语句SELECT * FROM information_schema.tables WHERE table_schema‘数据库名’组成部分information_schema.tables系统内置的表信息存储表table_schema条件字段用于指定要查询的数据库执行原理不添加条件会返回所有表信息通过WHERE限定只显示指定数据库的表2. 查询结果处理默认显示直接查询会返回60条记录包含系统表优化方法使用GROUP_CONCAT()函数合并显示结果典型结果对dom01数据库查询会显示三个关键表名admin、gbox、64筛选技巧根据表名字段含义选择关键表如admin最可能是管理员表3. 字段查询延伸后续步骤确定关键表后需要查询其字段结构如username/password字段查询逻辑必须先知道表名才能查询具体字段这是层级递进关系重要性admin表的用户名字段是获取登录凭证的关键信息源十二、查询年龄的信息47:521. 查询列名信息查询语句修改将查询表名信息改为查询列名信息需要将查询字段改为column_name数据来源列名信息存储在系统表的column_name字段中2. 查询条件设置双条件查询需要设置两个查询条件条件一table_schema‘dom01’指定数据库名条件二table_name‘admin’指定表名完整查询语句SELECT column_name FROM information_schema.columns WHERE table_schema‘dom01’ AND table_name‘admin’3. 查询结果应用结果验证执行查询后可以获取到admin表的列名信息一步到位查询获取列名后可以直接使用SELECT * FROM admin进行完整查询数据限制技巧LIMIT 0,1查询第一条数据LIMIT 1,1查询第二条数据当查询超出数据范围时会报错4. 条件查询方法精确查询可以通过WHERE id1等条件查询特定记录数据验证当查询不存在的记录如id3时会报错5. MySQL版本说明版本兼容性当前讲解的注入方法适用于MySQL 5.0及以上版本版本现状MySQL 5.0以下的版本十年前的产品目前已很少见十三、跨库查询52:251. 概念与原理定义跨库查询是指通过一个数据库用户权限访问其他数据库的数据核心条件需要具备root级别的高权限用户才能执行架构关系与数据库用户管理架构直接相关root用户可管理所有库普通用户只能管理指定库2. 用户权限对比实验root用户特性可查看和操作所有数据库如demo0521、information_schema等连接时使用rootlocalhost:3306普通用户特性示例用户demo0521/123456只能看到自己的数据库无法查看其他数据库内容权限比喻root相当于总管普通用户相当于部门主管3. 跨库注入攻击演示攻击流程查询information_schema.schemata获取所有数据库名识别目标数据库如zblog查询zblog的表明如zbp_member获取关键字段member_name, member_pass关键SQL语句注意事项跨库查询时必须指定数据库前缀如zblog.4. 安全防护方案风险根源使用root用户作为网站数据库连接用户解决方案为每个网站创建独立数据库用户采用一对一用户管理架构用户权限最小化原则防护效果即使一个网站被注入也不会影响其他网站数据十四、文件读写注入1. 文件读取操作关键函数LOAD_FILE()示例限制条件需要root权限受secure_file_priv参数限制需要知道文件绝对路径2. 文件写入操作关键语法路径获取方法通过报错信息泄露查看phpinfo页面常见中间件默认路径尝试3. 防护机制MySQL配置设置secure_file_priv限制目录高版本MySQL默认禁用文件读写防御建议使用普通数据库用户定期检查数据库配置十五、课后总结01:37:231. 注入攻击思路root用户场景先测试文件读写失败后再尝试跨库查询普通用户场景直接尝试获取当前数据库数据2. 编码技巧16进制编码可替代单引号绕过过滤应用场景表名、数据库名、路径等均可编码3. 实战要点信息收集通过user()判断当前权限配置文件数据库连接用户决定注入权限版本影响高版本MySQL防护更强需结合其他漏洞十六、知识小结知识点核心内容技术要点难度系数SQL注入原理未过滤参数直接带入数据库查询参数拼接导致恶意SQL执行⭐⭐数据库架构模型Root统一管理 vs 独立用户管理权限差异导致安全风险不同⭐⭐⭐信息收集技术查询information_schema获取元数据获取数据库/表/列结构信息⭐⭐跨库注入攻击利用高权限账户跨数据库查询Root用户可访问所有数据库⭐⭐⭐⭐文件读写操作load_file()读取 / into outfile写入需root权限和目录权限配置⭐⭐⭐⭐路径获取方法报错信息/配置文件/默认路径探测关键配置文件路径猜测⭐⭐⭐编码绕过技术十六进制编码替代单引号绕过WAF过滤规则⭐⭐⭐防御措施secure_file_priv权限限制数据库配置加固方案⭐⭐

更多文章