flex - 크로스사이트 - AMF 및 교차 사이트 스크립팅의 취약점 혼란




크로스사이트 스크립트 방지 (4)

방금 SFDC를 대신하여 Deloitte의 보안 감사를당했습니다. 기본적으로 flex를 사용하고 AMF를 통해 통신합니다. 우리는 이것을 위해 FluorineFX를 사용합니다 (LCDS 및 Blaze와 반대). AMF 응답이 인코딩되지 않고 누군가가 AMF 매개 변수를 조작하고 Javascript를 삽입하여 XSS 취약성을 나타낼 수 있기 때문에 우리는이 사실을 알게되었습니다. 나는 전달 된 JS를 오류 메시지로 반향시킬 수있는 AMF 응답을 브라우저 나 그 밖의 다른 것에 의해 어떻게 실행할 수 있는지 이해하기 위해 고심하고있다. HTML과 JS를 사용하는 XSS에 대해서는 꽤 경험이 있지만 AMF로 태그가 추가 된 것을 보는 것이 놀랍습니다. 나는 FluorineFx 팀과 연락을하고 있으며 당황하고 있습니다.

AMF 라이브러리가 응답 데이터를 인코딩하는 것을 보게되면 놀랄 것입니다. 불소는 확실히 그렇지 않습니다. PortSwigger 및 IBM AppScan과 같은 보안 응용 프로그램은 도구 상자에 이러한 유형의 테스트를 포함하고있는 것처럼 보일 수 있습니다. AMF로이 취약점에 부딪 혔습니까? XSS 문제가 어떻게 나타나는지 설명 할 수 있습니까? 그냥 궁금해서. 논쟁이 있거나 구멍을 뚫는다면 내 길을 논해야합니다. Flex에서의 AMF 사용을 감안할 때 약간의 통찰력이 있다고 생각했습니다.

추가 정보 ...

실제 공급 업체 인 PortSwigger가 제공하는이 기능에 대해 좀 더 자세히 설명합니다. 나는 그 (것)들에게 그물 및 그물에 질문을 제기했다, 그들은이 유형의 공격이 극단적으로 복잡하다는 것을 인정한다. 처음에는 높은 등급의 보안 문제로 분류했지만 현재 조정이 바뀌고 있다고 생각합니다. 나는 원근법이 무의미하다는 점을 생각하면 나는 당신의 모든 반응 내용을 게시 할 것이라고 생각했습니다.

--- 문제의 PortSwigger에서 ---

메시지를 보내 줘서 고마워요. 대답은 이것이 잠재적으로 취약성이라고 생각하지만이를 악용하는 것은 쉽지 않습니다.

맞습니다. AMF 클라이언트가 응답을받을 때 문제가 발생하지 않습니다 (무언가를하지 않는 한).하지만 공격자가 브라우저에서 응답을 소비하는 상황을 엔지니어가 처리 할 수있는 경우. 대부분의 브라우저는 HTTP Content-Type 헤더를 간과하고 실제 응답 내용을 볼 것이며, HTML처럼 보이는 모든 것을 보면 행복하게 처리 할 것입니다. 역사적으로 사람들이 다른 응답 형식 (XML, 이미지, 기타 응용 프로그램 내용) 내에 HTML / JS 내용을 포함시키는 수많은 공격이 있었으며 이는 브라우저에 의해 실행되었습니다.

따라서 문제는 응답의 형식이 아니라 요청을 생성하는 데 필요한 형식입니다. 공격자가 유효한 AMF 메시지가 포함 된 도메인 간 요청을 처리하는 것은 사소한 일이 아닙니다. XSS와 유사한 동작을 포함하는 XML 요청 / 응답에서도 비슷한 문제가 발생합니다. 브라우저에서 HTML로 취급하는 유효한 XML 응답을 만드는 것은 가능하지만 HTTP 본문 교차 도메인에서 원시 XML을 보내는 방법이 문제입니다. 이것은 표준 HTML 양식을 사용하여 수행 할 수 없으므로 공격자는이를 수행하기 위해 다른 클라이언트 기술 또는 브라우저를 찾아야합니다. 역사적으로 이러한 것들은 브라우저 / 플러그인 공급 업체에 의해 수정 될 때까지 여러 번 가능했습니다. 나는 그 순간에 그것을 허용할만한 것을 모르고있다.

