挖洞经验 | Facebook Ads广告业务API接口的源代码泄露漏洞
字数 1152 2025-08-18 11:37:49

Facebook Ads广告业务API接口源代码泄露漏洞分析

漏洞概述

本漏洞涉及Facebook Ads广告业务系统中的API接口,该接口用于商户账户上传广告图片。由于服务器端未能正确处理恶意Payload图片,导致在错误响应中泄露了内部PHP库函数代码,暴露了Facebook部分源代码。

漏洞发现背景

  • 研究者从Windows系统安全研究转向Web安全研究
  • 针对Facebook漏洞赏金项目进行研究
  • 重点研究了HTTP请求机制和Web漏洞分析技术

漏洞技术细节

受影响功能

  • Facebook Ads广告系统的图片上传接口
  • 路径:/v2.10/act_123456789/adimages
  • 功能:处理商户上传的广告图片并存储在/adimages目录下

漏洞原理

  1. 图片处理机制

    • 上传的图片使用base64格式编码
    • 系统使用"Image Resizing Tool"处理上传的图片
  2. 漏洞触发点

    • 可向上传图片中注入恶意Payload
    • Payload经API转换为Base64格式后被服务器处理
    • 服务器无法正确处理恶意Payload
  3. 信息泄露

    • 错误响应中包含PHP库函数代码
    • 泄露了多个内部文件路径和函数调用栈

漏洞利用方法

  1. 构造恶意图片Payload
  2. 发送以下POST请求:
    POST /v2.10/act_123456789/adimages HTTP/1.1
    Host: graph.facebook.com
    Bytes=VGhpcyBpcyBtYWxpY2lvdXMgcGF5bG9hZC4=
    
  3. 触发服务器错误响应

泄露的信息内容

错误响应中暴露了:

  • 完整的PHP调用栈
  • 多个内部文件路径:
    • /var/www/flib/resource/filesystem/upload/upload.php
    • /var/www/flib/ads/admanager/adupload/adupload.php
    • /var/www/flib/ads/admanager/adupload/AdImageUtils.php
    • 等数十个内部文件路径
  • 函数调用关系和内部处理逻辑

漏洞影响

  1. 直接风险

    • 暴露内部系统架构和代码实现
    • 可能被攻击者用于发现其他漏洞
  2. 潜在风险

    • 泄露的业务逻辑可能被用于构造更复杂的攻击
    • 暴露的文件路径信息可能被用于目录遍历攻击

修复建议

  1. 错误处理改进

    • 限制错误响应中的详细信息
    • 使用通用错误消息替代具体实现细节
  2. 输入验证

    • 加强图片上传的输入验证
    • 检测并阻止恶意Payload
  3. 安全措施

    • 实现适当的异常处理机制
    • 考虑使用沙箱环境处理不可信输入

研究经验总结

  1. Web安全研究方法

    • 从HTTP协议基础开始研究
    • 分析大量Web漏洞案例
    • 关注异常响应中的信息
  2. 漏洞挖掘技巧

    • 关注数据处理流程中的异常情况
    • 测试边界条件和错误处理机制
    • 不局限于常见漏洞类型(如OWASP Top 10)
  3. 报告要点

    • 清晰描述漏洞触发条件
    • 提供完整的请求/响应示例
    • 说明潜在影响和利用场景

附录:完整错误响应示例

