BUU WEB [SUCTF 2019]EasySQL

打开题目,只有一个输入框,照例尝试一下注入点,发现输入纯数字时只有一个回显:
在这里插入图片描述
输入字符时的则没有回显,输入万能密码、尝试order by时回显是nonono,尝试堆叠注入:

1;show databases;

在这里插入图片描述
发现可以,然后来查表:

1;show tables;  

得到了表名:
在这里插入图片描述
然后再进行接下来的步骤是发现都不行。

在网上查看WP,说有大佬根据回显猜出了源码:(膜拜ing)

select $_POST[‘query’] || flag from Flag

|| 具体语法规则为:
当两个操作数都为非 NULL 值时,如果有任意一个操作数为非零值,则返回值为 1,否则结果为 0;
当有一个操作数为NULL 时,如果另一个操作数为非零值,则返回值为 1,否则结果为NULL;
假如两个操作数均为 NULL 时,则返回值为 NULL。
这也是为什么在输入框中输入任何数字都会返回1,因为他进行了运算。
而你在输入框中输入任何非数字,都不会有反应。因为报错了。

根据这个有两种解法:
第一种:

*,1

在这里插入图片描述
语句就成了 :select *,1||flag from Flag

等同于select *,1 from Flag
(这个好像是一个sql语法,1就是向flag表中又加了一名为1,值全为1的列)

第二种:

1;set sql_mode=PIPES_AS_CONCAT;select 1

拼接一下就是select 1;set sql_mode=PIPES_AS_CONCAT;select 1||flag from Flag

第二句语句 : 定义 MySQL 应支持的 SQL 语法,以及应该在数据上执行何种确认检查,其中的PIPES_AS_CONCAT将 ||视为字符串的连接操作符而非 “或” 运算符

关于 sql_mode 更多可以查看这个链接 : https://www.cnblogs.com/piperck/p/9835695.html
(若作者介意请联系删除!!!)

我本身对SQL注入的知识有很大的欠缺,再加上SQL语句我也忘得差不多了,对于这道题我并不是很懂,只是有一个大概的,模糊的概念,尤其是第二种解法,若有大佬愿意指点,请在评论区留言,感激不尽!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值