前面刚弄明白数据库是什么SELECT 查询WHERE 条件ORDER BY 排序LIMIT 分页本来以为已经差不多了结果发现无论看什么 SQL 注入教程。总会出现一个熟悉的东西UNION刚开始看到它的时候我完全不知道它是干什么的直到真正学习之后才发现很多 SQL 注入知识其实都是围绕 UNION 展开的。今天就结合自己的学习过程聊聊我最近对 UNION 的理解。一、UNION 到底是什么先不要把它想得太复杂我现在对 UNION 最简单的理解是把多个查询结果合并到一起例如有两张表。第一张表idusername1admin2test第二张表idusername1user2guest如果分别查询 SELECT username FROM table_a;得到admintest再查询 SELECT username FROM table_b;得到userguest而 UNION 的作用就是SELECT username FROM table_aUNIONSELECT username FROM table_b;结果admintestuserguest看到这里的时候。我突然觉得UNION 有点像拼接数据把两次查询的结果放到一起展示。二、为什么数据库要设计 UNION我一直有个疑问既然能查一次为什么还要合并查询后来发现现实开发中非常常见。例如网站有普通用户表管理员表有时候开发需要把两个结果一起显示。这时候就会用到UNION所以它本来就是数据库提供的正常功能并不是专门为了安全研究设计的。三、UNION 最重要的规则学习 UNION 时我发现一个知识点特别重要。那就是字段数量必须一致例如正确SELECT id,username UNION SELECT id,nickname;两个查询都是两列 所以能够合并。如果这样SELECTid,usernameUNION SELECTnickname;就会出错。因为前面两列后面一列数量对不上数据库不知道怎么拼接。四、我终于明白为什么总有人研究字段数以前看 SQL 注入文章经常看到判断字段数当时特别困惑。为什么这么执着于字段数量后来学 UNION 才明白。因为UNION 合并查询 必须保证字段数量一致如果数量不一致数据库直接报错。所以很多人研究字段数本质上是在研究原来的查询到底返回几列 这样后面才能正确组合查询结果。五、UNION 和 ORDER BY 的关系我又想起上一篇学习的 ORDER BY后来发现很多 SQL 注入学习路线里。ORDER BY 经常出现在 UNION 前面。原因其实很简单。因为ORDER BY能够帮助我们了解查询结构有多少列而UNION 又要求字段数一致。这样两者就串起来了。以前觉得这些知识点毫无关联。现在慢慢开始连接起来。六、我开始发现 SQL 学习越来越有意思刚开始学数据库的时候。感觉全是命令特别枯燥。后来发现其实很多命令背后都有自己的逻辑。例如WHERE 负责筛选ORDER BY 负责排序LIMIT 负责分页UNION 负责合并结果这样理解之后SQL 好像突然变得简单了很多。七、为什么不要急着背各种注入技巧最近学习过程中我越来越有一个感受很多人一开始学 SQL 注入。最想看的往往是报错注入联合查询盲注各种技巧但如果不知道UNION 为什么存在那么后面的内容基本都会变成死记硬背而真正理解 UNION 后你会发现很多知识其实是在利用数据库本身的特性。八、我现在对 SQL 注入的理解以前我觉得SQL注入各种神秘技巧现在越来越觉得SQL注入理解数据库理解SQL理解用户输入数据库本身没有问题SQL 语句本身也没有问题。真正的问题在于用户输入影响了数据库原本想执行的逻辑而 UNION。正是理解这个过程的重要一环。九、最后以前我看到 UNION只觉得它是一个陌生的 SQL 命令。真正学习之后才发现它其实只是数据库用来合并查询结果的一种正常功能。而对于学习 SQL 注入的人来说理解 UNION 的意义。并不是为了记住一个命令。而是为了开始真正理解数据库是如何处理查询的
为什么学 SQL 注入的人都绕不开 UNION?
前面刚弄明白数据库是什么SELECT 查询WHERE 条件ORDER BY 排序LIMIT 分页本来以为已经差不多了结果发现无论看什么 SQL 注入教程。总会出现一个熟悉的东西UNION刚开始看到它的时候我完全不知道它是干什么的直到真正学习之后才发现很多 SQL 注入知识其实都是围绕 UNION 展开的。今天就结合自己的学习过程聊聊我最近对 UNION 的理解。一、UNION 到底是什么先不要把它想得太复杂我现在对 UNION 最简单的理解是把多个查询结果合并到一起例如有两张表。第一张表idusername1admin2test第二张表idusername1user2guest如果分别查询 SELECT username FROM table_a;得到admintest再查询 SELECT username FROM table_b;得到userguest而 UNION 的作用就是SELECT username FROM table_aUNIONSELECT username FROM table_b;结果admintestuserguest看到这里的时候。我突然觉得UNION 有点像拼接数据把两次查询的结果放到一起展示。二、为什么数据库要设计 UNION我一直有个疑问既然能查一次为什么还要合并查询后来发现现实开发中非常常见。例如网站有普通用户表管理员表有时候开发需要把两个结果一起显示。这时候就会用到UNION所以它本来就是数据库提供的正常功能并不是专门为了安全研究设计的。三、UNION 最重要的规则学习 UNION 时我发现一个知识点特别重要。那就是字段数量必须一致例如正确SELECT id,username UNION SELECT id,nickname;两个查询都是两列 所以能够合并。如果这样SELECTid,usernameUNION SELECTnickname;就会出错。因为前面两列后面一列数量对不上数据库不知道怎么拼接。四、我终于明白为什么总有人研究字段数以前看 SQL 注入文章经常看到判断字段数当时特别困惑。为什么这么执着于字段数量后来学 UNION 才明白。因为UNION 合并查询 必须保证字段数量一致如果数量不一致数据库直接报错。所以很多人研究字段数本质上是在研究原来的查询到底返回几列 这样后面才能正确组合查询结果。五、UNION 和 ORDER BY 的关系我又想起上一篇学习的 ORDER BY后来发现很多 SQL 注入学习路线里。ORDER BY 经常出现在 UNION 前面。原因其实很简单。因为ORDER BY能够帮助我们了解查询结构有多少列而UNION 又要求字段数一致。这样两者就串起来了。以前觉得这些知识点毫无关联。现在慢慢开始连接起来。六、我开始发现 SQL 学习越来越有意思刚开始学数据库的时候。感觉全是命令特别枯燥。后来发现其实很多命令背后都有自己的逻辑。例如WHERE 负责筛选ORDER BY 负责排序LIMIT 负责分页UNION 负责合并结果这样理解之后SQL 好像突然变得简单了很多。七、为什么不要急着背各种注入技巧最近学习过程中我越来越有一个感受很多人一开始学 SQL 注入。最想看的往往是报错注入联合查询盲注各种技巧但如果不知道UNION 为什么存在那么后面的内容基本都会变成死记硬背而真正理解 UNION 后你会发现很多知识其实是在利用数据库本身的特性。八、我现在对 SQL 注入的理解以前我觉得SQL注入各种神秘技巧现在越来越觉得SQL注入理解数据库理解SQL理解用户输入数据库本身没有问题SQL 语句本身也没有问题。真正的问题在于用户输入影响了数据库原本想执行的逻辑而 UNION。正是理解这个过程的重要一环。九、最后以前我看到 UNION只觉得它是一个陌生的 SQL 命令。真正学习之后才发现它其实只是数据库用来合并查询结果的一种正常功能。而对于学习 SQL 注入的人来说理解 UNION 的意义。并不是为了记住一个命令。而是为了开始真正理解数据库是如何处理查询的