간단히 말해서 이론적 인 공격입니다. 위험 프로필에 따라 서버 쪽 입력 유효성 검사를 사용하거나 서버에서 출력을 인코딩하고 클라이언트에서 다시 디코딩하여 모두 무시하거나 무시할 수 있습니다.

나는 Burp가 AMF 요청 형식을이 문제에 대한 완화책으로 표시하고 영향을 낮음으로 다운 그레이드해야한다고 생각합니다.이 문제가 해결 될 것입니다.

희망이 도움이됩니다.

건배 PortSwigger

--- 감사에 대한 자세한 정보 ---

portSwigger가 수행하는 작업은 바이너리 페이로드가 반드시 엉망이되는 것은 아니며, 요청을 처리하기 위해 처리기에 게시되는 실제 AMF 매개 변수가 엉망입니다. 예를 들어 여기 감사에서 발췌 한이며 요청에 AMF 응답의 일부를 보여줍니다 ...

HTTP/1.1 200 OK
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
P3P: CP="CAO PSA OUR"
Content-Type: application/x-amf
Vary: Accept-Encoding
Expires: Tue, 06 Apr 2010 18:02:10 GMT
Date: Tue, 06 Apr 2010 18:02:10 GMT
Connection: keep-alive
Content-Length: 2595

......../7/onStatus.......
.SIflex.messaging.messages.ErrorMessage.faultCode.faultString
.faultDetail.rootCause.extendedData.correlationId.clientId.destination
.messageId.timestamp.timeToLive    body.headers.#Server.Processing..kFailed 
to locate the requested type 
com.Analytics.ca.Services.XXX5c2ce<script>alert(1)</script>9ccff0bda62..
....I506E8A27-8CD0-598D-FF6E-D4490E3DA69F.Id95ab281-d83b-4beb-abff-c668b9fd42d5
..fluorine.I04165c8e-f878-447f-a19a-a08cbb7def2a.A.q[email protected]
.        DSId.Aeb5eeabcbc1d4d3284cbcc7924451711.../8/onRes
...[SNIP]...

거기에 "경고"스크립트를 적어 두십시오 ... 그들이 무엇을했는지는 호출 할 메소드를 포함하고있는 매개 변수 중 하나 인 JS에 동봉 된 일부 스크립트를 추가했습니다. 즉 'com.Analytics.ca.Services.XXX'입니다. 그렇게함으로써 JS는 오류 메시지로 되돌아 왔지만, JS가 실행하기에 가까운 곳에서 일어나야 할 많은 일들이있다. 기껏해야 간접적 인 위협으로 보입니다.

- 보안 감사인의 최신 관점 -

더 큰 팀과 논의한 결과 유효한 공격이라고 생각합니다. PortSwigger는 첫 단락에서 언급했듯이 이론적으로는 content-type을 x-amf로 설정했기 때문에 이론적으로는 브라우저에서 렌더링하지 않기를 바랄 것입니다. 대부분의 브라우저는이 요청을 무시하고 어쨌든 렌더링합니다. 나는 공급 업체가 컨텐츠 유형이 설정되었다는 사실에 크게 의존하고 있다고 생각합니다. IE와 Safari의 일부 버전과 같은 인기있는 브라우저는 이것을 무시합니다.

