博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sqli-lab 闯关教程 Less-1
阅读量:3951 次
发布时间:2019-05-24

本文共 1872 字,大约阅读时间需要 6 分钟。

目录

开始界面

在这里插入图片描述

注入操作与分析

1、本题题目告诉我们这是一个单引号注入的关卡。先输入一个正常的值和一个包含单引号的值看有什么区别。

这里是利用了题目之便,正常来说在不知道注入类型的情况下要将所有可能的注入类型都试一遍,如单引号、双引号、斜杠等等。)

在这里插入图片描述

在这里插入图片描述在这里插入图片描述
2、可以看到出现了报错语句,根据语句分析得知是 1 后面的单引号引起的报错(分析方法:将报错的查询部分最外层的单引号去掉,如本关卡可还原为 ‘1’’ LIMIT 0,1,很明显多了一个单引号),我们分析得出原语句类型为(只是类型):

select * from table_name where id = '$id' limit 0,1

3、既然分析出语句类型,我们就可以看到,当我们在 id’ 后输入任意语句都将被插入到查询语句中进行执行。那么我们进行一个小小的验证试验。

在这里插入图片描述在这里插入图片描述

4、这里利用了mysql中的order by语句。Order by 语句后面跟一个数的时候表示对该列数据进行排序,也就是说现在查询语句变成了:

select * from table_name where id = '$id' order by 3 --+ ' limit 0,1

我们利用 --+ (其中 – 为注释符,+ 表示空格)将后面的语句进行了注释,使其无法发挥作用,这样我们就可以得到不止一个返回结果了。与此同时我们还发现我们的自定义语句起到了作用,当 order by 4 时界面返回了错误,说明表中不存在第四列数据,即该表只有三列数据。

5、在得知该表只有三列数据后我们就要思考一个问题,显示界面只有两个数据,而表中共有三列数据,那么究竟是哪两列数据被显示了出来?为此我们要进行探测。我们首先找到一个没有数据回显的id,这说明id=0时,表中不存在数据,接着我们利用 union 语句将1,2,3拼接在该表末尾。(UNION 操作符用于合并两个或多个 SELECT 语句的结果集。请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。

在这里插入图片描述

在这里插入图片描述
6、由上述探测我们可以得出表中第2、3列数据被回显的结论。接下来就是获取我们想要的信息时间了。
(1)先利用group_concat()函数将当前数据库中表信息回显出来(Group_concat 主要将属于同一类的元素归类,通常以group by为分类依据,若group by不存在,则所有数据归为一行

?id=0' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+

在这里插入图片描述

(2)查看上图中users表中列信息。

?id=0' union select 1,group_concat(column_name),3 from information_schema.columns where table_name="users" --+

在这里插入图片描述

(3)将username列和password列中信息回显。(0x3a 表示冒号)

?id=0' union select 1,group_concat(username,0x3a,password),3 from users  --+

在这里插入图片描述

附:Information_schema

(1)Schemata 表:提供当前mysql实例中所有数据库信息,show databases结果来源

(2)Tables 表:提供了关于数据库中表的信息,详细说明某个表属于哪个schema,表类型,表引擎,创建时间等信息。 是show tables from schemaname结果来源。

(3)Columns 表:提供了表中列的信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果来源。

(4)Statistics表:提供关于表索引的信息。Show index from schemaname.tablename 结果来源。

(5)user_privileges表:给出了关于全程权限的信息。

总结

SQL注入漏洞大致原理为,后台查询语句未对传入数据进行检验过滤,造成传入数据对原查询语句进行修改,从而导致数据库信息通过各种可返回信息(如回显)被攻击者获取。因此,后台查询语句对传入数据的过滤至关重要。

转载地址:http://gcuzi.baihongyu.com/

你可能感兴趣的文章
iOS-截取字符串中两个指定字符串中间的字符串
查看>>
数据库-数据库操作(使用FMDB)
查看>>
FMDB介绍以及在 swift 中的数据库操作
查看>>
iOS运行时机制(附Demo演练)
查看>>
宽字符串输出问题
查看>>
将整数转换为宽字符串
查看>>
在类中定义enum实现整数常量功能
查看>>
suse11通过安装最新内核可以上网的经验
查看>>
SUSE静态配置IP成功上网
查看>>
通过sleep让程序等待外部条件改变
查看>>
通过等待键盘输入让程序等待外部条件改变
查看>>
通过限制循环次数来避免死循环
查看>>
ADO连接字符串
查看>>
字符数组的位置决定程序能否成功执行--不明白
查看>>
拷贝代码时没有仔细检查,导致误修改了函数参数
查看>>
MySQL批量导入数据SQL语句(CSV数据文件格式)
查看>>
ADO连接Oracle
查看>>
遍历Windows系统中所有进程的名字(*.exe)
查看>>
进程看门狗
查看>>
线程看门狗
查看>>