Buuctf web [SUCTF 2019]EasySQL

又是一道考察sql注入的题

1、起手试探

(主要看看输入什么内容有正确的回显)

复制代码
1
0
1'
1' #

发现只有在输入1的情况下有正常的回显,输入0或其他字符都没有回显,所以这题就要尝试堆叠注入了。

ps:(如果想尝试其他注入方法,输入以下内容需要有回显

复制代码
1'    报错
1'#    正确

2、爆库

复制代码
1; show databases;

3、报表

复制代码
1;show tables;

4、爆字段

复制代码
1;show columns from 1;
1;show * from 1;

显示Nonono.,看来关键字from被ban了。

不费脑子的方法用不了了,只能猜测一下后端代码了。

先查看一下源码,看到传参类型为post,方式为query。

根据前面的回显:输入1到9返回Array ( [0] => 1(此处的1可能代表Ture) ),输入0或字符没有回显,仅有的两种回显,可以判断出,后端应该使用的是逻辑或,即条件为真进行回显或条件不满足返回空白

逻辑或:|| 两边,一侧为1则取1,否则取0。

同时题目中还有这样的一句提示的话,需要你将flag交给它,它告诉你flag是不是真的,也就是说名后端的内容很有可能是||拼接:1、从网页获取的内容。2、真正的flag的内容。

复制代码
select $post['query'] || flag

ps:补充一堆

1、post请求的Parameter Type是可以是query,而一般情况下post请求方式的Parameter Type是 body,在一些极少情况下,post请求的参数体可能会存在body及query共存的情况。

2、所以这其实涉及到post请求的三大部分:header、body、query(简单来说:header:请求头、body:多参数请求体、query:单参数请求体)。

3、后端的接口在不注解的情况下默认是query,所以get请求用query,一般传递单个参数。而post请求多用body,一般传递多个参数。

4、params就是query参数,params的值只能是一个字符串,不能传递对象类型的参数,如果参数中涉及到了传递对象,就要选择body传参。

5、对象类型参数:顾名思义,参数类型是我们定义的类。我们知道int型参数,char型参数等,对象类型原理相同,即传入某个函数的参数是对象类型的

总的来说就是post['query']用来获取用户输入的字符串

所以我们需要将或逻辑改为与

复制代码
1;set sql_mode=PIPES_AS_CONCAT;select 1
补充

其他sql_mode的参数:

ONLY_FULL_GROUP_BY:

对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中

NO_AUTO_VALUE_ON_ZERO:

该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户 希望插入的值为0,而该列又是自增长的,那么这个选项就有用了。

STRICT_TRANS_TABLES:

在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制

NO_ZERO_IN_DATE:

在严格模式下,不允许日期和月份为零

NO_ZERO_DATE:

设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告。

ERROR_FOR_DIVISION_BY_ZERO:

在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如 果未给出该模式,那么数据被零除时MySQL返回NULL

NO_AUTO_CREATE_USER:

禁止GRANT创建密码为空的用户

NO_ENGINE_SUBSTITUTION:

如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常

PIPES_AS_CONCAT:

将"||"视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似

ANSI_QUOTES:

启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符

ORACLE的sql_mode设置等同:PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER.

写完之后上网上搜了一下,发现了另一种方法

复制代码
*,1

根据大佬的判断,后端长这样

复制代码
select post['query'] || flag from Flag

输入*,1就相当于构造了select *,1 || flag from Flag,这条语句执行起来相当于select *, 1 from Flag

原理:1||flag是个短路算法,直接输出1了

select *和select 所有列的意义相同,那么我们构造的select *,1 || flag from Flag ==select *,1 from Flag

参考文章:

sql_mode参数 - 技术文章 - 云掣

BUUCTF [SUCTF 2019]EasySQL1 writeup(详细版)_buuctf easysql_今天不用学物理吧的博客-CSDN博客

相关推荐
麦聪聊数据8 分钟前
从“手动跑数”到“数据超市”,企业内部 API 权限管控与双轨分发架构解析
数据库·sql·低代码·restful
电商API&Tina8 分钟前
主流跨境平台多站点 API 接入流程:淘宝天猫京东API接口
java·大数据·网络·数据库·人工智能·sql·json
信创DevOps先锋9 分钟前
本土化与安全合规双轮驱动:中国企业DevOps工具链选型趋势深度分析
运维·安全·devops
ZKNOW甄知科技22 分钟前
展会回顾 | 甄知科技携燕千云·智能服务流平台亮相武汉
大数据·运维·人工智能·科技·安全·低代码·信息可视化
果果燕23 分钟前
SQLite3数据库学习笔记1
数据库·sql·oracle
Java面试题总结27 分钟前
MySQL高级SQL秘籍:性能飞升之路
sql·mysql·adb
yashuk27 分钟前
clickhouse-介绍、安装、数据类型、sql
数据库·sql·clickhouse
心勤则明43 分钟前
Spring AI Alibaba MCP 协议的全链路安全与动态鉴权
java·安全·spring
Bruce20489981 小时前
2026 云原生安全:Rust 编写微服务网关与零信任实践
安全·云原生·rust
moton20171 小时前
TLS会话恢复机制深度解析:Session ID、Ticket 与 TLS1.3 PSK架构
数据库·网络协议·安全·架构·ssl·物联网架构