sql-lib闯关1-10关

闯关之前我们需要搭建所需环境SQL-Libs

SQL-Libs是一个专业的SQL注入练习平台,该平台包含了以下在测试场景中常见的注入类型:

1.报错注入(联合查询)

​     1)字符型

​     2)数字型

2.报错注入(基于二次注入)

3.盲注

​     1)基于布尔值

​     2)基于时间

4.UPDATE型注入练习

5.INSERT型注入练习

6.HTTP头部注入

​     1)基于Referer

​     2)基于UserAgent

​     3)基于Cookie

7.二次排序注入练习

对于学习SQL注入来说是一个优秀的平台。

环境搭建

1.准备工作:我们在虚拟机中安装phpstudy集成环境即可

2. 安装过程

 

2.1 下载并解压

 

从网上下载sqli-libs,解压到phpstudy的www文件夹目录下

 

2.2 修改配置文件

 

进入网站目录,在sql-connections文件夹下找到db-creds.inc文件,修改文件内容,将用户名和密码改成本地MySQL数据库的用户名和密码

(初始用户名和密码都为root)

 

 

2.3 安装

打开浏览器,输入http://192.168.31.246/Sqli_Edited_Version-master进入SQL-Libs测试平台

(我的ip为192.168.31.246,www文件夹下文件名为Sqli_Edited_Version-master

 

 

 

点击Setup/reset Database for labs进行安装,出现以下界面则表示安装成功

 

闯关之前,请把这两行代码添加到每一关php文件中,

第一行是对sql语句进行输出,第二行是换行(这两行代码只是让我们更好的理解每关)

 

 

 

 闯关之前写几句mysql基本用法,我们闯关常用的,尽量自己打直到熟悉

查库: select schema_name from information_schema.schemata
查表:select table_name from information_schema.tables where table_schema='security'
查列:select column_name from information_schema.columns where table_name='users'
查字段:select username,password from security.users

 

注入的分类
     注入的分类:数字型和字符型。攻击者目的只有一点,那就是绕过程序的限制,使用户输入的数据带入数据库执行,利用数据库的特殊性获取更多的信息或者更大的权限。
1、数字型注入
当输入的参数为整形时,如果存在注入漏洞,可以认为是数字型注入。
测试步骤:
(1) 加单引号,URL:www.text.com/text.php?id=3’
对应的sql:select * from table where id=3’ 这时sql语句出错,程序无法正常从数据库中查询出数据,就会抛出异常;
(2) 加and 1=1 ,URL:www.text.com/text.php?id=3 and 1=1
对应的sql:select * from table where id=3’ and 1=1 语句执行正常,与原始页面如任何差异;
(3) 加and 1=2,URL:www.text.com/text.php?id=3 and 1=2
对应的sql:select * from table where id=3 and 1=2 语句可以正常执行,但是无法查询出结果,所以返回数据与原始网页存在差异
如果满足以上三点,则可以判断该URL存在数字型注入。
 
2、字符型注入
当输入的参数为字符串时,称为字符型。字符型和数字型最大的一个区别在于,数字型不需要单引号来闭合,而字符串一般需要通过单引号来闭合的。
例如数字型语句:select * from table where id =3
则字符型如下:select * from table where name=’admin’
因此,在构造payload时通过闭合单引号可以成功执行语句:
测试步骤:
(1) 加单引号:select * from table where name=’admin’’
由于加单引号后变成三个单引号,则无法执行,程序会报错;
(2) 加 ’and 1=1 此时sql 语句为:select * from table where name=’admin’ and 1=1’ ,也无法进行注入,还需要通过注释符号将其绕过;
Mysql 有三种常用注释符:
-- 注意,这种注释符后边有一个空格
# 通过#进行注释
/* */ 注释掉符号内的内容
因此,构造语句为:select * from table where name =’admin’ and 1=1—’ 可成功执行返回结果正确;
(3) 加and 1=2— 此时sql语句为:select * from table where name=’admin’ and 1=2 –’则会报错
如果满足以上三点,可以判断该url为字符型注入。
 
Sql注入分类可以按照参数类型分为数字型和字符型。还有一些常见的注入分类,例如:
(1)POST:注入字段位于POST数据中;
(2)Cookie:注入字段位于Cookie数据中;
(3)延时注入:根据数据库延时特性的注入
(4)搜索注入:注入字段在搜索的位置;
(5)base64注入:注入字符经过base64编码后注入;
(7)错误注入:基于数据库错误信息的响应注入;
等等…

那么开始闯关吧。

 

第一关

首先我们输入?id=1

 

 如图,根据sql语句我们知道users表中id=1的一组用户名密码,(LIMIT 0,1表示从第0行开始提取一个数据) 我们也可以将1变成其他数字,会提取出其他id用户名密码

 

接下来我们输入的1‘,出现问题,说明存在的注入(从sql语句可以看出‘1’后多了一个单引号)

 

 

 我们在后面加上--+进行一下闭合,(--+就是注释符号,注释了后面的语句),回显正常,输入语句"?id=1 and 1=2"也回显正常,说明是单引号字符型注入

 

 

 

 接下来我们用order by 语句来判断表有几列数据,发现他有3列数据(为4时出错,为3时正常)

 

 

 知道是单引号字符型注入,有3个列数据后我们将id改成一个不存在的数字,如“666”。(如果数字存在会爆出相应id内容,所以我们让它报错,注释掉它)判断页面有几个显示位,使用联合查询语句union select 发现只有两个显示位

 

  

 接下来我们爆破数据库的数据库名,表名,列名,字段信息

首先我们获得有多少个数据库(我直接用的group_concat全部爆出,也可以用limit一个一个爆)

 

 

 

 查询我们的数据库的版本和名字,看来是security

 

 

 我们接下来查询security数据库的表名,发现有四个表 分别是emails,referers,uagents,users   很明显我们最后的目标是users表

 

 

 接下来我们看看user表中都有哪些列,发现有user和password列(因为版本不一样,可能列名不一样,但是一定会有用户名和密码两列)

 

 

 

 接下来我们要获得用户名和密码的字段

 

 

我们发现一次只能取用户名密码中的一个不方便查看,所以我再告诉大家一个函数concat_ws('~',A,B) 

 

 

 

 如图,相应用户名和密码都用~清晰列出

当然~转换成十六进制是0x7e,推荐大家使用,不包含单引号

 

 

 

 

闯关结束

第二关

发现第二关和第一关的区别在于他不是字符型注入了,是数字型注入了(1=1正确,1=2错误  )

 

 

 

 接下来就是获取表有多少列,发现是3列,之后就是获取数据库名,表名,列名,字段名,和第一关一模一样

 

  

 

  

 

 

 

 

第三关

首先继续?id=1

 

 

 我们通过sql语句发现1被(’‘)包裹,和第一关差不多,第一关1被’‘包裹,注释掉单引号,所以这关注释掉’)即可

