sqli-labs(一)
第一关:第一关会讲的比较详细,后面的关卡中只有特殊的地方我会单独拿出来说。
第一关是一个很简单的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(一)的更多相关文章
- SQLI LABS Basic Part(1-22) WriteUp
好久没有专门练SQL注入了,正好刷一遍SQLI LABS,复习巩固一波~ 环境: phpStudy(之前一直用自己搭的AMP,下了这个之后才发现这个更方便,可以切换不同版本的PHP,没装的小伙伴赶紧试 ...
- Sqli labs系列-less-3 。。。
原本想着找个搜索型的注入玩玩,毕竟昨天被实力嘲讽了 = = . 找了好长时间,我才发现,我没有 = = ,网上搜了一个存在搜索型注入的源码,我看了好长时间,楞没看出来从哪里搜索注入了....估计是我太 ...
- Sqli labs系列-less-2 详细篇
就今天晚上一个小插曲,瞬间感觉我被嘲讽了. SQL手工注入这个东西,杂说了吧,如果你好久不玩的话,一时说开了,你也只能讲个大概,有时候,长期不写写,你的构造语句还非常容易忘,要不我杂会被瞬间嘲讽了啊. ...
- Sqli labs系列-less-1 详细篇
要说 SQL 注入学习,网上众多的靶场,就属 Sqli labs 这个系列挺不错的,关卡达到60多关了,我自己也就打了不几关,一个挺不错的练习SQL注入的源码. 我一开始就准备等我一些原理篇总结完了, ...
- SQL注入系列:SQLi Labs
前言 关于注释 说明:在SQL中--[空格]表示注释,但是在URL中--空格在发送请求的时候会把最后的空格去掉,所以用--+代替,因为+在被URL编码后会变成空格 MYSQL有三种常用注释: --[空 ...
- Sqli - Labs 靶场笔记(一)
Less - 1: 页面: URL: http://127.0.0.1/sqli-labs-master/Less-1/ 测试: 1.回显正常,说明不是数字型注入, http://127.0.0.1/ ...
- SQLI LABS Challenges Part(54-65) WriteUp
终于到了最后一部分,这些关跟之前不同的是这里是限制次数的. less-54: 这题比较好玩,10次之内爆出数据.先试试是什么类型: ?id=1' and '1 ==>>正常 ?id=1' ...
- SQLI LABS Stacked Part(38-53) WriteUp
这里是堆叠注入部分 less-38: 这题啥过滤都没有,直接上: ?id=100' union select 1,2,'3 less-39: 同less-38: ?id=100 union selec ...
- SQLI LABS Advanced Part(23-37) WriteUp
继续继续!这里是高级部分! less-23: 提示输入id参数,尝试: ?id=1' and '1 返回的结果与?id=1相同,所以可以直接利用了. ?id=1' order by 5# 可是页面返回 ...
- Sqli labs系列-less-5&6 报错注入法(下)
我先输入 ' 让其出错. 然后知道语句是单引号闭合. 然后直接 and 1=1 测试. 返回正常,再 and 1=2 . 返回错误,开始猜表段数. 恩,3位.让其报错,然后注入... 擦,不错出,再加 ...
随机推荐
- [daily][qemu][libvirt] 使用libvirt管理qemu
别人创建的虚拟机.用libvirt做的配置. 我一直是手写qemu脚本的,不会用virtsh,所以,学一下. ------------------ 先来个arch的文档: https://wiki.a ...
- zookeeper 杂记
Zookeeper为了保证高吞吐和低延迟,在内存中维护了这个树状的目录结构,这种特性使得Zookeeper不能用于存放大量的数据,每个节点的存放数据上限为1M.
- iOS-Core-Animation-Advanced-Techniques/13-高效绘图 【没理解】
#import "DrawingView.h" #import <QuartzCore/QuartzCore.h> @interface DrawingView () ...
- redis哨兵模式,数据尽量少的丢失
min-slave-to-write 1 ->至少要有1个从节点 min-slaves-max-lag 10 ->超过10秒如果数据不能同步则拒绝新的写请求
- Java+selenium 如何下拉移动滚动条【实战】
一.场景:在编写脚本过程中需要定位的元素,在界面的底部,需要拖拽下拉滚动条,再进行定位元素. 实现思路:用Selenium 里面的 scrollTo 方法实现 二.脚本示例: 1. 用例设计 @The ...
- 第 6 章 es5 对象创建和继承
目录 第 6 章 Object 一.创建对象 1. 字面量 2. 工厂模式 3. 构造函数 4. 原型 5. 构造+原型 6. 其他 二.Object静态属性 Object.definePropert ...
- php 的Boolean类型
1. bool值不用区分大小写 $flag = Ture; $flag = TRUE $flag = true; 2. 其他类型在运算中转换为bool值 var_dump((bool) '0'); / ...
- es中的停用词
停用词主要是为了提升性能与精度.从早期的信息检索到如今,我们已习惯于磁盘空间和内存被限制为很小一部分,所以 必须使你的索引尽可能小. 每个字节都意味着巨大的性能提升. 词干提取的重要性不仅是因为它让搜 ...
- Python3学习之路~4.3 装饰器
定义:本质是函数,装饰其他函数就是为其他函数添加附加功能. 原则: 不能修改被装饰函数的源代码 不能修改被装饰函数的调用方式 实现装饰器知识储备: 函数即“变量” 高阶函数 把一个函数名当做实参传递给 ...
- Python3学习之路~6.1 编程范式:面向过程 VS 面向对象
编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程,一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有很多种 ...