1. 项目概述一份实战派的安全工程师“弹药库”在安全测试和渗透评估的日常里SQL注入始终是绕不开的经典课题。无论是企业内部的漏洞自查还是CTF竞赛中的夺旗挑战一个高效、精准的Payload清单往往能让你在关键时刻快人一步直击要害。这份“60个SQL注入Payload实战清单”并非简单的命令堆砌而是我结合多年一线渗透测试和红队评估经验从海量实战案例、靶场演练和真实漏洞报告中提炼、验证并分类整理的“即用型弹药库”。它的核心价值在于“直接套用”。很多刚入行的朋友或者时间紧迫的工程师在面对一个疑似存在注入点的参数时常常需要临时去搜索、拼接测试语句不仅效率低下还可能因为语句构造不当而错过真正的漏洞。这份清单将最常见的注入场景如联合查询、报错注入、布尔盲注、时间盲注、堆叠查询等和绕过技巧如编码绕过、注释符使用、空格替代等封装成可以直接复制粘贴的Payload模板。你只需要根据目标的数据库类型MySQL、MSSQL、Oracle、PostgreSQL等和注入点上下文数字型、字符型、搜索型等像查字典一样找到对应的Payload稍作修改即可投入测试极大提升了手工测试的效率和成功率。2. 清单设计思路与核心分类逻辑一份好的Payload清单绝不是杂乱无章的代码片段集合。它的结构必须清晰逻辑必须自洽才能在实际高压的测试环境中快速定位所需。我设计这份清单的核心思路是“场景驱动层层递进”。2.1 按注入技术类型分类从基础到高级这是最根本的分类维度决定了你使用何种攻击手法来提取数据。第一层基于回显的注入这类注入点会直接将数据库的错误信息或查询结果返回在页面中是最“友好”的情况。清单中为此类场景准备了最丰富的Payload。联合查询注入 (Union-Based)这是效率最高的方式前提是需要确定列数。清单提供了从探测列数到最终获取数据的完整链条Payload例如order by探测、union select拼接等。报错注入 (Error-Based)利用数据库函数的执行错误将查询结果带到错误信息中。清单收录了针对不同数据库的经典报错函数如MySQL的updatexml()、extractvalue()MSSQL的convert()等。第二层基于逻辑推断的注入当页面没有直接回显时就需要依靠逻辑判断。布尔盲注 (Boolean-Based Blind)通过注入条件语句根据页面返回内容的差异如真/假、内容存在/不存在来逐位推断数据。清单提供了完整的条件判断模板如and 11、and 12、and ascii(substr(database(),1,1))97等。时间盲注 (Time-Based Blind)当页面返回内容无论真假都相同时通过注入能引起时间延迟的函数根据响应时间来判断条件真假。清单包含了sleep()、benchmark()等函数的应用Payload。第三层特殊与高级注入堆叠查询 (Stacked Queries)在某些支持多语句执行的数据库如MSSQL、PostgreSQL中可以执行额外的数据库操作如增删改查其他表。清单提供了试探和执行堆叠查询的语句。二次注入 (Second-Order)Payload先被存入数据库之后在另一个逻辑中被调用执行。清单会提示需要注意的用户注册、留言等存储型场景的测试Payload。宽字节注入主要针对使用GBK等宽字符集且对引号进行了转义\的防护。清单提供了经典的%df%27绕过Payload。2.2 按防御绕过技巧分类见招拆招现代应用多少都会有一些防护措施Payload需要具备“变形”能力。注释符技巧灵活使用--、#、/*...*/来注释掉后续的SQL代码是构造Payload的基础。清单会说明它们在各种数据库和上下文中的优先级及使用差异。空格绕过当空格被过滤时清单提供了替代方案/**/、%0a换行、%0d回车、%09制表符、等。关键词绕过针对select、union、where等关键词的过滤清单收录了大小写混淆、双写绕过selselectect、内联注释/*!select*/、等价函数/符号替换等Payload。编码与混淆包括URL编码、十六进制编码、Unicode编码等用于绕过简单的关键词匹配过滤。2.3 按数据库类型差异化对症下药不同的数据库其系统函数、语法细节、连接方式各不相同。清单为四大主流数据库MySQL, MSSQL, Oracle, PostgreSQL分别提供了专属的Payload模块。MySQL重点在information_schema库的利用concat()、group_concat()函数以及/*!...*/内联注释的妙用。MSSQL关注sysobjects和syscolumns系统视图quotename()、db_name()函数以及显错注入的丰富玩法。Oracle强调dual表的使用chr()、utl_inaddr.get_host_address等函数以及复杂的子查询语法。PostgreSQL利用pg_catalog系统表string_agg()函数以及||字符串连接符。注意在实际测试中第一步往往是进行“指纹识别”通过简单的报错或特征函数如version()来判断后端数据库类型然后再选用对应的Payload模块这是高效利用本清单的前提。3. 核心Payload解析与实战应用要点下面我将从清单中挑选几类最具代表性的Payload深入解析其构造原理、使用场景和注意事项让你不仅能“套用”更能“理解”。3.1 联合查询注入高效数据提取的标准流程联合查询注入的Payload序列体现了一个完整的攻击链。1. 探测列数 (order by) order by 1-- order by 2-- ...递增...原理order by子句根据指定列索引进行排序。当指定的列索引超过实际查询的列数时数据库会报错。我们通过递增数字直到页面返回错误即可反推出列数。实操要点注意观察页面变化。有时错误是显式的如SQL语句错误有时是隐式的如页面布局错乱或部分内容消失。在字符型注入中别忘了闭合前引号。2. 探测回显点 (union select) union select 1,2,3-- union select null,null,null-- 某些数据库如Oracle需用null占位原理在确定列数后使用union select拼接一个我们可控的查询并观察我们注入的数字或null在页面的哪个位置被显示出来这些位置就是可以回显数据的地方。注意事项前后两个select语句的列数必须相同。原查询可能很复杂我们无需关心它具体查什么只需保证列数一致即可。如果页面没有显示我们注入的数字可能需要将原查询结果设置为空例如添加一个不可能成立的条件and 12。3. 提取关键信息假设回显点是第2和第3列。 and 12 union select 1, database(), user()-- union select 1,group_concat(table_name),3 from information_schema.tables where table_schemadatabase()--原理将我们关心的信息如当前数据库名database()、当前用户user()、表名、列名放到回显点的位置上。group_concat()函数MySQL可以将多行结果合并成一行方便查看。避坑技巧information_schema是MySQL的信息数据库但在其他数据库中不同如MSSQL是sysobjects。清单中会明确区分。此外注意数据长度限制过长的结果可能被截断此时需要用substr()函数分段获取。3.2 报错注入从错误信息中“榨取”数据当页面会显示数据库的详细错误信息时报错注入是利器。MySQL经典报错Payload and updatexml(1, concat(0x7e, (select user()), 0x7e), 1)--原理拆解updatexml()函数用于更新XML文档。它的第二个参数需要是合法的XPath路径。我们故意构造一个不合法的路径例如concat(0x7e, (select user()), 0x7e)0x7e是波浪号~的十六进制这将导致函数执行错误并将错误信息其中包含了我们拼接进去的select user()的结果返回。关键细节concat()中的特殊字符如0x7e是为了让构造的字符串明显不是一个合法的XPath确保报错。不同的报错函数对输出长度有限制如updatexml最多32位获取长数据时需要结合substr()分段。MSSQL报错注入示例 and 1convert(int, (select version))--原理convert()函数尝试将select version返回的字符串转换为int整型这必然导致类型转换错误从而在错误信息中带出版本信息。场景适配此方法在MSSQL中非常有效。清单中还提供了利用db_name()、quotename()等函数进行报错注入的变种Payload。3.3 布尔/时间盲注在沉默中“对话”这是最考验耐心和技巧的注入类型。布尔盲注Payload模板 and ascii(substr((select database()),1,1))100--逻辑解析这个Payload是一个布尔条件。substr((select database()),1,1)取出当前数据库名的第一个字符。ascii()将其转换为ASCII码。最后判断这个ASCII码是否大于100。如果条件为真页面正常显示为假页面可能空白、错误或与正常态有细微差别。通过不断调整比较的数值如50, 150采用二分法可以快速确定该字符的准确ASCII值从而推断出字符。实操心得成功的关键在于找到页面在“真”和“假”状态下的稳定、可区分的差异。这个差异可能是一个单词的出现/消失、一张图片的加载/不加载、页面长度的微小变化甚至是响应头中的某个字段。需要仔细对比观察。自动化工具如sqlmap本质上也是基于这个原理但手工理解过程对排查WAF和复杂过滤至关重要。时间盲注Payload模板 and if(ascii(substr(database(),1,1))100, sleep(3), 0)--原理与操作如果条件为真则执行sleep(3)让数据库等待3秒导致HTTP响应延迟如果为假则立即返回。通过测量响应时间就能判断条件真假。注意事项网络延迟可能干扰判断因此设置的睡眠时间如3秒要显著大于正常网络波动。时间盲注速度极慢在实际渗透中通常用于最终确认漏洞存在或获取最关键的一小部分数据。清单中也提供了使用benchmark()函数进行延时的方法作为备选。4. 防御绕过Payload的构造艺术现代WAFWeb应用防火墙和自定义过滤给SQL注入增加了难度我们的Payload需要变得更“聪明”。4.1 绕过常见关键词过滤案例过滤了select和union大小写混淆SeLeCt,UnIoN。这是最简单的绕过对仅进行大小写敏感匹配的过滤有效。双写绕过selselectect,ununionion。如果过滤逻辑是简单地删除关键词那么双写后删除中间的“select”剩下的字符正好又组成了“select”。内联注释MySQL特有/*!select*/。在MySQL中/*!...*/中的内容会被当作SQL语句执行。可以结合使用/*!UnIoN*/ /*!SeLeCt*/ 1,2,3。等价替换某些场景下可以用like代替用mid()或substring()代替substr()。4.2 绕过空格过滤空格是SQL语句的分隔符但并非不可替代。使用注释符/**/是最常用的空格替代。例如union/**/select/**/1,2,3。使用URL编码%0a换行符、%0d回车符、%09制表符在HTTP请求中经常被解析为空白符。例如union%0aselect%0a1,2,3。使用括号在特定语法中括号可以起到分隔作用。例如在函数名和参数之间本需空格但有时可以省略或使用其他方式。4.3 编码与混淆实战十六进制编码将关键词或字符串转换为十六进制。例如select的十六进制是0x73656c656374。Payload可以写成union select 1,0x73656c656374,3。这样在传输过程中“select”这个词本身就不会出现。更常见的是对要查询的数据进行编码select hex(database())先以十六进制形式获取结果再解码。URL编码主要针对特殊字符。单引号编码为%27空格编码为%20或注释符--编码为%2d%2d%20这常用于绕过对特定字符的简单检查或者处理HTTP协议层面的参数传递问题。5. 针对不同数据库的Payload差异化实战5.1 MySQL 实战要点MySQL的注入以其丰富的函数和information_schema数据库而方便。信息获取version(),database(),user(),version_compile_os数据拼接concat(),group_concat()非常实用用于将多行结果合并系统表information_schema.tables(table_name, table_schema),information_schema.columns(column_name, table_name)一个完整的爆表爆列Payload示例 union select 1,group_concat(table_name),3 from information_schema.tables where table_schemadatabase()-- union select 1,group_concat(column_name),3 from information_schema.columns where table_nameusers and table_schemadatabase()-- union select 1,group_concat(username,0x3a,password),3 from users--0x3a是冒号:的十六进制用于分隔字段。5.2 Microsoft SQL Server (MSSQL) 实战要点MSSQL权限体系复杂且支持多语句执行堆叠查询攻击面更广。信息获取version,db_name(),user,system_user系统视图sysobjects(where xtypeU 查用户表),syscolumns报错注入convert(),cast()类型转换错误db_name()与convert()结合quotename()函数溢出错误。堆叠查询与命令执行这是MSSQL的危险特性。如果数据库连接权限足够高如sa可能通过堆叠查询执行系统命令。; exec xp_cmdshell whoami--重要警告此操作极具破坏性仅在获得明确授权的渗透测试中对测试目标方可谨慎尝试。清单中收录此类Payload是为了知识的完整性使用时必须恪守法律和道德底线。5.3 Oracle 实战要点Oracle语法严谨通常需要配合dual虚拟表且字符串处理函数不同。信息获取select banner from v$versionselect user from dual数据拼接使用||连接符或wm_concat()函数旧版本。查表查列通过user_tables和user_tab_columns。 union select null,table_name,null from user_tables-- union select null,column_name,null from user_tab_columns where table_nameUSERS--注意Oracle对数据类型匹配要求严格在union select时需用null来适配不同数据类型的列。5.4 PostgreSQL 实战要点PostgreSQL的注入风格介于MySQL和Oracle之间。信息获取version(),current_user,current_database()系统表pg_catalog.pg_tables(tablename, schemaname),pg_catalog.pg_columns字符串聚合string_agg(column_name, ,)报错注入可以利用类型转换错误如cast(version() as int)。6. 实战流程与问题排查实录拥有清单后一个系统化的手工注入测试流程如下1. 探测与确认目标id1数字型或nameadmin字符型。操作使用清单中的“基础探测Payload”如id1、id1 and 11、id1 and 12观察页面差异初步判断是否存在注入点及注入类型。2. 指纹识别目标确定后端数据库。操作提交数据库特有的函数或语法如id1 and version()0MySQL/PostgreSQLid1 and version0MSSQLid1 and (select banner from v$version where rownum1) is not nullOracle。根据报错信息或页面正常与否来判断。3. 选择攻击路径有显错优先使用报错注入快速获取信息。有回显使用联合查询注入效率最高。无回显但有布尔状态使用布尔盲注。无任何差异尝试时间盲注。4. 实施数据提取根据选择的路径从清单中找到对应数据库类型的Payload模板。按部就班查库名 - 查表名 - 查列名 - 查数据。注意使用limit或分段函数处理大量数据。5. 常见问题与排查问题提交Payload后页面返回空白或500错误。排查可能是Payload语法错误触发了数据库异常。检查引号闭合、注释符使用是否正确。可能是WAF拦截。尝试清单中的绕过技巧如编码、注释符变形、更改请求方法GET/POST互换、添加无关参数等。问题联合查询时order by能测出列数但union select不回显数字。排查原查询可能返回了数据覆盖了我们的结果。在注入点前添加一个永假条件使原查询结果为空id-1 union select 1,2,3--。或者尝试将数字替换为更显眼的字符串如union select aaa,bbb,ccc--。问题布尔盲注时真/假页面状态差异极难辨别。排查不要只盯着主内容。对比查看整个HTTP响应响应头长度、Set-Cookie字段、页面中某个特定标签如title的内容、某个隐藏输入框的值。使用Burp Suite的“Comparer”工具进行字节级对比是发现细微差异的神器。问题时间盲注不稳定有时延时不触发。排查增加睡眠时间如从2秒加到5秒。检查Payload是否被防火墙或应用层过滤。尝试不同的时间函数如benchmark(10000000,md5(test))。考虑网络波动多次请求取平均响应时间作为基线。这份“60个SQL注入Payload实战清单”是一个活的工具它需要你在实战中不断验证、补充和调整。真正的功力不在于记住了多少Payload而在于面对一个黑盒系统时能快速形成测试思路并能灵活地将清单中的“模块”组合、变形最终构造出那把打开漏洞之门的“钥匙”。安全之路道阻且长愿这份清单能成为你手中一把趁手的利器。