BUUCTF--Web--[SUCTF 2019]EasySQL

猜测后端执行SQL语句

输入1,有回显
在这里插入图片描述输入2,有回显,输入非零数字都有回显,输入字母无回显
在这里插入图片描述

输入1’,没回显,应该存在sql注入,猜测可能关闭了错误回显,报错注入可能行不通了
在这里插入图片描述用order去试探有多少个字段,返回的都是Nonono,可能order by 参数被过滤了,联合查询就行不通了
在这里插入图片描述排除了报错注入和联合查询注入,试下盲注,布尔盲注

1 and length(database())>=1#

在这里插入图片描述

1' and length(database())>=1#

在这里插入图片描述数据库名长度>1都返回NOnono,放弃布尔盲注,时间盲注试试

1 and if(length(database())>=1,1,sleep(5))#

在这里插入图片描述我只能呵呵了~,大佬说可能是过滤了太多关键字(俺也不知道如何从上面得出这个结论来的),试试堆叠注入吧

查看有哪些数据库,这次终于可以了
在这里插入图片描述查看有哪些表
在这里插入图片描述试试查看flag表中的数据
在这里插入图片描述战斗力为0了,只好默默地去看大佬博客

通过大佬们的blog知道:

这道题目需要我们去对后端语句进行猜测

1、输入非零数字得到的回显1和输入其余字符得不到回显=>来判断出内部的查询语句可能存在有||

2、也就是select 输入的数据||内置的一个列名 from 表名=>即为

select post进去的数据||flag from Flag(含有数据的表名,通过堆叠注入可知)

此时的||起到的作用是or的作用

解法1
内置的sql语句为

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

在这里插入图片描述

我们执行的语句分别为

select 1
set sql_mode=pipes_as_concat
select 1||flag from Flag

读出flag
在这里插入图片描述
??一些疑惑:

**为啥select ,1||flag from Flag = select ,1 from Flag?

select 1 from table;的结果是什么?
在这里插入图片描述在这里插入图片描述
可以看到,查询结果为列名为1,一共六行

select任何一个常数都会在表中新建一列,然后查询出那一列的内容。

结论:
select 1 from Flag的结果就是一排1,这一排有几个数据取决于表的行数多少

这篇博客有介绍:https://www.cnblogs.com/jiechn/p/3979261.html

在这里插入图片描述
这个题太难猜了吧!

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值