buuctf-[SUCTF 2019]EasySQL 1(小宇特详解)

本文详细介绍了SUCTF2019中EasySQL1挑战的两种解法:一是利用特殊构造的查询语句直接获取Flag信息;二是通过调整sql_mode参数实现字符串连接,最终成功获取Flag。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

buuctf-[SUCTF 2019]EasySQL 1(小宇特详解)

解法1

这里先用的是万能密码,发现不能使用,然后使用堆叠注入发现能够进行

堆叠注入查询数据库

1; show databases;

在这里插入图片描述

查询表名

1; show tables;

在这里插入图片描述

这里尝试直接访问Flag

1;show columns from Flag;#

发现不行

这里是最迷的一个地方,这里大佬能够猜出查询语句

select $_GET['query'] || flag from flag

这里的||在mysql中表示或,如果前一个操作数为真,则不看后面的语句,然后构造payload

*,1

在这里插入图片描述

这里的原理是

sql=select.post[‘query’]."||flag from Flag";
如果$post[‘query’]的数据为*,1,sql语句就变成了select *,1||flag from Flag,
就是select *,1 from Flag,这样就直接查询出了Flag表中的所有内容。

这里说一下我的理解

这里输入*,1,这里会增加一个临时列,他的列名为1,然后那一列的值都为1。

当我们只关心数据表有多少记录行而不需要知道具体的字段值时,类似“select 1 from tblName”是一个很不错的SQL语句写法,它通常用于子查询。这样可以减少系统开销,提高运行效率,因为这样子写的SQL语句,数据库引擎就不会去检索数据表里一条条具体的记录和每条记录里一个个具体的字段值并将它们放到内存里,而是根据查询到有多少行存在就输出多少个“1”,每个“1”代表有1行记录,同时选用数字1还因为它所占用的内存空间最小,当然用数字0的效果也一样。在不需要知道具体的记录值是什么的情况下这种写法无疑更加可取。

解法2

把||变成字符串连接符,而不是或

涉及到mysql中sql_mode参数设置,设置 sql_mode=pipes_as_concat字符就可以设置。

1;set sql_mode=PIPES_AS_CONCAT;select 1

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小宇特详解

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值