一、自己做:
**注:**没有思路的地方,就是我看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"
)
二、学到的&&不足:
-
看到那些什么网页跳转到东西 ,一定要敏感啊!!~~。
-
还有PHP的话,是 file:///etc/passwd。然后python的flask是:
local_file:///etc.passwd
-
这个东西,是个,算啥啊,谁知道这个是mac地址啥的啊,可能当时都不会,然后搜这一段代码,然后知道饿了,然后写脚本才行的。也算个考点吧,我这里直接看WP了
-
看看自己搜一搜,写一些,然后 jwt解密,加密的重新规范一下
-
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