第一个链接有 url 可能是文件包含,访问 file://etc/passwd 无法请求
etc/passwd 这个文件通常存储着用户账户的信息,包括用户名、用户 ID、用户组 ID 等。
访问 file:///etc/passwd 试试
得到
读取一下变量环境
/proc/1/environ
引用的是进程 ID 为 1 的 init 进程的环境变量。
init 进程是 Linux 系统中的第一个用户空间进程,它负责启动和管理其他用户进程。
得到
FLAG=NSSCTF{86a73e44-0cb6-4a9d-a807-927f22dcc1e6}
第3个链接有pwd
执行 pwd 命令可得知目前所在的工作目录的绝对路径名称。
尝试任意文件读取,读取源码app.py试试 read?url=file://app.py
得到 re.findall('app.*', url, re.IGNORECASE)
是一个使用正则表达式进行匹配的代码片段。给url
中查找满足正则表达式模式 'app.*'
的所有匹配项,并以列表的形式返回这些匹配项。
re.IGNORECASE
是一个参数,它告诉 re.findall()
在匹配时忽略大小写
URL双重编码尝试绕过waf
app/app.py
> %61%70%70/%61%70%70%2E%70%79
>%25%36%31%25%37%30%25%37%30%25%32%66%25%36%31%25%37%30%25%37%30%25%32%65%25%37%30%25%37%39
session伪造
源码看到了session需要满足要求才会有权限读取上传的文件,由于伪造session需要密钥SECRET_KEY,而密钥SECRET_KEY的生成方式源码也已经给出了:
random.seed(uuid.getnode())
app.config['SECRET_KEY'] = str(random.random()*233)
使用 Python 的 random
模块和 uuid
模块来生成随机数和随机密钥。
首先,uuid.getnode()
函数返回当前机器的唯一标识符(通常是硬件 MAC 地址)。这个值被传递给 random.seed()
函数,用于初始化随机数生成器的种子。通过使用机器的唯一标识符作为种子,可以增加生成的随机数的独特性。
对于伪随机数,当seed固定时,生成的随机数是可以预测的,也就是顺序为固定的,所以只要知道seed的值即可。这里看到seed使用的uuid.getnode()函数,该函数用于获取Mac地址并将其转换为整数。所以我们还需要读一下Mac地址。
random.random()*233
表达式生成一个介于 0 到 233 之间的随机浮点数。该值的字符串表示被赋给 app.config['SECRET_KEY']
变量,成为密钥
任意文件读取
/read?url=file:///sys/class/net/eth0/address
得到Mac地址
生成密钥 162.47935789789284