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

[SUCTF 2019]EasySQL1 题目分析与详解

一、题目介绍

1、题目来源:

BUUCTF网站,网址:https://buuoj.cn/challenges

2、题目描述:

通过以上信息,拿到flag。


二、解题思路

首先打开靶机,尝试输入1查看回显,回显如图所示:

尝试将 1 和 or 一起输入,即 1 or 1=1。

显示 nonono,表明 or 被过滤了,这时我们就需要检查哪些关键字被过滤掉了,来判断此时应该使用什么注入方式。

首先利用 Burpsuite 进行抓包。

利用关键字字典对query进行爆破。

爆破完成,查看response,Length=560的关键字都是被过滤掉的。

得出最终结论,被过滤的关键字有:

prepare|flag|unhex|xml|drop|create|insert|like|regexp|outfile|readfile|where|from|union|update|delete|if|sleep|extractvalue|updatexml|or|and|&|" 作者:雨落雪辰 https://www.bilibili.com/read/cv11014857/ 出处:bilibili

由此观之,报错注入,union联合注入,盲注皆不可行,所以我们尝试进行堆叠注入

堆叠注入:将多条SQL语句放在一起,并用分号;隔开。

进行堆叠注入,先尝试查看数据库名称。

成功查询到数据库的名称,这表明堆叠注入是可行的,我们接着顺势查询表明。

看到表Flag,我们基本可以确定,flag在表Flag中。我们首先想到利用from来查询Flag,可是通过抓包分析可知,from关键字被过滤掉了,所以只能另寻他法。

此时我们想到,开始时我们输入1有会显,我们不妨再尝试输入0试试。

输入0发现无回显,我们尝试输入字母试试。

输入abc发现依然没有回显。这时我们可以总结出一条规律,输入非0数字--有会显,输入0或字母--没有回显,我们由此可以猜测后端代码含有 ||或运算符


补充:|| 或or 运算符讲解:

select command1 || command2 

情况一:若command1为非0数字,则结果为1。

情况二:若command1为0或字母,command2为非0数字,则结果为1。

情况三:command1和command2都不为非0数字,则结果为0。


通过以上分析,我们可以判断后端代码中存在或运算符。

查看本题的后端代码,事实与我们的判断相吻合。

$sql = "select ".$post['query']."||flag from Flag"; 

方法一:使用 sql_mode 中的 PIPES_AS_CONCAT 函数。

PIPES_AS_CONCAT:将 || 或运算符 转换为 连接字符,即将||前后拼接到一起。

select 1 || flag from Flag的意思将变成 先查询1 再查询 flag,而不是查询1flag,只是查询的结果会拼接到一起,不要弄混淆了。

所以查询语句如下:

1;sql_mode=PIPES_AS_CONCAT;select 1

查询结果如下:

1的查询结果为1,被flag的查询结果拼接到了一起,get到flag。


方法二:利用非预期漏洞获取flag。

1、非预期漏洞的概念:

若输入1,1。那么sql语句就变成了 select 1, 1 || flag from Flag。其中由 [1] 和 [1 || flag] 两部分组成,而非 [1,1] || [flag]。非预期漏洞是利用数据库对符号判断的不准确形成的漏洞。

2、如何拿到flag:

输入 *,1 后,sql语句就变成了 select * , 1 || flag from Flag。

其中分为两部分: (1) select * from Flag(2) select 1 || flag from Flag。

select * from Flag 通过查看表Flag中的所有数据可以 get到flag。

相关文章:

  • 算法打卡day1|数组篇|Leetcode 704.二分查找、27.移除元素
  • OpenAI文生视频大模型Sora概述
  • C 标准库 - <float.h>
  • 【Ubuntu】通过网线连接两台电脑以实现局域网连接的方法
  • 【docker入门】1-
  • 【Java面试】MongoDB
  • (3)llvm ir转换过程
  • GIT中对子仓库的使用方法介绍
  • 软件测试入门(全面认识软件测试)
  • LeetCode24.两两交换链表中的节点
  • 【LNMP】云导航项目部署及环境搭建(复杂)
  • [HTML]Web前端开发技术30(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页
  • 【Django开发】0到1开发美多shop项目:用户登录模块开发。全md文档笔记(附代码 文档)
  • Python 高级语法:一切皆对象
  • 【Flink精讲】Flink任务调度机制
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • docker-consul
  • EventListener原理
  • gulp 教程
  • JS变量作用域
  • Markdown 语法简单说明
  • Shell编程
  • tensorflow学习笔记3——MNIST应用篇
  • 爬虫模拟登陆 SegmentFault
  • 删除表内多余的重复数据
  • 算法-图和图算法
  • 微信公众号开发小记——5.python微信红包
  • 在Mac OS X上安装 Ruby运行环境
  • ​比特币大跌的 2 个原因
  • #pragma multi_compile #pragma shader_feature
  • #WEB前端(HTML属性)
  • $.each()与$(selector).each()
  • (Ruby)Ubuntu12.04安装Rails环境
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • .net 程序发生了一个不可捕获的异常
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .NET企业级应用架构设计系列之结尾篇
  • @SuppressWarnings(unchecked)代码的作用
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • []串口通信 零星笔记
  • [20150707]外部表与rowid.txt
  • [Asp.net MVC]Bundle合并,压缩js、css文件
  • [BUUCTF NewStarCTF 2023 公开赛道] week3 crypto/pwn
  • [C/C++]数据结构 栈和队列()
  • [C++]Leetcode17电话号码的字母组合
  • [Everyday Mathematics]20150130
  • [FxCop.设计规则]8. 也许参数类型应该是基类型
  • [HNOI2006]鬼谷子的钱袋
  • [iOS]随机生成UUID通用唯一识别码
  • [JavaScript]如何讓IE9, IE8, IE7, IE6關閉視窗時不彈出對話訊息
  • [JavaWeb]—Spring入门
  • [LeetCode] Copy List with Random Pointer 拷贝带有随机指针的链表
  • [LeetCode]剑指 Offer 40. 最小的k个数
  • [linux] git lfs install 安装lfs