Unicode欺骗和flask结构的session伪造


[HCTF 2018]admin 1


  • ps:第一眼看到这题,我的思路是通过二次注入去修改admin的密码从而获取flag的,因为确实和sqli-lab的那题太像了,但是好像做不到,网上也没有这样的做法,但是思路是和要讲的Unicode欺骗是基本一致的……

方法一:Unicode欺骗


Unicode 视觉欺骗取决于视觉上可以混淆的字符串:两个 Unicode 字符串外观上非常相似,在通常的屏幕分辨率下,它们以小尺寸的普通字体出现,很容易让人们误认为是另一个,具体文章

这里用的是函数上的漏洞,对于ᴬᴰᴹᴵᴺ来说,nodeprep.prepare函数存在漏洞,它本意是将大写字母转化为小写字母,当出现ᴬᴰᴹᴵᴺ时,就可以把它变成大写的ADMIN,这个漏洞是思路的核心。

我们只需注册一个ᴬᴰᴹᴵᴺ这样的账号,在第一次时注册完它会nodeprep.prepare一次,账号就变成了ADMIN,登入完更改密码时会nodeprep.prepare一次,这样我们的修改的密码就变成admin的了,这样我们就成功修改了admin的密码拿到了flag,当然前提是我们拿到了这题的源码有看到这个函数漏洞,网上好像就这个题目可以这么做,记录一下就好了

方法二:session伪造


在index.php里可以发现如果session[name]=admin就打印flag,flask是轻量级web框架,session存在客户端,我们可以伪造session(cookie)。既然是伪造cookie,那么就要知道它原来的格式是怎么样的,因为原来的session是被加密的所以要对其进行解密,给出解密脚本:

import sys
import zlib
from base64 import b64decode
from flask.sessions import session_json_serializer
from itsdangerous import base64_decode

def decryption(payload):
    payload, sig = payload.rsplit(b'.', 1)
    payload, timestamp = payload.rsplit(b'.', 1)

    decompress = False
    if payload.startswith(b'.'):
        payload = payload[1:]
        decompress = True

    try:
        payload = base64_decode(payload)
    except Exception as e:
        raise Exception('Could not base64 decode the payload because of '
                         'an exception')

    if decompress:
        try:
            payload = zlib.decompress(payload)
        except Exception as e:
            raise Exception('Could not zlib decompress the payload before '
                             'decoding the payload')

    return session_json_serializer.loads(payload)

if __name__ == '__main__':
    print(decryption(sys.argv[1].encode()))

(虽然看不懂但是大为震撼)
解密出来后将name给改成admin的,然后再次用flask-session-cookie-manager(要下)加密,加密要key值,这个key值一般在config.yml文件里,加密完用hackbar输入回去就好了
具体做法


文章作者: 矢坕
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 矢坕 !
  目录