我们也可以给他加一个单引号试试,

 

 通过报错语句发现除了)外1后还多一个单引号,所以添加‘)注释即可

 

 测一下多少列,3列

 

 

那么我们开始爆库,爆表,爆列,爆字段

 

 

 

 

 

 

 

第四关

老规矩,先输入?id=1看看情况

 

 根据sql语句我们发现只是把第三关单引号变成了双引号,(如果你没有添加我开头那两行代码,不显示sql语句,那就先加单引号不报错,再加双引号报错,根据报错类型进行分析)

 3列

 

 爆库爆表爆列爆字段,

 

 

 

 

 

 

 

 

 

 

 

第五关

 

首先,输入?id=1尝试

 

 我们发现没有任何数据爆出,显示you are in, 那么我们再把id换成一个不存在的数据试试

 

 我们发现you are in 消失了,这就是典型的布尔盲注,正确显示you are in 正在进入,错误不显示任何信息

我们再输入1‘试试

 

 报错显示一后面多了一个单引号,所以它存在注入漏洞,可以进行sql注入(只有加单引号报错)

我们测试一下它有几列,发现是3列

 

 

  

 那我们现在开始爆东西吧,这关跟前几关不一样,你输入查询语句返回的都是you are in,

 再给大家推荐一个函数left,我测试数据库名第一个字母是否为s,通过返回“you are in"我们知道是正确的

 

 

当然, 不要直接一个字母一个字母试,可以先用二分法

数据库第一个字符小于t有回显

 

 

 数据库第一个字符大于t无回显, 一点一点尝试,最终确定的库名为security

 

 接下来确定表名,第一个字母得出是r,其他的步骤还是一样,修改limit x,1和left中的位数限定数字,第一张表是emails,爆破到第二张表为referer,终于在第四张表爆破到user表,名为users。

 

 

  

 

 

 

 接下来爆列,得出第二列是用户名,第三列是密码

 

 

 

 最后一步爆用户名和密码(只截图了第一个用户名和密码,并且大小写不知道)

 

 

 

 当然还可以concat聚合函数

