学习的博客: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[‘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_这个文件。
SID 是一个系统常量,SID包含着会话名以及会话 ID 的常量,格式为 “name=ID”,或者如果会话 ID 已经在适cookie 中设定时则为空字符串,第一次显示的时候输出的是SID的值,当你刷新的时候,因为已经在cookie中存在,所以显示的是一个空字符串。
session_id() 函数用来返回当前会话的session_id,它会去读取cookie中的name,也就是PHPSESSID值。
[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一点都不了解,好像以buuok上的题来当web入门好像有点拉跨,不过看都看了,硬学下去吧
学习的博客:https://www.cnblogs.com/mrchige/p/6387674.html
Flask 是一个 web 框架。也就是说 Flask 为你提供工具,库和技术来允许你构建一个 web 应用程序。这个 wdb 应用程序可以使一些 web 页面、博客、wiki、基于 web 的日历应用或商业网站。
Flask 属于微框架(micro-framework)这一类别,微架构通常是很小的不依赖于外部库的框架。这既有优点也有缺点,优点是框架很轻量,更新时依赖少,并且专注安全方面的 bug,缺点是,你不得不自己做更多的工作,或通过添加插件增加自己的依赖列表。
kali上不自带tree,输入sudo apt install tree 安装tree这个命令
templates 文件夹是存放模板的地方,static 文件夹存放 web 应用所需的静态文件(images, css, javascript)。
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()
输入内容:
<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/ 访问
flask中使用参数
为此我们更新 hello_flask.py 文件。
在 hello_flask.py 文件中添加以下条目
@APP.route('/hello//' )
def hello(name):
""" Displays the page greats who ever comes to visit it.
"""
return flask.render_template('hello.html', name=name)
创建下面这个模板 hello.html
<html lang='en'>
<head>
<meta charset="utf-8" />
<title>Hellotitle>
<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 ?”
创建模板文件 master.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 %}
简单的跟着写了下代码,感觉flask就是个模板,{{}}里面的是标量,{% %}里面类似逻辑语句吧
以后碰到flask先看@APP.route()的路径,找到重要的文件
学习的博客: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:
-s 后跟签名
-c 后跟当前cookie的value
解密后的数据:
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了