본문 바로가기
모의해킹

Normaltic님의 SQL Injection 2번 CTF 문제풀이

by 러브러브뿅뿅 2023. 12. 7.
728x90

이 블로그는 개인적인 공부 목적으로 정리한 내용입니다.

설명에 틀린 부분이 있을 수 있으며 잘못된 부분에 대한 지적은 언제나 환영입니다.


저번 포스팅에 이어 이번에는 SQL Injection 2번 한번 풀어보도록 할께요!

1번 포스팅은 아래 링크 걸어두겠습니다.

2023.12.06 - [모의해킹] - Normaltic님의 SQL Injection 1번 CTF 문제풀이

 

Normaltic님의 SQL Injection 1번 CTF 문제풀이

이 블로그는 개인적인 공부 목적으로 정리한 내용입니다. 설명에 틀린 부분이 있을 수 있으며 잘못된 부분에 대한 지적은 언제나 환영입니다. 저번 포스팅에서는 SQL Injection의 기본 원리와 공격

teng2.tistory.com

SQL Injection 2번 진짜! 데이터를 찾아랏!

 

SQL Injection CTF 2번

이번에는 비어있습니다. 저기 적힌대로 normaltic을 검색해보도록 하겠습니다.

 

 

오 이렇게 데이터가 출력되네요 그럼 SQLi 7단계 프로세스를 적용해서 문제한번 풀어보도록 할께요.

저번 1번문제 풀이와 UNION SQL Injection 글에서 방법은 자세히 다뤘으니

이번에는 자세한 설명은 생략하고 문제 풀이만 해보도록 하겠습니다.

UNION SQL Injection에 관한 글은 아래 링크 걸어두겠습니다.

2023.12.03 - [모의해킹] - 데이터 추출! UNION SQL Injection 공격

 

데이터 추출! UNION SQL Injection 공격

이 블로그는 개인적인 공부 목적으로 정리한 내용입니다. 설명에 틀린 부분이 있을 수 있으며 잘못된 부분에 대한 지적은 언제나 환영입니다. 저번 포스팅에서는 SQL Injection 원리에 대해서 알아

teng2.tistory.com

1. SQLi 포인트 찾기

SQLi 공격이 가능한지 확인하기 위해서 normaltic' and '1' = '1' # 을 넣어볼께요

 

 

어 결과가 쫌 특이합니다. ID에 제가 입력한 부분 그대로 출력됩니다.

아마 입력받은 변수를 그대로 출력하게끔 코딩이 되어있는게 아닐가 조심스럽게 예상해봅니다.

그래도 다행히 다른 데이터는 normaltic의 데이터가 정상적으로 출력이 되는거같습니다.

 

2. column 개수 찾기

column 개수를 찾기위해서 order by를 이용해 볼꺼에요

normaltic' order by 1 # 부터 쭉 입력해본 결과 7에서 데이터가 출력되지 않았습니다.

그 말은 화면에 표시되있는 column은 4개이지만 실제 column의 개수는 총 6개인걸 알 수 있습니다.

 

3. 출력되는 column 위치 확인

화면에 표시되는 column이 4개니깐 몇번째 column이 화면에 표시되는지

UNION SELECT를 이용해서 확인해보도록 하겠습니다.

 

 

충격적인 결과가 나왔습니다. 만능인줄 알았던 union select을 사용했는데 1,2,3,4,5,6이 표시되지 않습니다.

어떻게 된걸까요? 우선 여기서 제가 생각해 볼 수 있는 경우는 두가지가 있었습니다.

1. SQL Injection이 안먹히는 경우

2. 코딩과정에서 DB에서 조회된 데이터 중 맨 윗줄 데이터만 출력되는 경우

 

제가 모의해킹에 대해 아직 많이 배우는 중이지만 적어도 제가 지금까지 배운걸로 생각해보면

1번의 경우 에러가 나오거나 데이터가 출력되지 않아야 정상입니다.

하지만 데이터가 출력이 됐기때문에 1번은 아니라고 생각이 들었습니다.

 

그럼 2번인데 개발을 할때 조회된 데이터의 맨 윗줄만 출력할 수 있게 만들어졌구나 하고 

예측해 볼 수 있습니다.

 

그렇다면 사실 저 밑에는 1,2,3,4,5,6이 출력되어 있는데 안보이는게 된다는 말이겠죠? 

그럼 맨 밑에줄을 위로 올려야하는데 그러기 위해서는 어떤 SQL 명령어가 있을까요?

저희가 column 개수를 찾을때 상요했던 order by가 있습니다.

 

order by사실 데이터를 오름차순 또는 내림차순으로 정렬해주는 명령어입니다.

order by 1 이렇게 쓰면 첫번째 column을 기준으로 오름차순으로 정렬됩니다.(디폴트가 오름차순입니다.)

normaltic' UNION SELECT 1,2,3,4,5,6 ORDER BY 1 #

 

오름차순으로 하면 영어보다 숫자가 먼저니깐 위처럼 1부터 6까지 순서대로 order by를 이용해서 정렬해 보겠습니다.

 

 

정확히 이유는 모르겠지만 order by 2 그러니깐 2번 column부터는 저렇게 Info에 숫자가 6이라고 뜹니다.

아마 예상해보면 ID는 입력된 변수를 그대로 출력해주는거 같고

Level과 Rank Point는 안보이게 처리되어있어서 안보이는거 같습니다.

어쨋든 확실한건 Info는 확실히 UNION SELECT으로 조회한 데이터가 보인다는 겁니다.

그럼 다음부터 데이터를 조회해야할때 6번자리에 입력하면 되겠죠?

 

4. DB이름 알아내기

 

이렇게 6번 column 자리에 database()를 넣어주고 order by로 오름차순으로 정렬되게 해주면

DB 이름을 알아낼 수 있습니다.

 

5. table이름 알아내기

방금 알아낸 DB이름을 통해서 Information_schema.tables에 있는 테이블 이름을 알아보겠습니다.

똑같이 order by를 써도 되지만 여러개의 테이블이 있을 수 있기때문에 limit를 써보겠습니다.

limit 0,1 이렇게 쓰면 첫번째 행부터 1개만 출력해줍니다. 

 

 

그래서 0,1 부터 쭉 써내려가니 game_user라는 테이블과 flag에 관련있어 보이는 두가지 flag가 존재했습니다.

game_user는 flag와 관련 없어보이니 나머지 두개부터 들어가 보도록 하겠습니다.

 

6. column 이름 알아내기

첫번째와 두번째 테이블에 있는 column을 information_schema.columns에서 찾아보도록 하겠습니다.

column명 알아내는 과정은 생략하겠습니다

 

두 테이블 다 같은 이름의 column이 있었습니다.

이제 두 테이블 모두 데이터를 추출해보겠습니다.

 

7. 데이터 추출

 

 

첫 번째 테이블에 들어가보니 Not Here 여기가 아니라고 합니다...

뭔가 놀림당한 기분입니다.

 

두 번째 테이블에도 NONONO 이렇게 적혀있네요 

다른 행에 있을 수도 있으니 계속 찾아보겠습니다.

 

드디어 flag를 찾았습니다!

 


이번 문제는 저번문제랑 다르게 살짝 응용하는 문제였던거 같습니다.

문제를 풀다가 막혔을때 왜안되지? 그럼 이페이지는 어떻게 만들어져있어서 이런결과나 나오지?

하고 생각하다보면 하나씩 문제가 풀려가는거 같네요!

728x90