CTF/웹해킹

[SHELLCTF] Extractor - 웹해킹 / SQL Injection

SecurityMan 2022. 9. 13. 11:00

 

SQL Injection과 관련된 문제

 

문제 설명이 되게 재미있다.

 

반응형

 

적들이 핵무기를 사용하려고해서, 방어시스템을 활성화 시키려고 하는데

 

유일하게 방어시스템 비밀번호를 알고있는 사람이 죽어버려서 로그인을 못한다고 한다.

 

웹페이지를 통해 비밀번호를 알아내서 자기들을 도와달라고 한다.

 

간단한 문제지만 이런 상황제시가 되게 몰입하게 해주는것 같다.

 

 

문제페이지에 들어가면 이런 화면이 나온다.

 

아무것도 없이 그냥 그림만 보이는 페이지이고,

 

맨 위에 메뉴를 보면 Register, logion 두 개의 버튼이 있다.

 

 

먼저 Register 페이지에 들어가봤다.

 

Username, Password, Signature 세 가지를 입력하는 칸이 있다.

 

각각 test1, test2, test3 이라고 입력한 뒤

 

계정을 하나 생성해봤다.

 

 

그리고나서 Login 페이지에서 로그인을 하면

 

이렇게 입력했던 정보들이 보이게 된다.

 

URL을 보면

 

username, pass, content 변수에 각각

 

Username, Password, Signature 값을 담고 있는것이 보인다.

 

 

username인 test1 뒤에 작은따옴표( ' ) 를 하나 찍어보았다.

 ※  ' 는 URL 인코딩하면 %27 이 된다.

 

그랬더니 아래쪽에 syntax errer 라는 메세지가 뜨는데

 

이렇게 작은따옴표를 입력했을 때

 

systax errer (구문 오류) 가 난다면 SQL Injection 취약점이 존재하는 것이다.

 

 

이번엔 username 에 test1' or 1=1 -- - 라고 입력해봤다.

 

그럼 이렇게 user 라는 사용자의 정보가 나오게 되는데

 

이렇게 나오는 이유는 

 

입력된 ' or 1=1 -- - 가

 

SELECT * FROM users WHERE username = ' ' or 1=1-- - '  AND password = '~~~~' ~~~~ 

 

쿼리에 이런식으로 들어가서

 

WHERE 절이 항상 참이되고,

 

-- - 뒤에는 모두 주석처리 되어 없어져

 

SELECT * FROM users; 와 동일한 결과가 출력되기 때문이다.

 

 

몇번의 시도끝에 해당 서버에서 SQLite 를 사용한다는것을 알아냈다.

 

보통은 DBMS에 있는 테이블명이나 컬럼명을 알아낼 때 information_schema 라는것을 이용하는데

 

이번에 시도해봤을때는 별다른 결과가 안나와서 SQLite 로 가정하고 시도해봤더니 성공했다.

 

username=test1' union select 1,2,3,sql from sqlite_master -- - 라고 입력하면 된다.

 

만약 다른 DBMS를 사용했다면

 

username=test1' union select 1,2,3,table_name from information_schema.table -- - 와 같이 사용하면 된다.

 

union 과 sqlite_master를 이용해 쿼리를 날려보면

 

Admins 라는 이름의 테이블이 있고,

 

Admins 테이블은 id, user, pass, content 컬럼으로 이루어졌다는것을 알 수 있다.

 

 

테이블과 컬럼 이름을 알았으니 그대로 사용해주면 된다.

 

username=test1' union select 1,2,3,contents from Admins -- - 라고 입력해주면

 

숨겨져있던 플래그를 확인할 수 있다.

반응형