HTTP/1.1 200 OK
{
  "error":{
    "message":"Invalid parameter",
    "type":"FacebookApiException",
    "code":100,
    "error_data":"exception 'Exception' with message 'gen_image_rescale_multi_thrift call to shrinkImageMulti failed with fbalgo exception: 43 (43: : IDAT: invalid distance too far back)' in /var/www/flib/resource/filesystem/upload/upload.php:1393\nStack trace:\n#0 /var/www/flib/resource/filesystem/upload/upload.php(1662): gen_image_rescale_multi_thrift()\n#1 /var/www/flib/ads/admanager/adupload/adupload.php(252): gen_image_rescale_multi()\n#2 /var/www/flib/ads/admanager/adupload/AdImageUtils.php(195): _gen_adupload_image_resize()\n#3 /var/www/flib/ads/entities/creatives/photos/AdproCreativePhotoDownload.php(53): AdImageUtils::genResizeLocalFile()\n#4 /var/www/flib/platform/graph/resources/adaccount/adimages/mutators/GraphAdAccountAdImagesPost.php(134): AdproCreativePhotoDownload::addLocalFileToCreativeLibrary()\n#5 /var/www/flib/core/data_structures/utils/Arrays.php(440): Closure$GraphAdAccountAdImagesPost::genImplementation#3()\n#6 /var/www/flib/platform/graph/resources/adaccount/adimages/mutators/GraphAdAccountAdImagesPost.php(136): Arrays::genMapWithKey()\n#7 /var/www/flib/ads/api/graph_base/GraphAdsWriteWithRedirectBase.php(22): GraphAdAccountAdImagesPost->genImplementation()\n#8 /var/www/flib/ads/api/graph_base/GraphAdsWriteWithRedirectBase.php(11): GraphAdsWriteWithRedirectBase->genDoCall()\n#9 /var/www/flib/core/asio/gen_utils.php(24): GraphAdsWriteWithRedirectBase->genCall()\n#10 /var/www/flib/platform/api/base/ApiBaseWithTypedApiData.php(204): genw()\n#11 /var/www/flib/platform/api/base/ApiBase.php(85): ApiBaseWithTypedApiData->genCallWithApiDataBase()\n#12 /var/www/flib/platform/graph/core/runner/GraphApiRunnerBase.php(373): ApiBase->genMakeCall()\n#13 /var/www/flib/platform/graph/core/GraphRequestProcessorBase.php(629): GraphApiRunnerBase->genCall()\n#14 /var/www/flib/platform/graph/core/GraphRequestProcessorBase.php(45): GraphRequestProcessorBase->genExecuteSingleGraphRequestCore()\n#15 /var/www/api/graph/server.php(168): GraphRequestProcessorBase->genExecuteSingleGraphRequest()\n#16 /var/www/api/graph/server.php(174): gen_api_graph_server()\n#17 /var/www/flib/core/asio/Asio.php(35): gen_api_graph_server_wrapper()\n#18 (): Closure$Asio::enterAsyncEntryPoint()\n#19 /var/www/flib/core/asio/Asio.php(37): HH\\Asio\\join()\n#20 /var/www/api/graph/server.php(180): Asio::enterAsyncEntryPoint()\n#21 {main}",
    "error_subcode":1487242,
    "is_transient":false,
    "error_user_title":"Image Resize Failed",
    "error_user_msg":"Image Resize Failed:unknown reason",
    "fbtrace_id":"EN/o9hmqwZz"
  },
  "__fb_trace_id__":"EN/o9hmqwZz"
}
Facebook Ads广告业务API接口源代码泄露漏洞分析 漏洞概述 本漏洞涉及Facebook Ads广告业务系统中的API接口,该接口用于商户账户上传广告图片。由于服务器端未能正确处理恶意Payload图片,导致在错误响应中泄露了内部PHP库函数代码,暴露了Facebook部分源代码。 漏洞发现背景 研究者从Windows系统安全研究转向Web安全研究 针对Facebook漏洞赏金项目进行研究 重点研究了HTTP请求机制和Web漏洞分析技术 漏洞技术细节 受影响功能 Facebook Ads广告系统的图片上传接口 路径: /v2.10/act_123456789/adimages 功能:处理商户上传的广告图片并存储在 /adimages 目录下 漏洞原理 图片处理机制 : 上传的图片使用base64格式编码 系统使用"Image Resizing Tool"处理上传的图片 漏洞触发点 : 可向上传图片中注入恶意Payload Payload经API转换为Base64格式后被服务器处理 服务器无法正确处理恶意Payload 信息泄露 : 错误响应中包含PHP库函数代码 泄露了多个内部文件路径和函数调用栈 漏洞利用方法 构造恶意图片Payload 发送以下POST请求: 触发服务器错误响应 泄露的信息内容 错误响应中暴露了: 完整的PHP调用栈 多个内部文件路径: /var/www/flib/resource/filesystem/upload/upload.php /var/www/flib/ads/admanager/adupload/adupload.php /var/www/flib/ads/admanager/adupload/AdImageUtils.php 等数十个内部文件路径 函数调用关系和内部处理逻辑 漏洞影响 直接风险 : 暴露内部系统架构和代码实现 可能被攻击者用于发现其他漏洞 潜在风险 : 泄露的业务逻辑可能被用于构造更复杂的攻击 暴露的文件路径信息可能被用于目录遍历攻击 修复建议 错误处理改进 : 限制错误响应中的详细信息 使用通用错误消息替代具体实现细节 输入验证 : 加强图片上传的输入验证 检测并阻止恶意Payload 安全措施 : 实现适当的异常处理机制 考虑使用沙箱环境处理不可信输入 研究经验总结 Web安全研究方法 : 从HTTP协议基础开始研究 分析大量Web漏洞案例 关注异常响应中的信息 漏洞挖掘技巧 : 关注数据处理流程中的异常情况 测试边界条件和错误处理机制 不局限于常见漏洞类型(如OWASP Top 10) 报告要点 : 清晰描述漏洞触发条件 提供完整的请求/响应示例 说明潜在影响和利用场景 附录:完整错误响应示例