在get注入中,首先在?id=n后面加一个’,进行判断是否被过滤且通过返回错误查看是何种诸如类型。字符:”n’”。数字型’’’。
如果没有被过滤就继续使用and 1=1,and 1=2 。可以看出and是否被过滤及确定是否可以注入。现在陈述的是最简单的,不要笑话。
我这里用数字型注入,字符型与数字型区别在于在哪用结束符闭合能满足mysql的语法。在这里使用的是掌控安全论坛中的靶场地址(http://hack.zkaq.org)
第一题是简单的注入题
在id=1后面加上’就行判断
可以看出’没有被过滤,页面出错了。现在分别使用and 1=1 ,and 1=2看看。
发现and 1=1 显示正常,and没有被网页识别为非法字符,看起来有戏。接下来看看and 1=2。
发现网页不正常,这证明可以注入了。
And 1=2 拼接进去后相当于 select * from xxxx where id=1 and 1=2 ,这句话要整体的看。1=2肯定等于0,1=0这句话是错的。最后id=错,所以页面什么也没有。因为这个靶场是一点防御措施也没有的,如果有的话就需要用到其他更绕的方法去测试了。
接下来让我们看一下在这靶场中将用到的语句吧。我用phpstudy的集成环境中的mysql数据库对我们将要用到的语句进行操作演示,以便加深理解。
进入mysql命令行并且使用命令show databases();查看本数据库有多少个库。
在这里需要一提的是在注入中access数据库和mysql数据库的注入方法也是有一些区别的。在上图中是有information_schema这个库的,而在access数据库中是没有这个库的。mysql结构是库-表-列-字段内容。而access是只有一个库的,所以结构是表-列-字段内容,Information_schema里面存放着mysql数据库中的所有源数据,所以对mysql数据库注入中可以通过查询这张表来得到自己所要得到的信息。但是有一个先天前提,那就是自己所注入的这个网页,我就称为跳板吧。这个跳板必须有权限访问information_schema这个库。如果没有权限访问,那注入手法就和access数据库一样的。要手动猜解出库名,等自己学习完之后会整理写入博客中。
现在让我们使用use information_schema;进入这张表。
让我们用命令show tables;看看有什么表吧。
显示有四十张表,这四十张里面的数据就是我mysql数据库的所有数据了。首先介绍一下我们会用到的表和命令吧。
SCHEMATA这张表里有所有的库名,TABLES这张表里有所有的表名,COLUMNS这张表里有所有的列字段名。在数据库中使用select * from SCHEMATA;
在这里我们看到了这张表里的所有内容,在数据中我们可以这样查询。但是我们一般在注入时只为了得到这张表里的库名罢了,在上图中我们可以看到数据库所在的列字段名是SCHEMA_NAME。所以使用命令select SCHEMA_NAME from SCHEMATA;
这样的话就筛选出表的名字了。接下来的操作也是只筛选具体所要的东西。
接下来让我们看看我这个环境中mysql库里面有什么表吧。因为TABLES这张表里有所有的表名。使用命令select TABLE_NAME from TABLES;
有这么多的表,我们如何知道哪些表是属于哪些数据库的呢?在这张表中是有TABLE_SCHEMA列字段来所属库的,所以使用命令select TABLE_NAME from TABLES where TABLE_SCHEMA=’mysql’;
这就筛选出了所有属于mysql的表了,接下来让我们看看mysql表里有哪些字段吧。
使用命令select COLUMN_NAME from COLUMNS where TABLE_NAME=’user’;
这样就把表中的所有列字段名给爆出来了,我们最好其的当然是user和password这两个字段了。现在知道了库名表名字段名,可以使用select User,Password from mysql.user limit 0,1;查看这两行的数据。
现在数据库中的最基础的操作我们已经过了一遍了,接下来让我们继续那题靶场吧。
拼接 order by n,一个个试过去看看哪一个可以成功。 order by 函数是用于排序的,在注入中使用它的意思是查看有多少个字段。学过编程的都知道,如果有四个字段,那么我们可以让1-4字段的排序,如果让五段字段进行排序的话是不可能的,因为没有第五段字段,这函数也是这个原理。最后试出来是两个字段。
接下让我们看一下有哪些字段的位置是可以在界面上显示出来的吧。如果一个字段都不能显示,那之前做的也就没什么意义的。反正不回显自己什么也看不到。用union联合查询函数,使用and 1=2 union select 1,2 。 对我来说这里and 1=2 也是一个小细节,如果不用and 1=2 让之前的页面错误不显示的话,后面的我们是看不见的。这里是这样的。
网页中显示了2,那么说明2这个位置我可以使用函数能够有回显。使用命令and 1=2 union select 1,group_concat(SCHEMA_NAME) from information_schema.SCHEMATA 。这命令现在你们应该看的明白了吧,就是从库中的某张表里提取某字段的信息。这里就看出了数据库中的库名了。
有information_schema和maoshe这两个库。现在就看看猫舍这库里有什么吧。使用命令and 1=2 UNION SELECT 1,group_concat(distinct+TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=’maoshe’ (这里的’’存在解析问题,用url转码成%27再进行操作)
接下来就看admin表里面有哪些字段了。使用and 1=2 UNION SELECT 1,group_concat(distinct+COLUMN_NAME) from information_schema.COLUMNS where TABLE_NAME=’admin’
现在什么都知道了就直接用命令爆出我们想要的一切吧。And%201=2%20union%20select%201,group_concat(username,password)%20from%20maoshe.admin%20 查字段内容,查出来如下图。
可以看出账号密码分别为admin hellohack
这就是最简单的注入过程了,其他的我会慢慢补在博客上。