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

CTF Writeup: [强网杯 2019]随便注挑战解析

环境初探

打开题目链接,映入眼帘的是一个简单的输入框。根据经验,这很可能是一个 SQL 注入点。尝试输入一些简单的测试语句,如1',页面随即报错:error 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''' at line 1 。这一报错信息透露了两个关键线索:其一,逻辑层对输入的过滤存在不足,为我们后续的注入操作提供了可能;其二,明确了目标数据库为 MariaDB,这是一种常见的开源数据库,不同数据库在语法和特性上存在差异,知晓数据库类型有助于我们针对性地展开攻击。

继续测试,输入1' or 1=1 #,发现页面成功回显,且显示出了过滤的关键字符串,这表明该题目并非盲注类型,我们可通过页面回显获取关键信息,大大降低了题目的难度。

遭遇过滤

接下来,我们尝试常规的 SQL 注入思路,即通过order by语句判断字段数量。输入1' order by 3# ,页面回显报错,尝试union时候,出现提示如下图,这意味着常规的注入关键词被严格过滤了。查看题目给出的过滤规则:preg_match("/select|update|delete|drop|insert|where|\./i",$inject),可以看到对常见的 SQL 语句关键词进行了不区分大小写的正则匹配,这使得传统的联合注入方式难以奏效,我们必须另辟蹊径。

堆叠注入登场

发现堆叠注入漏洞

考虑到分号(;)在 SQL 语句中用于分隔不同的语句,且当前题目可能存在对多语句执行的支持,我们尝试使用堆叠注入。输入1'; show databases;#,页面成功返回了数据库列表,这一结果证实了我们的猜测,目标系统存在堆叠注入漏洞,为我们后续的攻击打开了突破口。

利用堆叠注入探索数据库结构

通过堆叠注入,我们可以逐步探索数据库的结构。执行1'; show tables from supersqli;# (这里假设已通过其他方式得知数据库名为supersqli,例如通过报错注入等方法),获取到了当前数据库中的两张表,分别为1919810931114514和words 。接着,我们使用1'; show columns from 1919810931114514;#和1'; show columns from words;#,分别查看两张表的列结构。在1919810931114514表中,发现了一个名为flag的列,这极有可能就是我们要寻找的目标 flag 所在之处;而words表有两列,分别为id和data,这也解释了为何在初始测试时,输入简单数字会有相应的回显,因为默认查询的可能就是words表中的数据。

攻击思路与执行

思路一:修改表名和列名

由于select等关键查询语句被过滤,我们无法直接查询1919810931114514表中的flag值。于是,我们构思了一种巧妙的攻击思路:将words表重命名为其他名称(如test),再将1919810931114514表重命名为words,最后把1919810931114514表中的flag字段重命名为id字段(因为原words表有id字段,猜测查询语句可能依赖id字段进行查询)。

在 SQL 中,修改表名使用rename tables语句,语法为rename tables 旧表名 to 新表名; ;修改列名使用alter table语句结合change column子句,语法为alter table 表名 change column 旧列名 新列名 数据类型; 。按照这个思路,构造的堆叠注入语句如下:

1'; rename tables `words` to `test`; rename tables `1919810931114514` to `words`; alter table `words` change column `flag` `id` varchar(100);#

执行上述语句后,再次输入类似1' or 1=1 #的万能密码语句,页面成功返回了1919810931114514表中的数据,其中id字段的值即为我们苦苦追寻的 flag。

思路二:添加列

我们还可以采用另一种思路,在保持表名不变的情况下,直接在1919810931114514表中添加一个自增的id字段。添加列使用alter table语句结合add子句,语法为alter table 表名 add (字段的名称 字段的类型 (附加属性)); 。构造的语句如下:

 

1'; alter table `1919810931114514` add (id int(11) primary key auto_increment);#

执行该语句后,由于添加了自增的id字段,此时输入1,页面便会返回1919810931114514表中的数据,从而获取到 flag。

思路三:使用预编译语句

利用预编译语句也是一种可行的方法,前提是目标系统支持多语句查询(即堆叠查询)。预编译语句的优势在于能够将 SQL 语句模板化,提高执行效率,同时在一定程度上防止 SQL 注入。在 MySQL 中,预编译语法分为定义预编译 SQL 语句和执行预编译语句:

 

-- 预编译SQL语句

PREPARE stmt_name FROM preparable_stmt;

-- 执行预编译语句

EXECUTE stmt_name (USING @var_name (, @var_name) …);

例如,我们可以构造如下语句来绕过关键词过滤获取 flag:

 

1';use supersqli;set @sql=concat('se','lect `flag` from `1919810931114514`');PREPARE hack1 FROM @sql;EXECUTE hack1;#

在这个语句中,首先使用set语句为变量@sql赋值,通过concat函数将被过滤的关键词select进行拼接绕过过滤。然后使用PREPARE语句对拼接好的 SQL 语句进行预处理,最后通过EXECUTE语句执行预处理后的语句,成功获取到 flag。

通过对这道 “supersqli” CTF 题目的详细解析,我们全面展示了堆叠注入在突破关键词过滤限制、获取数据库敏感信息方面的强大能力。从发现注入点,到应对关键词过滤,再到利用不同的攻击思路成功获取 flag,整个过程不仅考验了我们对 SQL 注入技术的深度理解,还要求我们具备灵活应变、创新思维的能力,这正是 CTF 竞赛的魅力所在。在实际的网络安全防护中,我们也应从中吸取教训,加强对输入的严格过滤与验证,防止类似的安全漏洞被攻击者利用。

http://www.lqws.cn/news/525457.html

相关文章:

  • 分布式系统 - 分布式缓存及方案实现
  • Python 数据分析与可视化 Day 7 - 可视化整合报告实战
  • 【nRF52832】【环境搭建 1】【ubuntu下搭建nRF52832开发环境】
  • 达梦数据库安装
  • 《高等数学》(同济大学·第7版)第九章 多元函数微分法及其应用第一节多元函数的基本概念
  • Fisco Bcos学习 - 搭建并行多组组网
  • SQL关键字三分钟入门:DELETE —— 删除数据
  • 定位坐标系深度研究报告
  • C++学习笔记--Chapter Two--类的定义、对象的创建和使用、构造函数
  • 《解锁前端潜力:自动化流程搭建秘籍》
  • python学智能算法(十六)|机器学习支持向量机简单示例
  • HarmonyOS5 折叠屏适配测试:验证APP在展开/折叠状态下的界面自适应,以及会出现的问题
  • 数组题解——二分查找【LeetCode】
  • 八股文——JAVA基础:说一下C++与java的区别
  • 黑马python(十六)
  • GBDT:梯度提升决策树——集成学习中的预测利器
  • 设计模式-桥接模式、组合模式
  • Selenium 二次封装通用页面基类 BasePage —— Python 实践
  • 矩阵题解——螺旋矩阵【LeetCode】
  • 大模型推理-高通qnn基础
  • PYTHON从入门到实践5-列表操作
  • 超级好用的小软件:geek,卸载软件,2m大小
  • vue2简单的路由切换
  • OpenCV图像旋转:单点旋转与图片旋转
  • Windows10中设置多个虚拟IP方法
  • Linux size命令详解
  • Boss:攻击
  • Azure虚拟机添加磁盘
  • Docker、Docker composer与Docker desktop
  • H5录音、图文视频IndexDB储存最佳实践:用AI生成语音备忘录