目录
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";
原理:
本地测试:
但是输入'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表中没有这两个字段,所以会报错。