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 2019EasySQL1 writeup(详细版)_buuctf easysql_今天不用学物理吧的博客-CSDN博客

相关推荐
网安墨雨1 小时前
MySQL数据库 SQL语句详解
自动化测试·软件测试·数据库·python·sql·mysql
析数塔1 小时前
SleeperGem 技术拆解:恶意 gem 是怎么躲过 CI/CD 扫描的
安全·ci/cd·github
酉鬼女又兒2 小时前
[特殊字符]零基础入门AI:归纳演绎、假设空间、归纳偏好、NFL、过拟合与欠拟合、模型评估选择、超参数、性能度量、混淆矩阵、P-R曲线和F1
人工智能·windows·python·深度学习·安全·机器学习·矩阵
一个天蝎座 白勺 程序猿4 小时前
复盘之我在金仓生产环境踩过的SQL暗坑,和攒了六年的编码规矩
数据库·sql·kingbasees
●VON4 小时前
鸿蒙 PC Markdown 编辑器 Alpha 评审:如何用退出条件判断阶段完成
网络·安全·华为·编辑器·harmonyos·鸿蒙
zzq77974 小时前
Android 16 API 36 升级后 APP 加固兼容性问题解析
android·开发语言·安全·kotlin·安卓·安全架构
绘梨衣的sakura路14 小时前
Fastjson ≤ 1.2.83 新型 RCE 漏洞深度分析:三层绕过机制与完整利用链
安全·web安全·json
北龙云海14 小时前
案例分享 | 面向公网业务系统境内访问白名单配置实操方案
运维·网络·安全·网络安全·告警·数据泄露·入侵攻击