공격은 CSRF 또는 XSS 공격을 시작하는 다른 형태의 공격을 통해 쉽게 트리거 될 수 있습니다.


  1. Flash Player에서 JS를 해석 할 때 JavaScript 삽입이 될 수 없습니까? 우리가 네이티브 JS 또는 심지어 플레이어에서 json 지원을했다면 플래시 커뮤니티는 황홀 할 것입니다. actionscript에 대한 평가 기능이 하나도 없으며 javascript는 없습니다.

  2. 그들이 당신이 actionscript로 그것을 주입 할 수 있다는 것을 의미한다고 가정 해 봅시다. AMF 프로토콜은 코드를 전송하지 않으며 기본 형식 또는 일반 또는 형식이 지정된 개체 형태로 데이터 모델을 보냅니다. 일어날 수있는 최악의 경우는 모델을 분석하고 추가 데이터를 추가하는 것입니다. 데이터를 삽입 할 수 없지만 모든 데이터를 구문 분석하고, 새 데이터를 추가하고, 구문 분석하고, AMF 헤더를 유지해야하기 때문에이 작업은 놀랍도록 어려울 것입니다. AMF는 데이터 직렬화에 참조를 사용하기 때문에 중복 객체 유형을 사용하면 첫 번째 객체를 보았을 것입니다. 따라서 참조는 코드를 추가 할 기회가 거의 없으며 기존 매개 변수로만 값을 변경한다는 의미의 오프셋입니다.

  3. 원격 객체에는 데이터 유형을 확인하는 응답 핸들러가 있으며 이러한 데이터 유형을 UI 구성 요소 나 코드가 무엇이든간에 바인딩 할 것을 기대합니다. 이러한 데이터 유형이 잘못되면 오류가 발생합니다. AMF 응답 시퀀스 번호가 잘못되면 오류가 발생합니다. amf 데이터 그램에 완벽하게 형성되지 않은 것이 있으면 오류가 발생합니다.

  4. 원격 객체가 자동으로 다시 시도합니다. "삽입"코드가 오래 걸리는 경우, Flex는 메세지를 재발송 해, 길게 걸린 메세지를 무효화합니다.

그냥 내 두 센트. AMF 개발자로서 저는 디버깅과 테스트를 위해 amf 데이터 그램을 사용하는 것이 쉽다는 것을 자주 원했습니다. 불행히도 오류가 발생합니다.

웨이드 아놀드


AMF 응답 스트림에서 데이터를 변경하는 것이 가능한지는 모르겠지만 브라우저 및 / 또는 JavaScript와의 통신을 통해 엔드 포인트를 조작 할 수 없도록 할 수 있습니다. 악의적 인 데이터 삽입 섹션에서이 article 확인하십시오.


누군가이 "취약점"을 어떻게 활용할 수 있는지 설명 할 수는 없습니다.

그러나 직접 HTTP 대신 HTTPS 연결을 통해 데이터를 전달하여 문제를 만족스럽게 해결할 수 있습니까? 서버에 SSL 인증서가 설치되어 있고 HTTPS가 활성화되었다고 가정하면 Flex 응용 프로그램으로 컴파일하는 services-config.xml 파일의 사소한 변경 사항입니다.

Adobe의 동료 중 한 명이 더 많은 통찰력을 제공하기를 희망하면서 핑 (ping)했습니다.


당신은 여기에 자신의 질문에 대답 한 것 같습니다.

따라서 amf 함수 호출에 인수를 사용하고 반환 된 출력 어딘가에 입력 데이터를 포함하는 서버 측 구현이 있습니다.

페이로드가 브라우저에서 렌더링되고 amf 클라이언트에서는 렌더링되지 않도록하는 것이 이론적 인 공격이라는 점에 감사드립니다. 이 시나리오를 사용하려면 브라우저 / 플러그인의 다른 취약점이 필요할 수 있습니다. gateway.php 나 그와 비슷한 것을 통해 CSRF 게시글을 게시하면 브라우저가 html / js 형식으로 출력을 처리하는 한 남용하기가 쉽습니다.

그러나 호출자가 응답에 꺽쇠 괄호를 통과 할 수 있도록하려면 html로 인코딩하거나 제거해야하며이 공격 시나리오는 사라집니다.

이것은 흥미 롭습니다. 일반적으로 예상되는 데이터 소비자만을 대상으로 출력 인코딩을 수행하지만 일반적으로 브라우저가 특별한 경우가 될 수 있다는 점을 고려하면 흥미 롭습니다. 이것은 정말로 하나의 지옥 사건입니다.하지만 저는 신뢰할 수없는 입력을 위생적으로 만들고 암호화하는 습관을 갖기를 바랍니다.

이것은 여러 가지면에서 크로스 프로토콜 삽입을 사용하여 smtp와 같은 프로토콜의 리플렉션 기능을 악용하여 브라우저의 XSS를 악용하는 방식으로 생각 나게합니다. http://i8jesus.com/?p=75 참조하십시오.