Skip to content

2021_3KCTF

ppaste

源码: https://github.com/rekter0/ctf/tree/main/2021-3kCTF/web/ppaste/ppaste

Hints 1. json inconsistencies

他是开着两个服务的Challenge,一个是对外的PHP,还有一个用于注册邀请的内网api接口

获取flag

查看源码,发现在html/api.php处admin下会获得到flag

    case 'admin':
        $tU=whoami();
        if([email protected]$tU OR @$tU['priv']!==1) puts(0);
        $ret["invites"]=json_decode(qInternal("invites"),true);
        $ret["users"]  =json_decode(qInternal("users"),true);
        $ret["flag"]   =$flag;
        puts(1,$ret);
        break;
    default:
        puts(0);
        break;

internal.py下有通过邀请码注册用户invites和改变用户权限users的两个API

@app.route('/invites', methods=['GET', 'POST'])
def invites():
    if request.method == 'POST':
        myJson = json.loads(request.data)
        if(myJson['invite'] in open('/var/www/invites.txt').read().split('\n')):
            return json.dumps(True)
        else:
            return json.dumps(False)
    return json.dumps(open('/var/www/invites.txt').read().split('\n'))

@app.route('/users', methods=['GET', 'POST'])
def users():
    if request.method == 'POST':
        myJson = json.loads(request.data)
        if(myJson['user']):
            qDB("UPDATE users SET priv=not(priv) WHERE user=? ","setAdmin",myJson['user'])
            return json.dumps(True)
        else:
            return json.dumps(False)
    return json.dumps(qDB("SELECT user,priv FROM users"))

大致思路有了, 获取邀请码 -> 注册用户 -> 提升用户权限 -> 获取flag

邀请码获取不到 内网的/users接口外部只有admin用户才能调用

绕过注册码,注册普通用户

分析下注册流程

    case 'register':
        if(@$data['d']['user'] AND @$data['d']['pass']){
            if([email protected]$data['d']['invite']) puts(0);
            $checkInvite = @json_decode(@qInternal("invites",json_encode(array("invite"=>$data['d']['invite']))),true);
            if($checkInvite===FALSE) puts(0);
            if(uExists($data['d']['user'])) puts(0);
            $db->exec("INSERT INTO users(user,pass,priv) VALUES ('".ci($data['d']['user'])."' ,'".ci($data['d']['pass'])."' , '0')");
            if($db->lastInsertRowID()){
                puts(1);
            }else{
                puts(0);
            }
        }
        puts(0);
        break;

Last update: 2021-08-06