当前位置: 首页 > 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 竞赛的魅力所在。在实际的网络安全防护中,我们也应从中吸取教训,加强对输入的严格过滤与验证,防止类似的安全漏洞被攻击者利用。

相关文章:

  • 武汉做网站的公司怎样搭建自己的网站
  • 郑州市做网站公司seo专业培训
  • wordpress 教师工作坊河南seo优化
  • vb语言做的网站苏州百度推广开户
  • 网站建设 自动生成天津抖音seo
  • 网站域名包括哪些品牌推广外包
  • 用 Boost 库解析 .ini 和 .json 文件时的“坑”:注释导致的解析错误与解决方案
  • Linux驱动学习day7
  • 【JAVA】idea中打成jar包后报错错误: 找不到或无法加载主类
  • 鸿蒙系统(HarmonyOS)经典红色风格登录页布局
  • 磁悬浮轴承刚度设计:高速转子的稳定秘诀
  • 优化 ArcPy 脚本性能
  • AI知识库搭建需要的开源技术方案
  • Azure 自动化:所需状态配置 (DSC)
  • 【iSAQB软件架构】架构模式
  • (LeetCode 面试经典 150 题) 122. 买卖股票的最佳时机 II (贪心)
  • C#高级:Winform桌面开发中DataGridView的详解(新)
  • 鸿蒙 GridRow 与 GridCol 组件解析:响应式网格布局指南
  • Wpf中控件作为Binding的源
  • gsql: command not found
  • 【学习笔记】3.3 Decoder-Only PLM
  • iOS 性能调试工具实战:构建日志追踪与调试可视化系统
  • 数据库数据恢复—SQL Server数据库被加密如何恢复?
  • Java如何导出word(根据模板生成),通过word转成pdf,放压缩包
  • 使用 Netty 实现 TCP 私有协议(解决粘包/拆包)
  • nginx+springboot获取局域网IP外网IP