小言_互联网的博客

BUUCTF:[CISCN2019 华东南赛区]Web4 ---- jwt的加密,解密 复习 ---- 一个奇怪的 jwt 的secret方法

533人阅读  评论(0)

一、自己做:

**注:**没有思路的地方,就是我看WP的地方。
解解jwt瞅瞅,
有加密的东西,我目前遇到过的jwt解法:弱密钥碰撞,碰撞出密钥来,就可以修改数据了,二:无密钥检测,用python重写一个无验证的jwt,有可能也成功,
再是一个进阶的方法:如果是SA256不对称加密的化,我们没办法破解,但是可以用SH256加密的方法巴拉巴拉给弄出来,没遇到过题,然后懒,,没有细细研究,


我*???,我正要用python脚本后者Linux的jwt解码的时候来,吧后面这个一解密,竟然出来了,。。但是好像也没啥吧,,www-data是那个就是一个权限的名字,
那么就是www-data,访问的这个东西,那么我们修改就修改成为名字为admin,然后后面权限为root么,,大概这个思路。

1.没有思路啦,,

啊。看了一眼WP,那个url可以利用一下 . 。很想那个啥

2.没有思路啦,,

然后我就没有思路了,,然后大佬就说可能是python的flask。

然后猜测,应该不是php,其实从url后面就能够看出来,应该只有那些thinkphp, larval等框架才是这样的路由的形式,这样的小型的PHP应该不是,然后大佬们就说是python的flask

还真是,
。。。然后怎么读取整个app.py呢,,,我找以前的知识点,找了半天,,结果直接看就行。。

。。代码逻辑竟然如此简单,,换一下session中的name就好了,,,那么secret是多少是一个问题的呀,那么突破点肯定就是那个secret的获取了啊,肯定是能够知道的。怎么知道,就要学习WP了

# 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! '

@app.route('/read')
def read():
    try:
        url = request.args.get('url')
        m = re.findall('^file.*', url, re.IGNORECASE)# 就是re.I的意思,大小写都匹配
        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"
    )

二、学到的&&不足:

  1. 看到那些什么网页跳转到东西 ,一定要敏感啊!!~~。

  2. 还有PHP的话,是 file:///etc/passwd。然后python的flask是:local_file:///etc.passwd

  3. 这个东西,是个,算啥啊,谁知道这个是mac地址啥的啊,可能当时都不会,然后搜这一段代码,然后知道饿了,然后写脚本才行的。也算个考点吧,我这里直接看WP了

  4. 看看自己搜一搜,写一些,然后 jwt解密,加密的重新规范一下

  5. jwt 的加密,解密,都在这里了,不用看了

三、学习WP

啊。看了一眼WP,那个url可以利用一下

然后猜测,应该不是php,其实从url后面就能够看出来,应该只有那些thinkphp, larval等框架才是这样的路由的形式,这样的小型的PHP应该不是,然后大佬们就说是python的flask

。然后接上面,源码哪里:

在源码中可以看到有一个flag路由,如果session的username为fuck可以直接得到flag。所以接下来的关键就是看看能不能伪造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

不带上local_file:///也一样能出 。

02:42:ac:10:b3:17
.

0x0242ac10b317

得到Mac地址为:02:42:ac:10:b3:17

接下来使用python2求解,因为python3和python2的str保留的位数不一样。


我的就是233.160687583.

然后就是jwt的解密和加密了。加密解密在本地的那个 m每天一个小技巧的整个txt里面

解密就用这个吧,带密码的解密,更好,不带密码也行


.
然后就好了吗,换一下就好了

{
   'username':b'fuck'}


转载:https://blog.csdn.net/Zero_Adam/article/details/115876788
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场