파일을 업로드 폼이 존재한다.
FLAG는 다른 테이블이 있다고 한다.
일단 아무파일이나 업로드해보자.
업로드 시간과,자신의 ip, 파일 이름이 테이블에 나타났다.
문제의 아이콘이 DB인 것을 보아 업로드한 filename이 DB에 저장되는 것 같다.
파일 업로드를 통해서 시도할만한 방법이 없어보여 burp suite를 실행해봤다.
form data로 name과 filename이 존재하는 것을 확인했다.
filename의 값이 DB로 전달되는 것 같다. 실제로 그런지 확인해보자.
filename을 test로 변경하고 전송해봤다.
맨 아래에 filename이 test로 바뀌었다.
filename에 담긴 값이 DB로 전달되는 것을 확인했다.
filename 파라미터에서 injection을 수행하면 될 것 같다.
filename은 insert문으로 삽입되는 것 같다.
예상 insert문은 다음과 같다.
INSERT INTO 테이블명 VALUES(time, ip, filename);
filename 파라미터에는 파일명만 들어있었으니까
INSERT INTO 테이블명 VALUES(time, ip, filename); 파라미터 값이 해당 부분에 삽입되는 것 같다.
실제로 그런지 확인해보자.
기존 데이터 뒤에 time, ip, filename순으로 새로운 데이터를 추가해서 확인해봤다.
음... column순서가 틀린모양이다.
이번엔 filename, time, ip 순으로 injection해봤다.
....이것도 아닌 모양이다.
아무래도 INSERT문 구조를 잘못 예상한 것 같다.
애초에 INSERT INTO 테이블명 VALUES(filename); 식으로 구성해놓고 명시하지 않은 값은 default로 채운게 아닐까...
위 구조를 기반으로 다시 injection을 시도했다.
..........!!! 드디어 됐다.
정확한 INSERT문의 구조는 모르겠지만, VALUES(filename)으로 삽입하고 명시되지 않은 값은 default로 초기화한 것 같다.
column의 순서는 filename, time, ip였다. (테이블에 나온 순서랑 다름...)
이제 flag를 찾아야 한다.
NOTICE에 flag는 다른 테이블에 있다고 한다.
일단 현재 DB name을 알아내자.
(select database()를 쓸 때 ()로 묶지 않으면 Upload error발생했음)
DB명은 chall29다.
이제 table명을 찾아보자.
information_schema는 MySQL 서버 내에 존재하는 DB의 메타 정보(테이블, 칼럼, 인덱스 등의 스키마 정보)를 모아둔 DB다.
information_schema.tables에는 MySQL에 존재하는 table에 대한 정보가 담겨 있다.
따라서 table의 schema가 chall29인걸 select하고,
group_concat으로 table_name을 묶으면 chall29에 있는 table name을 한 번에 찾을 수 있다.
flag가 있는 table명은 flag_congratz이다.
이제 flag_congratz에 column명을 알아내자.
이번엔 column명을 알아내야 하므로 information_schema.columns에서 select했다.
table_name이 flag_congratz인 것을 찾아 column명을 묶어 출력하면 된다.
flag_congratz에는 flag column 딱 하나만 존재하는 것을 확인했다.
Flag를 획득했다!
FLAG{didYouFeelConfused?_sorry:)}
old-29 해결!
'Study > Web Hacking' 카테고리의 다른 글
[dreamhack] http/https (0) | 2022.01.25 |
---|---|
[Webhacking.kr] old-40 (0) | 2021.11.11 |
[Webhacking.kr] old-55 (0) | 2021.11.05 |
[Webhacking.kr] old-34 (0) | 2021.11.05 |
[Webhacking.kr] old-53 (0) | 2021.10.09 |