[Crypto] web token - CirQ xp0int Posted on Jun 18 2018 题目是用flask搭建了一个web应用,目的是通过伪造token来登入admin页面: ![enter image description here](https://leanote.com/api/file/getImage?fileId=5b273183ab644131ba000b1b) 通过所给的login接口可以得到user权限的token,因此得想办法通过user的token来伪造admin的token。token使用HMAC和AES双重加密,一个token的格式如下: ![enter image description here](https://leanote.com/api/file/getImage?fileId=5b273d58ab644131ba000cd9) hmac是用于验证enc\_token的,里面包括name、role和hmac的key。将key放在enc\_token后面应该是一种应用模式而不是有漏洞的设计,主要的问题在于使用了AES的ECB模式。ECB下,每个block都是相互独立的,因此即便不知道AES的秘钥也有办法构造出密文。 ```python from base64 import b64encode, b64decode import requests from Crypto.Hash import HMAC host = 'http://ec2-13-229-142-46.ap-southeast-1.compute.amazonaws.com:9999' # host = 'http://localhost:9999' def get_token(name): assert 0 < len(name) <= 1024 ses = requests.Session() data = { 'name': name } ses.post(host+'/login', data=data) token = ses.cookies['token'] mac = token[-32:] token = token[:-32] return b64decode(token), mac def try_login(token): ses = requests.Session() ses.cookies['token'] = token resp = ses.get(host) print resp.text payload = 'cir'+ 'q'*12 # 最后的':'由题目本身加上的 enc, _ = get_token(payload) name = enc[:16] # 只取第一个分组 payload = 'Q'*16 + chr(16)*16 # chr(16)用于控制截断的位置 enc, _ = get_token(payload) key = enc[:32] # 取前两个分组 h = HMAC.new('Q'*16) # 29行插入新的密钥 h.update('cirqqqqqqqqqqqq:admin') mac = h.hexdigest() token = b64encode(name+key) + mac try_login(token) ``` ![enter image description here](https://leanote.com/api/file/getImage?fileId=5b2743e3ab644133a9000d87) 打赏还是打残,这是个问题 赏 Wechat Pay Alipay [Pwn] Shellcode Manager - Cpt.shao
没有帐号? 立即注册