BUUCTF ——随便注
BUUCTF-[强网杯 2019]随便注
知识点1:层叠注入
层叠注入与之前写的SQL注入的整数注入和字符注入相似,但也有不少的区别。
层叠注入的定义: Stacked injections(堆叠注入)从名词的含义就可以看到应该是一堆 sql 语句(多条)一起执行,而在真实的运用中也是这样的, 我们知道在
mysql 中, 主要是命令行中, 每一条语句结尾加; 表示语句结束。这样我们就想到了是不是可以多句一起使用,这个叫做 stacked injection。
层叠注入的原理:在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。例如以下这个例子。用户输入:1; DELETE FROM products服务器端生成的sql语句为: Select * from products where productid=1;DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。
知识点2:边解题边说知识点
打开靶机后是这样的,根据题目意思知道他是SQL注入,不过还是流程来检验一下是否存在SQL注入。
有个正则表达式,这个表达式的意思是把输入的“select,update,where” 等上面出现的单词都过滤掉,这些单词基本都是SQL注入常常用到的单词,把他们过滤掉了就不像整数的SQL注入了呀,查wq知道这是层叠注入,这就是说在这个点才知道这是层叠注入。接下来就是进行层叠注入:
查询words表中的列:
1';show columns from words;#(查询的结果没啥有用的信息)
在查询另一个表1919810931114514中的列:1';show columns from 1919810931114514
;#
在输入上面的语句时并没有回应,说明存在这错误,这里有个知识点:表名是数字或者是MySQL的语句单词是要加反单引号区分,所以我们写的语句正确的应该是:
1';show columns from `1919810931114514`
;#
在这个表中发现flag,说明flag在这个表中。
接下来构建playload:1';SET@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#
这是基于mysql语法构建的playload,“ SET@a= ”这是定义变量这个变量是@a,后面的 “0x73656c656374202a2066726f6d20603139313938313039333131313435313460” 这是select * from 1919810931114514
的十六进制,目的是绕过过滤。再后面的“prepare execsql from @a;execute execsql;#”是关于以下知识点,具体为什么写这个我不是很明白。
MySQL prepare语法:
PREPARE statement_name FROM preparable_SQL_statement; /*定义*/
EXECUTE statement_name [USING @var_name [, @var_name] ...]; /*执行预处理语句*/
{DEALLOCATE | DROP} PREPARE statement_name /*删除定义*/ ;
PREPARE语句用于预备一个语句,并指定名称statement_name,以后引用该语句。语句名称对大小写不敏感。preparable_stmt可以是一个文字字符串,也可以是一个包含了语句文本的用户变量。该文本必须表现为一个单一的SQL语句,而不是多个语句。在这语句里,‘?'字符可以被用于标识参数,当执行时,以指示数据值绑定到查询后。‘?'字符不应加引号,即使你想要把它们与字符串值结合在一起。参数标记只能用于数据值应该出现的地方,而不是SQL关键字,标识符,等等。
如果预语句已经存在,则在新的预语句被定义前,它会被隐含地删掉。
把playload写上去回车后: