상세 컨텐츠

본문 제목

Segfault CTF - (8주 차) SQL Injection Point 3

컴퓨터/보안 - CTF문제

by 디멘터 2024. 6. 12. 17:17

본문

※ 주의 : 보안 관련 학습은 자유이지만, 학습 내용을 사용한 경우 법적 책임은 행위자에게 있습니다.
(Note: Security-related learning is allowed, but the individual is solely responsible for any legal consequences arising from the use of the acquired knowledge.)


※ CTF - Capture The Flag
※ 문제 푸는 방법이 다양할 수도 있습니다.


SegFault CTF - SQL Injection Point 3

1. 목표 : flag를 찾으세요!

2. 실행

→ BurpSutie로 살펴본 결과 // [ Segfault CTF - (8주 차) SQL Injection Point 1 ] 참조

  • ① 쿠키에 SQLi Point 쿠키에 id가 없었다.
  • ② 검색 기능에 option_val 파라미터 SQLi Point
  • ③ 게시글 id URL파라미터에 SQLi Point
  • ④ 검색 기능 중 Sort 부분 SQLi point

3군데 SQLi point가 있었다.
→ 이 중 ②, ③은 SQL Injection 1에서 다루었고, [링크]
→ 새로운 ④ Sort부분을 살펴보겠다.

게시글을 검색해보니 sort가 생겼다.

 
→ SORT인 것을 보아서 ORDER BY 절로 추측할 수 있다.
→ ORDER BY 뒤에 숫자를 직접 1,2 쓰는 것은 가능하지만,
CASE WHEN (조건) THEN 1 ELSE 2 END처럼 쓰면 생각대로 되지 않을 것이다.
조건식의 결과에 따라 1, 2가 다르게 반환되어도 ORDER BY의 결과는 같다.(!)
→ 이를 해결하려면 아래와 같이 컬러명을 직접 써야 한다.

→ CASE WHEN (조건) THEN title ELSE username END
 
→ 공격 포맷을 설정한다.
→ CASE WHEN (SQL 구문) THEN title ELSE username END
→ 구문의 결과가 참이면 title기준으로 SORT 될 것이고, 거짓이면 username 기준으로 SORT될 것이다.
 
→ CASE WHEN (database()='sqli_8') THEN title ELSE username END 

DB이름이 sqli_8일 것 같아서 넣어보니 참으로 title 기준으로 sort되었다.

 
→ database()='sqli_8'을 넣어보니 참으로, title기준으로 sort되었다.
→ DB이름은 sqli_8이 확인되었다.
→ 다만, 이렇게 비교할 경우 대, 소문자를 구분하지 않아서 대문자가 끼어있을 수도 있다.
 
→ false의 경우도 확인해봐야 하니 거짓 값을 넣어보았다.
CASE WHEN (database()='sqli_81111') THEN title ELSE username END 

거짓을 유도해서 username 기준으로 sort하게 유도했다. username이 하나 밖에 없어서 시간 순으로 정렬이 되었다.

 
→ title 기준이 아닌 username기준으로 정렬된 것 같다.(시간 순서대로 작성 한 그대로 나왔다)
 
Segfault CTF - (8주 차) SQL Injection Point 1에서 했던 방법으로
→ Table, Column, 값을 알아내면 될 것이다. 
 
→ 아래는 결과이다.
→ 테이블 이름 board, flag_Table, member
→ flag_Table의 컬럼 이름 idx, flagData
→ flagData의 값 wjejjfji, segfault{플래그}

관련글 더보기