题目来源:BUUCTF上一道强网杯的原题——《随便注》
题目是一个查询,输入1,2有回显,说明存在column1,2.
输入1'
报错,初步判断应该是sql注入。
输入1';show tables
发现有两个表,并且存在堆叠注入漏洞。
输入1';show column from 1919810931114514
,发现无回显,经查询发现数字字符串需加上反引号。可以看到flag column在该表内。
直接上select想拿flag,发现被过滤下来了。
无头绪中,发现该大佬的博客,地址:https://blog.csdn.net/weixin_37839711/article/details/81562550,学会了存储过程绕过。
于是最终payload:1';sEt @a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare ctf from @a;execute ctf;
存储过程绕过的原理,就是用prepare将from后面的语句暂存,该语句可以是16进制的,也可以含有参数。set 可以存储一个数值到变量里面,execute执行prepare的语句。
所以这里我们将select * from `1919810931114514`转换为16进制,然后放进set的变量里,prepare后excecute,成功执行。
为了进一步验证16进制可以执行的猜想,我们进一步测试了另外一个表words,然后……
发现了彩蛋(逃