1.ErrorFlask

进入环境,叫传number1和number2参数,用get传一下

payload=/?number1=1&&number2=2

说不是SSTI,但是修改参数信息,发现渲染数字可控

传入字符报错

然后ctrl+f找到flag


2.Begin of HTTP

进入环境,照要求传递参数

payload=/?ctf=114514

然后叫我们用post请求继续传参数

然后又找到base64编码的参数值

解码后,secret=n3wst4rCTF2023g00000d

然后说什么power,没懂,可能是cookie或者referer 头,都修改一下

不知道为啥hackbar不行,burp抓包发一下吧

修改浏览器头

修改referer头

修改本地访问,X-Real-IP伪造

最后成功拿到flag


3.泄漏的秘密

进入环境,提示我们敏感信息

直接抓包

直接dirsearch开扫有没有泄露文件

发现www.zip

然后解压的robot.txt发现半个flag

然后index.php发现另外一半flag

拼接提交成功

4.Begin of Upload

上传文件,直接上传webshell,弹窗文件限制

直接先上传正常文件,抓包绕过前端限制

上传成功,返回文件路径

抓包上传一句话php木马成功

蚁剑连接成功,并拿到flag

5.Begin of PHP

进入环境,是代码,看来是代码审计

审计后逻辑:

php ==比较,哈希值0e开头即可绕过

①get请求传递key1和key2参数,参数不等但是md5值相等则 level 1 完成 key1=240610708,key2=QLTHNDT即可

②key3md5值和sha1加密相等,则level 2完成 key3先md5然后哈希的值和key3先sha1加密然后哈希值相同即可

但是这里是===,所以没办法通过0e弱绕过,可以通过都是数组的方式来尝试绕过

post请求key3[]=3

③file_get_contents函数是将文件内容变为字符串输出 strcmp函数是字符比较,但是输入其他类型时会出错从而绕过

key4[]=4

④可以继续用数组绕过,同时小知识,数组大小可以和数字比较。所以

key5[]=2024,要大于2023

⑤直接传递flag5值,然后还不能时数字,字母,然后if语句还为真

根据前面小知识可以知道(flag5[]=1)就是1,那么flag5[]=1

最后成功拿到flag

6.R!C!E!

依旧是代码审计

①POST传入password参数,md5值前六位为c4d038

②POST传入e_v.a.l参数,值可以作为命令执行,但会过滤一些命令

首先写脚本爆破md5值

脚本:

import hashlib
import itertools


def find_matching_number(target_part, start_pos, end_pos, max_digits):
    for length in range(1, max_digits + 1):
        # 生成所有可能的数字组合
        for num_tuple in itertools.product('0123456789', repeat=length):
            candidate = ''.join(num_tuple)
            # 计算MD5哈希值
            md5_hash = hashlib.md5(candidate.encode()).hexdigest()
            # 提取指定位置的子串
            hash_part = md5_hash[start_pos:end_pos + 1]

            if hash_part == target_part:
                print(f"找到匹配项!数字: {candidate}")
                print(f"完整MD5: {md5_hash}")
                return candidate
    print("未找到匹配的数字。")
    return None


if __name__ == "__main__":
    target = input("请输入已知的MD5片段: ").lower()
    start = int(input("请输入起始位置(0-31): "))
    end = int(input("请输入结束位置(0-31): "))
    max_length = int(input("请输入要爆破的最大数字长度: "))

    result = find_matching_number(target, start, end, max_length)

最后得到值为114514

password=114514

然后看e_v.a.l参数,首先技巧:

` 命令`,里面的命令会优先执行,并作为输入继续执行

①tac可绕过对cat的限制,从后往前看

②\在命令中可无意义,绕过诸如flag的限制,fla\g=flag

③然后低版本php解析特性,会将变量第一个不合法字符修改再返回去,只修改一次

那么原来的e_v.a.l中,. 是第一个不合法字符,会被修改,不正确

那么我们将下划线变为第一个不合法字符就可以了

(不过这里我不知道为啥一定要用[,知道的师傅请告诉我)

④最后得到e[v.a.l=echo`tac /fla\g`;

最后得到flag


7.EasyLogin

进入环境,是一个登录框

尝试注册admin账号,发现已注册

抓取登陆包,传输密码是md5

尝试burp爆破sql注入

没成功,尝试先正常注册账号,进入看看

发现一个302跳转的响应包提示

根据提示发现是被骗了,既然sql注入不行,那就试试爆破密码吧

发现不同,md5解密一下,发现是000000

试着登录admin账号,抓取到302跳转包,发现flag

登陆成功会有终端,但其实没啥用

最后找到flag