我是如何黑进成人生活网站Pornhub拿到2万美元赏金的

2016-07-27 818932人围观 ,发现 19 个不明物体 漏洞

*本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。

Clipboard Image.png

老司机们对Pornhub也不会陌生了(//∇//)\,此处略去一万字…作者是如何黑进pornhub的呢?这一切都要从那日作者打开pornhub说起…

概要:

笔者获取了pornhub.com的远程执行代码,并且在Hackone上赚取了2万美元的漏洞赏金。

笔者在PHP的垃圾回收算法中发现了UAF漏洞

此漏洞均可以通过利用PHP的反序列化功能进行远程利用

笔者还获取了互联网漏洞悬赏协会的2000美元赏金

0×01 漏洞发掘

大体“分析”了平台之后,笔者快速检测了该网站的反序列化使用情况,发现多种路径受到影响(比如你上传性感图片的路径):

http://www.pornhub.com/album_upload/create 

http://www.pornhub.com/uploading/photo

在这套程序中,当你post数据中包含名为cookie的参数时,会将cookie参数的值进行反序列化操作,并且其相关的数据会在Set-cookie头中有所体现。

Clipboard Image.png

这可以通过发送包含一个对象的特定数组来进一步验证:

Clipboard Image.png

响应布局:

Clipboard Image.png

第一眼看上去可能会觉得它只是造成信息泄露危害,但一般情况下大家都清楚反序列化用户输入是不明智的:

ROP in PHP applications

Shocking News in PHP Exploitation

开发技术标准中要求所谓合适的面向对象的编程(Property-Oriented-Programming )意味着可能会因为滥用已经存在的类而触发不必要的恶意代码。但不幸的是,笔者很难收集到总体上pornhub使用的所有框架和PHP对象,对多个类别的框架进行了测试之后都无功而返。

0×02 漏洞描述

反序列化的核心相对来说比较复杂,涉及到了PHP5.6 1200多行的代码,此外,许多PHP类有自己的反序列化的方法。为了支持像对象,数组,整型,字符串,甚至是引用这样的数据类型,PHP的记录中显示了一些bug和内存损坏的漏洞。目前PHP的新版本中(PHP5.6或者PHP7)并没有发现类似的漏洞,特别是现在反序列化受到了更多的关注,好比再去榨已经榨干的柠檬,已经没有太多的漏洞可以被挖掘了。

fuzzing 反序列化

为了找到最终的答案笔者的基友Dario针对传递给反序列化的序列串“特制”了一个fuzzer工具,在PHP7上运行这个fuzzer工具将会得到不可预料的结果,而且这种结果在测试pornhub的网站时是不可复制的。因此笔者 把目标放在了PHP5的版本上,然而在PHP5的版本中这个fuzzer生成了1TB的日志还是没有什么结果。当笔者把越来越多的精力放在fuzzing上并且毫无收获之后,笔者开始质疑自己了:这是一个安全相关问题吗?如果是的话是只能本地利用还是可以远程利用呢? 为了深入调查笔者又用fuzzer工具收集了超过200kb的非打印blobs数据。

分析意外结果

接下来笔者用了大量时间来分析症结所在。笔者已经提取了工作内存损坏漏洞的简略证据,最终发现了一个UAF漏洞!经过进一步调查,笔者发现根本源头来自PHP的垃圾回收算法,与反序列化根本毫无关系,这个PHP的两个组成部件在解序列化后才相互作用, 因此,不是很适用于远程利用。经过进一步的分析后,笔者对问题的根源有了更深的理解,并且发现了更多的UAF漏洞,而且是可以用来远程利用的。 漏洞链接:

PHP Bug – ID 72433--CVE-2016-5771

PHP Bug – ID 72434-- CVE-2016-5773

0×03 远程利用

即便是这个让人充满“希望”的UAF漏洞也是非常难以远程利用的,特别是它涉及到了多个开发平台。 明确了我们的目标是能够远程执行任意代码后,我们需要找到控制CPU指令指针到RIP寄存器的方法,通常会有以下障碍:

1.栈和堆以及任何其他的可写入段被标记为不可执行(可执行空间保护)

2.即使你能够控制指令指针,你也需要有一个可执行内存段的有效地址。之后调用libc函数系统执行一个shell命令行。在PHP中,通常是很容易执行zend_eval_string的,例如你在一个PHP脚本中写上“eval(‘echo 1337;’);”时,它可以让我们无需转换而执行任意代码。

第一个问题可以通过使用返回导向编程(ROP)利用现有的可执行记忆片段来解决。第二个问题需要找到zend_eval_string的正确地址。通常当一个动态链接程序被执行时加载程序将会映射此过程到0×400000 (x86_64标准负载地址),如果你已经以其他方式获取了执行权限,你可以本地查找你想要的任何功能。笔者发现了pornhub使用的是PHP5-CGI的编译版本,因此难以确定确切的PHP版本。

具体的利用过程因为比较繁杂小编在这并不赘述,笔者利用漏洞具体能实现的是:

1.下载pornhub.com的完整数据库(包括敏感数据)

2. 可在平台上跟踪用户操作行为

3.网站托管在服务器上的所有代码皆可被泄露

4.深入内网

0×04 规避建议

笔者给出的建议是:

即使是在不同类型的PHP环境中,仍然可以利用反序列化实现远程代码执行,因此不要在反序列化中涉及使用用户数据,少用复杂的序列化方法例如json。

最新的PHP版本已经修复了漏洞,因此读者们需尽快更新PHP版本。

希望此文对您有所帮助,如果纰漏欢迎指错^ ^

*参考来源:evonide,编译/banish,有删改,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)

这些评论亮了

  • 甲鱼 (3级) 回复
    最后洞主精尽而亡……
    )17( 亮了
  • jimmyc 回复
    看不懂,如果有偶pornhub的图文就更好明白了
    )13( 亮了
  • DavidHu (1级) 回复
    @ 我叫扛把子 要不要截个首页给你看看哇
    )10( 亮了
  • 红茶 (1级) 回复
    @ jimmyc 这种文字,就是赚分的,没打算让你看懂。要让你看懂的,类似的文章应该说明几个问题:
    1、fuzzing脚步设计的时候,从那个方面开始攻击的;
    2、攻击结果看php在反序列化和垃圾搜集方面有哪些特点;
    3、可以说明反序列化和垃圾搜集算法的一些东西,也可以制定连接给出一个参考 ;
    4、在编写基于PHP的ROP时候,注意的问题。
    )8( 亮了
  • 素还真 (1级) 半神半圣亦半仙,全儒全道是全贤。 脑中真书藏万卷,掌握文武... 回复
    这翻译太划水了 :arrow:
    )8( 亮了
发表评论

已有 12 条评论

取消
Loading...

特别推荐

推荐关注

填写个人信息

姓名
电话
邮箱
公司
行业
职位
css.php