ShallowRiver

iscc web6

字数统计: 508阅读时长: 1 min
2019/05/20 Share

Web6 Writeup

题目主要考察jwt(json web token)的知识,涉及到密码学的签名认证,要想办法伪造管理员的token来通过验证
1.首先查看源码,发现了加载了common.js文件,查看该文件源码
发现文件末尾定义了一个getpubkey()函数
function getpubkey(){
/
get the pubkey for test
/pubkey/{md5(username+password)}
/
访问该路径得到公钥内容(\n记得手动转义换行)

1
2
3
4
5
6
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMRTzM9ujkHmh42aXG0aHZk/PK
omh6laVF+c3+D+klIjXglj7+/wxnztnhyOZpYxdtk7FfpHa3Xh4Pkpd5VivwOu1h
Kk3XQYZeMHov4kW0yuS+5RpFV1Q2gm/NWGY52EaQmpCNFQbGNigZhu95R2OoMtuc
IC+LX+9V/mpyKe9R3wIDAQAB
-----END PUBLIC KEY-----

2.登陆后发现查看list(自己帖子信息)内容可以看到自己发的帖子,猜想我们要伪造管理员的身份来看帖子内容(疯狂暗示flag)
查看js源码后发现在点击list后我们发送了一个ajax请求,然后服务端验证我们的身份(jwt:json web token)

抓包发现我们的token为
iscc19 eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoid2N6Y3oiLCJwcml2Ijoib3RoZXIifQ.j2x6PXC5LA5X5S9KDTMywqoRKPwM7AwgtjiwWZumEGIIyKng3hp65beux-ZqfZD45qlcKcLxZBZrJMTGMueh6s7U3vK1M2tLjtoi85KXu4UQAchKzvIdh9zf6kOpgcXtw8LN1m4PnggHRT7yYftRDW-rtufRev0SGaqaV9rle0M
由此token格式中间的两个.可以判断出采用了jwt格式的token对用户进行验证,访问https:jwt.io对token进行解析

可以看到前两部分分别以json信息存储了加密的算法,以及用户的信息,而第三部分是我们的签名,这点是重点,由于RSA256为非对称加密算法,我们不知道管理员的私钥,那么就不能伪造出管理员的签名信息。(RSA加密采用私钥加密,公钥解析来验证用户身份,公钥是公开的,但是每个用户的私钥都是保密的)但是我们由上面的步骤获取了公钥,那么怎么利用公钥来通过验证的,这就涉及到对称加密算法,在对称加密中,用户的签名与认证都是使用同一个密钥的,所以当我们获取了公钥信息,就可以伪造任意用户的token。那么根据jwt的HEADER与PAYLOAD以及公钥信息,我们就可以伪造出管理员的token。
直接给出payload
import jwt

CATALOG
  1. 1. Web6 Writeup