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

第一关是一个很简单的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. python-----多线程、线程池、进程池

    import threadingimport time ###############################多线程################################------ ...

  2. vsftpd上传文件出现553 Could not create file错误解决方法

    1.确定目录权限 2.关闭selinux

  3. Xcode 编辑器之Workspace,Project,Scheme,Target

    一,前言 最近老是突然对Workspace,Project,Scheme,Target四者的关系有些疑惑,所以查阅资料总结一下. 二,Workspace,Project,Scheme,Target四者 ...

  4. 20165317JAVA实验二-面向对象程序设计

    JAVA实验二-面向对象程序设计 提交点一 参考Intellj IDEA 简易教程-单元测试完成单元测试的学习 在IDEA中建立名为MyUtil5317的project,并在其src文件夹中创建名为M ...

  5. LeetCode 804 Unique Morse Code Words 解题报告

    题目要求 International Morse Code defines a standard encoding where each letter is mapped to a series of ...

  6. 20165336 2017-2018-2 《Java程序设计》第2周学习总结

    学号 2017-2018-2 20165336 <Java程序设计>第2周学习总结 教材学习内容总结 第二章 标识符第一个字符不能是数字 标识符不能是关键字 byte型变量的取值范围是-2 ...

  7. 如何监控 Java 垃圾回收机制: jps、jstack、jmap、jhat、jstat

    一.MinorGC 一个新对象会被放到eden空间,当eden空间满了的时候,MinorGC就会执行,任何存活的对象,都从eden空间复制到to survivor空间,任何在from survivor ...

  8. ios禁止页面下拉

    document.querySelector('body').addEventListener('touchmove', function(e) {     e.preventDefault(); } ...

  9. Vue通过build打包后 打开index.html页面是空白的

    最近在build打包vue项目遇到了几个问题,如下: 1.npm run build打包项目之后,我们通常是把dist文件里面被压缩后的static文件跟index.html提交到服务器,但最近发现直 ...

  10. 宝塔Linux面板安装Redis

    宝塔Linux面板安装Redis不会特别麻烦,只要几步就可以实现:1.安装redis服务2.配置redis设置3.安装PHP扩展,下面就随ytkah一起来看看吧 1.首先,我们来安装redis服务,进 ...