第一关:第一关会讲的比较详细,后面的关卡中只有特殊的地方我会单独拿出来说。

第一关是一个很简单的string类型的sql注入,并且会报错,输入参数id=',页面会报错

值得注意的是:

1.报错信息中 near "1" limit 0,1' at line 1,但是我们输入的是1',所以说这半句中的单双引号和后台sql语句中的单双引号不是对应的关系,我们做测试的时候不能根据报错信息来判断后台sql语句是用的单引号还是双引号进行的拼接。(这里说错了,补充一下啊:实际上这里页面的报错信息不是双引符号,是两个单引符号最前面和最后面的代表这是一句话,也就是说sql中的字符串片段实际上是'1'' limit 0,1这里的''是两个单引符号,这样就解释得清楚了我们输入1’和sql中的'组成了1''所以报错了,写这段话得原因是我们可以根据这段报错信息推出后台是'还是")

2.如果输入的是中文的单引符号、中文的双引符号以及英文的双引符号都不会报错,只是查询不出数据来,因为后台将这些符号作为变量进行查询,比如输入id=1",那么后台会在数据库中寻找id为1"的用户信息,显然不存在嘛。

3.使用order by时一般需要在sql语句的后面,如下图中sql语句进行拼凑的后面还有 limit 0,1,需要进行注释掉,一般使用#或--

4.在get请求中的特殊字符如空格、#以及单双引号都需要用url编码,否则sql语句的执行可能报错、甚至时http请求出错(空格没编码时)。空格(%20)、单引号(%27)、双引号(%22)、#(%23).....

ok,现在正式开始sql注入。(post中最好也使用url编码)

一般单引符号报错后可以初步判断存在sql注入,接下来的

第一步:判断当前表有多少列,使用order by 来判断,一般使用夹逼法,先使用一个较大的列号,输入id=1'%20order%20by%209%23

可以看到当order by 后面的列号大于数据表的列数就会报错,如order by后面的列号时小于数据表的列数,页面则能正常显示。

这关中order by 4会报错,order by 3正常显示,可以看出该表中是三个字段。

第二步:判断该表中的三个字段分别是什么数据类型,且哪些字段会在页面中显示

注意:1.很多时候执行玩查询操作后,后台程序只取第一行显示出来,所以id后面的参数应该是-1或者为空,只有前面查询出的数据为空,这样才会将后面的联合查询的数据显示出来

2.实际场景中还需要判断哪显示在页面中的字段哪些是字符型,比如说我们用user()查询当前用户名,却放在一个int类似的字段上会报错。但第一关中users表中的字段都是string类型,所以不存在此类问题。实际场景中最好是先使用union select  null,null,null# 然后再一个个试出数据类型。

3.但后面我们却是直接使用的union select  1,2,3# 然后查看页面中哪个数字在显示页面上,来判断是哪个字段被显示在页面。这是因为sqli-labs使用得是php搭建得,而php是弱语言类型,int类型传入后台拼凑在sql中时,如果表中该字段是string类型会自动转换数据类型。

这里需要使用union 联合查询,输入id=-1'%20union%20select%201,2,3%23

可以看到,是第二个和第三个字段被显示在页面上

第三步:

所以后面我们只需将第二三这两个字段中换成我们想要进行得查询操作即可,mysql中自带一些函数可以供我们使用

user() 当前用户名

database() 当前数据库名

version() 当前数据库名

这里有一处小技巧:比如说我们想一处查询出上面三个信息,当表单只显示两个字段中的数据,怎么办?

可以使用使用mysql中的连接函数concat_ws,concat_ws的第一个参数是分割符,后面的是需要拼接的字符串

例如输入id='%20union%20select%201,concat_ws(':',user(),database(),version()),3%23

不过,为了保险起见还是不要直接使用特殊字符,concat_ws(char(32,58,32),user(),database(),version())。空格的十进制ASCII是32,:的十进制ASCII是58

也可以使用group_concat将查询出来的多行连接起来

第四步:查询知道当前数据库名是security后,如何才能知道该数据库中有哪些表,表中又有哪些字段呢?

这里需要利用到mysql的系统数据库information_schema,需要利用到一下三个表

SCHEMATA表:储存mysql所有数据库的基本信息,包括数据库名,编码类型路径等,show databases的结果取之此表。

TABLES表:储存mysql中的表信息,(当然也有数据库名这一列,这样才能找到哪个数据库有哪些表嘛)包括这个表是基本表还是系统表,数据库的引擎是什么,表有多少行,创建时间,最后更新时间等。show tables from schemaname的结果取之此表

COLUMNS表:提供了表中的列信息,(当然也有数据库名和表名称这两列)详细表述了某张表的所有列以及每个列的信息,包括该列是那个表中的第几列,列的数据类型,列的编码类型,列的权限,猎德注释等。是show columns from schemaname.tablename的结果取之此表。

1.shemata表中有一个字段是需要记住的:schema_name,里面是所有的数据库名

输入id='%20union%20select%201,group_concat(schema_name),3%20from%20information_schema.schemata%23

这里使用的group_concat将多行连接起来,如下图

2.tables表中有两个字段需要记住:table_schema,table_name分别代表,数据库名和表面

现在已经知道所有数据库名后,这里查询security数据库中有哪些表

id='%20union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schema='security'%23

3.columns表中有两个字段是需要记住的:table_name和column_name分别代表表名和字段名

现在想查询出users这个表有哪些字段

id='%20union%20select%201,group_concat(column_name),3%20from%20information_schema.columns%20where%20table_name='users'%23

第五步:查询users表中用户的账号密码

sqli-labs(一)的更多相关文章

  1. SQLI LABS Basic Part(1-22) WriteUp

    好久没有专门练SQL注入了,正好刷一遍SQLI LABS,复习巩固一波~ 环境: phpStudy(之前一直用自己搭的AMP,下了这个之后才发现这个更方便,可以切换不同版本的PHP,没装的小伙伴赶紧试 ...

  2. Sqli labs系列-less-3 。。。

    原本想着找个搜索型的注入玩玩,毕竟昨天被实力嘲讽了 = = . 找了好长时间,我才发现,我没有 = = ,网上搜了一个存在搜索型注入的源码,我看了好长时间,楞没看出来从哪里搜索注入了....估计是我太 ...

  3. Sqli labs系列-less-2 详细篇

    就今天晚上一个小插曲,瞬间感觉我被嘲讽了. SQL手工注入这个东西,杂说了吧,如果你好久不玩的话,一时说开了,你也只能讲个大概,有时候,长期不写写,你的构造语句还非常容易忘,要不我杂会被瞬间嘲讽了啊. ...

  4. Sqli labs系列-less-1 详细篇

    要说 SQL 注入学习,网上众多的靶场,就属 Sqli labs 这个系列挺不错的,关卡达到60多关了,我自己也就打了不几关,一个挺不错的练习SQL注入的源码. 我一开始就准备等我一些原理篇总结完了, ...

  5. SQL注入系列:SQLi Labs

    前言 关于注释 说明:在SQL中--[空格]表示注释,但是在URL中--空格在发送请求的时候会把最后的空格去掉,所以用--+代替,因为+在被URL编码后会变成空格 MYSQL有三种常用注释: --[空 ...

  6. Sqli - Labs 靶场笔记(一)

    Less - 1: 页面: URL: http://127.0.0.1/sqli-labs-master/Less-1/ 测试: 1.回显正常,说明不是数字型注入, http://127.0.0.1/ ...

  7. SQLI LABS Challenges Part(54-65) WriteUp

    终于到了最后一部分,这些关跟之前不同的是这里是限制次数的. less-54: 这题比较好玩,10次之内爆出数据.先试试是什么类型: ?id=1' and '1 ==>>正常 ?id=1' ...

  8. SQLI LABS Stacked Part(38-53) WriteUp

    这里是堆叠注入部分 less-38: 这题啥过滤都没有,直接上: ?id=100' union select 1,2,'3 less-39: 同less-38: ?id=100 union selec ...

  9. SQLI LABS Advanced Part(23-37) WriteUp

    继续继续!这里是高级部分! less-23: 提示输入id参数,尝试: ?id=1' and '1 返回的结果与?id=1相同,所以可以直接利用了. ?id=1' order by 5# 可是页面返回 ...

  10. Sqli labs系列-less-5&6 报错注入法(下)

    我先输入 ' 让其出错. 然后知道语句是单引号闭合. 然后直接 and 1=1 测试. 返回正常,再 and 1=2 . 返回错误,开始猜表段数. 恩,3位.让其报错,然后注入... 擦,不错出,再加 ...

随机推荐

  1. c#如何调用另外一个项目的类

    添加引用即可. 参考资料: https://zhidao.baidu.com/question/241402877.html http://blog.csdn.net/a1027/article/de ...

  2. 内联扩展 inline expansion

    让编译器直接将完整的函数体插入到每一个调用该函数的地方,从而提高函数调用的运行速度. 优秀的JIT编译器会通过侦测运行信息,仅将需要频繁运行的瓶颈部分进行编译,从而大大削减编译所需的时间. 而且,利用 ...

  3. linux系统操作笔记

    tar  cvf  test.tar  /etc gzip  test.tar bzep2 test.tar 归档压缩 tar czf  test.tar.gz  /etc vi  /etc/test ...

  4. Page3:组合系统状态空间输入输出描述、矩阵指数函数性质[Linear System Theory]

    内容包含组合系统的状态空间描述以及输入输出描述,零输入响应的概念以及矩阵指数函数的性质

  5. io.UnsupportedOperation: not readable

    两处错误一.你是用open打开一个文件,此时调用的是w写入模式,下面使用read是没有权限的,你得使用w+读写模式二.使用write写入一个字符s,但是此时并没有真正的写入,而是还存在与内存中.此时执 ...

  6. 内部排序->交换排序->快速排序

    文字描述  快速排序是对起泡排序的一种改进.它的基本思想是,通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个 ...

  7. ORACLE DIRECTORY目录管理步骤

    ORACLE DIRECTORY目录管理步骤 ORACLE的 DIRECTORY在数据库中是个目录的路径,需要在操作系统中有相应的目录与之对应:ORACLE目录的作用就是让ORACLE数据库和操作系统 ...

  8. Glide加载图片报错You must not call setTag() on a view Glide is targeting

    报错信息为:You must not call setTag() on a view Glide is targeting 原因就是View使用setTag后导致Glide之前请求的标记被清除,强制转 ...

  9. linux 循环读取文件的每一行

    在Linux中有很多方法逐行读取一个文件的方法,其中最常用的就是下面的脚本里的方法,而且是效率最高,使用最多的方法.为了给大家一个直观的感受,我们将通过生成一个大的文件的方式来检验各种方法的执行效率. ...

  10. dedecms批量修改文章为待审核稿件怎么操作

    dedecms批量修改文章为待审核稿件要怎么操作呢?因为我们有时会出于某些原因要把文章暂时先隐藏掉,dedecms有一个比较好的功能是将文件状态设为未审核前台就可以看不到了,那要怎么批量设置呢?到后台 ...