挖洞经验 | 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目录下
漏洞原理
-
图片处理机制:
- 上传的图片使用base64格式编码
- 系统使用"Image Resizing Tool"处理上传的图片
-
漏洞触发点:
- 可向上传图片中注入恶意Payload
- Payload经API转换为Base64格式后被服务器处理
- 服务器无法正确处理恶意Payload
-
信息泄露:
- 错误响应中包含PHP库函数代码
- 泄露了多个内部文件路径和函数调用栈
漏洞利用方法
- 构造恶意图片Payload
- 发送以下POST请求:
POST /v2.10/act_123456789/adimages HTTP/1.1 Host: graph.facebook.com Bytes=VGhpcyBpcyBtYWxpY2lvdXMgcGF5bG9hZC4= - 触发服务器错误响应
泄露的信息内容
错误响应中暴露了:
- 完整的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)
-
报告要点:
- 清晰描述漏洞触发条件
- 提供完整的请求/响应示例
- 说明潜在影响和利用场景
附录:完整错误响应示例
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"
}