BUUCTF 刷题 [HCTF 2018]admin

BUUCTF 刷题   [HCTF 2018]admin_html

查看一下源码

BUUCTF 刷题   [HCTF 2018]admin_json_02

四处点一点

BUUCTF 刷题   [HCTF 2018]admin_f5_03

猜测应该是使用admin进行登录

注册

BUUCTF 刷题   [HCTF 2018]admin_flask_04

BUUCTF 刷题   [HCTF 2018]admin_github_05

主要增加了postchange password功能

post功能我最初怀疑是有什么ssti或者xss漏洞,但是好像都没有

但是在change password界面发现了一段有趣的注释

BUUCTF 刷题   [HCTF 2018]admin_html_06

泄露了Github源码

解法1 session

在此不得不吐槽一波,我的GitHub打不开了。。。。。

没办法,用码云clone一下吧????

BUUCTF 刷题   [HCTF 2018]admin_f5_07

首先得到的信息是这个框架是个flask框架

BUUCTF 刷题   [HCTF 2018]admin_flask_08

看到了这个框架,我不由得想起了之前见过的一道题,那道题就是由于使用了flask框架,导致session可以被解码出来

现在我们解码一下试试

使用这个工具

https://github.com/noraj/flask-session-cookie-manager

但是我dncode后的代码更改后就无法encode,看了一下别人的wp

发现大佬的wp有些说可以直接使用这个工具dncode再encode的,但是使用后我虽然可以正常解码,但是encode的时候却发现需要经过多处改动才可以encode,所以在这里我们decode就不适用这个脚本的decode功能了,直接使用如下的python代码

#!/usr/bin/env python3
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()))

代码来自javascript:void(0)

BUUCTF 刷题   [HCTF 2018]admin_html_09

{'_fresh': True, '_id': b'83d11c7d78f53f5bef71d91422575aa3f7e57e4c6917bd6ed9c88a7e1550fa6f857e808a2a784946fa63a78539ccd917f0b4e010c89adad0063f0f3837f5d82f', 'csrf_token': b'91d43a6021fbfd5a2ec9998ee882896ce7a56659', 'image': b'czLe', 'name': 'admin2', 'user_id': '10'}

admin2是我注册的时候用的名字

接下来我们就需要将name改为admin,然后再重新打包回去,但是encode的时候需要密码,这时候就可以去GitHub上面的源代码里面去找了

根据重点关注config文件的原则,我们很快就找到了key

BUUCTF 刷题   [HCTF 2018]admin_json_10

使用ckj123作为key

加密脚本使用的是GitHub上面的那个脚本

BUUCTF 刷题   [HCTF 2018]admin_json_11

接下来替换session就可以了

BUUCTF 刷题   [HCTF 2018]admin_html_12

解法2 Unicode欺骗

这个解法对源码阅读的完整性要求比较高

在源码app/routes.py这个位置的后面

def strlower(username):
    username = nodeprep.prepare(username)
    return username

对于一些特殊字符,nodeprep.prepare会进行如下操作

ᴬ -> A -> a

搜索一下那些地方调用了这个方法

BUUCTF 刷题   [HCTF 2018]admin_html_13

BUUCTF 刷题   [HCTF 2018]admin_html_14

BUUCTF 刷题   [HCTF 2018]admin_f5_15

接下来的思路就很明确了,先注册一个注册用户ᴬdmin,然后登录用户ᴬdmin,变成Admin,最后修改密码Admin,更改了admin的密码

题外话

其实这道题还有个小bug,那就是admin的密码就是123。。。。

参考链接:
javascript:void(0)
https://darkwing.moe/2019/11/04/HCTF-2018-admin/

A lion doesn't concern himself with the opinions of a sheep.