参考资料:http://www.2cto.com/article/201303/192718.html

简单的说,使用聚合函数进行双注入查询时,会在错误信息中显示一部分错误信息。

比如count函数后面如果使用分组语句就会把查询的一部分以错误的形式显示出来。

payload即我们要输入的sql查询语句,下面展示payload在concat()中构造

 

爆库payload

 

 

 

 爆用户

 

 

 爆表名

 

 

 爆列名

 

 

爆用户名密码 

 

 这关还可以用burpsuite进行暴力破解,可以直接破译出相关字母数据

 

 第六关

和第五关一样差不多,只是报错由单引号变成了双引号

 

 按照第五关思路来就行,我直接给用户名密码了

  

第七关

首先判断是字符型还是数字型,发现是字符型,并且出现了一个我们从来没见过的东西use outfile

可能会有很多小白和我一样,对数据库file权限和 into outfile这个命令比较陌生,所以在这里科普一下file权限和into outfile这个函数。
数据库的file权限规定了数据库用户是否有权限向操作系统内写入和读取已存在的权限
into outfile命令是filefile系列函数来进行读取敏感文件或者写入webshell

 

 

 字符型的话就要在1后面加‘或“号,所以我们来试试

 

 

 

 需要多次尝试1‘  1“   1’) 1”)  1‘)) 最后我们发现是1‘))

 

这关我们主要就是往服务器上写入文件,比如一句话木马啥的,我们首先要有一个存储文件的路径,也可以手动去查看

 

 

找到路径之后,我们往这个路径下写入一个文件名为escwq的php文件,主要这里的路径要用双反斜杠\\,否则建立出来的文件名会加前缀

 

 

 

 

图中标记1是双反斜杠,,标记2是单反斜杠,,路径名加到了文件名前

虽然他回显告诉我们错误,但是确实建成功了,并且在这里有一个安全措施,就是不允许覆盖,你建立了longshisan的php文件,就不能重复建立了

下图是建立的escwq.php中的内容

 

 

 如果写到WWW文件下就可以直接用localhost前缀啦

 

 

我们这次在WWW文件夹下

新建一个yahu.php并一句话木马(  [" "]中的字符,是自己设置的密码,,等用中国菜刀连接的时候会用到   ),到时候我们就可以通过这个文件进入数据库

 

 

 

这时就可以用中国菜刀获得这个文件夹的结构啦,

图中标记部分,,地址是当时.php文件的位置,,

小方块中是在加入一句话木马时设置的密码,,划横线部分,菜刀会帮你自动选择的不用管

 

 之后右击,选择文件管理

 找到index.php文件,寻找其中sql连接语句,顺藤摸瓜,找到数据库管理员信息

 

 

 

 找到了管理员信息(其中,,用户、密码和主机之后,填写数据库管理的配置时 ,要用,)

再次右击刚才的地址,,点击数据库管理,点击配置,根据上图输入以下信息:

提交,就可以管理数据库啦,单击和双击只能选择那一项,需要点击执行,才能显示

 

 

 

 

 

 第八关

发现是字符型注入,并且通过回显的信息可以看出是布尔盲注

 

 

 

那就一步一步来吧,和less5一样的,根据回显判断,可以通过 > < 比较字符大小加速爆破

暴库payload

 

 

库名长度可使用?id=1' and length(database())=8--+ 判断,同理表名字,段名等。
最后得到库名?id=1' and left((select database()),8)='security'--+
爆表,爆字段,爆值,流水操作

 你也可以用向第五关的方法时间注入啊,二分法猜测啊在这都可以用

 

 第九关

上来先判断是字符型注入,并且是延迟型注入(咋判断是不是延迟型,当你用二分法时不管左边还是右边都是对的,说明二分法就做不了了)

 

 

 

 

 

 时间注入在第五关做了详细的描述,在这里不再过多的赘述

数据库名长度为8

 

 

 

 

 获得数据库名,剩下的按照第五关的操作走就行

 

 

 

 

 获得密码

 

 

 

 

 

 

 

 

 

第十关

第十关就是把第九关的单引号‘换成双引号“就可以啦

 

 

 

 

 获得用户名密码

 

 

 

 

 

 

 1--10关就闯关完成了。

 

posted @ 2020-02-17 09:00  一个aaa  阅读(5673)  评论(0编辑  收藏  举报