BUUCTF-[SUCTF 2019]EasySQL1

目录​​​​​​​

题目:

分析:

知识点:

其他问题:

1、select 1 from table_name的意思为:


题目:

分析:

先尝试输入。

输入非0数字的时候会有一个回显

输入大小写字母的时候没有回显 

 判断是什么闭合 :输入1#能输出,而输入 1' 和1'#没有输出,"被过滤掉,大致上可以按照数字型进行猜测。

 输入特殊字符也没有报错回显,所以报错注入基本上没戏了

输入很多关于sql语句的东西(and,or,union,if,order from )都会显示Nonono,所以联合查询也没戏

 

再尝试时间盲注 ,sleep也被ban了,时间盲注也不行

再尝试布尔盲注,因为if、and也被ban,所以布尔盲注也基本上没戏

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

 最后看看堆叠注入:(终于!!!!)

payload:1;show tables#
payload:1;show databases#


#因为from被ban了,所以无法使用show columns from 表名

堆叠能够使用,但是因为过滤了from,handler(类似于select),所以能够查找的信息也很有限

然后想到这准备用BUUCTF-[强网杯 2019]随便注1__Monica_的博客-CSDN博客的方法:

结果:



至此sql注入绝大部分方法都不行了,还是太菜,只能看看大佬博客。

知识点:

我们知道默认情况下在MySQL中|| 运算符是逻辑或运算符(即or),但取决于PIPES_AS_CONCAT SQL模式。如果启用了set sql_mode=pipes_as_concat模式,则 || 运算符用作字符串连接,这和Oracle数据库是一样的,即用作CONCAT()函数的同义词。

插入:concat可以连接多个字符串如concat('id','name',','user')等。

例子:

 输入非零数字得到结果一直是1和而输入其余字符的数据就得不到回显=>来判断出内部的查询语句可能存在有||(即or:或运算)。

那么内置语句就可以猜测为:
sql="select post['query'] || flag from Flag";

原理:

MySQL中字符串与数字比较的坑

mysql之字符串进行运算或大小比较 

本地测试:

 

 

但是输入'1xxxx'等数字开头的字符串也不会返回1,可能是把数字开头的字符串过滤或者将post['query']进行了验证在执行sql语句,暂时还不知道原因。

然后或结果为0之后也不会输出0的原因可能为:

在执行sql语句之前进行对 post['query'] || flag 的验证,如果结果为0则不执行sql语句,返回空

方法1:

payload:*,1
1可以换成任何数字,但不能是其他(原因不知道)

这样我们执行的语句就为:
select *,1||flag from Flag
即:
select *,1 from Flag;

 后面的[1]=>1 是因为列名中有一个1;新增加了一个值为1,列名为1的列。

方法2:

payload:1;set sql_mode=pipes_as_concat;select 1

#使用set sql_mode = pipes_as_concat将||作为字符串连接函数
那么sql语句就会为:
select 1;set sql_mode=pipes_as_concat;select 1||flag from Flag;
即:
select 1;set sql_mode=pipes_as_concat;select concat(1,flag) from Flag;

意思为:
输出1;将||作为concat使用;将输出结果中的1和flag字段连接起来;

其他问题:

1、select 1 from table_name的意思为:

在这里插入图片描述

2、php中输出flase不会输出0,而是输出空,输出true时输出1。

<?php
echo true;
echo "</br>";

echo false;
echo "</br>";

echo 2>1;
echo "</br>";

echo 1>2;
echo "</br>";

echo (1>2)==false;
echo "</br>";

echo (1>2)==0;
echo "</br>";

var_dump(1>2);
echo "</br>";

var_dump(2>1);
?>

 结果:

3、mysql表名命名规则

采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成,命名简洁明确,多个单词用下划线'_'分隔

所以:

select concat('f','lag') from Flag;
这种绕过flag的思路是不对的。
因为这种会当做先select 'f','lag' from Flag 然后在使用concat将f和lag连接起来

 

如果去掉单引号

 就会把user和name当做users这个表中的字段使用,而users表中没有这两个字段,所以会报错。

  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值