보안 전공생의 공부

Lord of SQL Injection#4 orc | Blind SQL Injection 본문

Wargame/web

Lord of SQL Injection#4 orc | Blind SQL Injection

수잉 2021. 1. 15. 11:05

◆ Blind SQL Injection

서버에서 내부 오류 메시지를 외부에 공개되지 않도록 구성한 경우

Type 변환 오류 메시지를 사용한 Database구조 파악이 불가능

substring(문자열, 시작위치, 길이) 문자열의 특정 문자열을 한 글자씩 찾아가는 Blind SQL Injection 공격 시도

Query 결과에 따른 서버의 참/거짓 반응을 통해 공격을 수행한다.

(Target 사이트에서 참/거짓을 구분지을 수 있는 페이지가 존재해야함)

이를 통해 db명, 테이블명, 컬럼명 ID, PW 등을 알아낼 수 있다.

(출처 : https://peemangit.tistory.com/151 )


id는 admin 이고 pw 파라미터 값을 입력받아야 한다.

그러나 db에 있는 pw에 대한 힌트는 아무것도 얻을 수 없다 ㅠ

우선 if문의 'Hello admin' 문구 출력으로 참/거짓을 유추할 수 있는지 확인해야한다.

주소 뒤에 ?pw='||1=1%23 을 입력하면

query문은

이와 같고,

1=1이 참이므로 query문이 참이 되어 Hello admin 문구가 출력된다.

주소 뒤에 ?pw='||1!=1%23 을 입력하면

query문은

이와 같고,

1!=1은 거짓이므로 query문은 거짓이 되어 문구가 출력되지 않는다.(앞의 id='admin' and pw='' 는 pw값이 없으므로 당연히 거짓 !)

이렇게 문구가 출력되는지 안되는지를 이용해 pw를 유추해나가야한다.

pw에 대해 알아야할점은 우선적으로 문자열의 길이이다 !

이는 length함수를 이용하면 된다.

?pw='|| id='admin' and length(pw)=1%23

1 자리에 2,3,4,… 를 바꿔 넣어보며 query문이 참이 되도록 만든다.

하다보면 길이가 8일 떄 문구가 출력되며 참임을 알 수 있다.

이때 id='admin'이라는 것도 함께 포함시켜야 되는 이유는 db 안에 admin 말고 다른 id들이 많기 때문이다.

pw의 길이가 8자리인 것을 알았으니,

이제 이 8글자가 무엇인지 차근차근 맞춰나가야 한다.

ascii함수와 substr함수를 이용해 첫 글자부터 유추해나가야 한다

ascii()는 괄호 안에 입력하는 문자나 문자열에 대해 그에 해당하는 아스키코드 값을 반환한다. (0~9 : 48 - 57, A~Z : 65 - 91 , a~z : 97 - 172 )

substr( string, start [], length )는 문자열 string에 대해 start위치에서부터 length만큼 문자를 추출한다. length 값이 주어지지 않으면 문자열의 끝까지 추출한다.

<첫번째 글자>

첫번째 글자부터 추정해나간다.

문자인지 숫자인지부터 찾아내보려고 한다

id='admin' and ascii(substr(pw,1,1)) < 65

참이므로 숫자임을 알 수 있다.

이제 어떤 숫자인지 맞춰나갈 것이다.

id='admin' and ascii(substr(pw,1,1)) < 57 (57은 9이다) 부터

id='admin' and ascii(substr(pw,1,1)) < 48 (48은 0이다) 까지 줄여나가며

도중에 거짓이 된다면 값을 찾아낼 수 있을 것이다.

ascii(substr(pw,1,1)) < 48 가 되면 거짓이 되므로

첫 번째 글자는 아스키코드 값이 48인 0임을 알 수 있다 !

이렇게 마지막 글자까지 찾아내면 된다.

<두번째 글자>

두 번째 글자도 숫자임

아스키코드 57 = 9

<세번째 글자>

아스키코드 53 = 5

<네번째 글자> 숫자 아니여서 당황쓰 .. 막막했던 심정 ㅋㅋㅋ ㅜ

아스키코드 97 = a

<다섯번째 글자>

아스키코드 57 = 9

<여섯번째 글자>

아스키코드 56 = 8

<일곱번째 글자>

아스키코드 53 = 5

<여덟번째 글자>

아스키코드 50 = 2

이렇게 해서 pw = 095a9852 임을 알아내었다 !!

이것을 입력하면

성공하였다 :)


사실 이번 문제는 정말 내 손으로 시작한 게 아무것도 없다 ㅠㅠ

구글링을 엄 ~~ 청 했다

다른 사람들은 단박에 Blind SQL Injection 으로 풀어야할 것을 판단하던데 신기하고 멋있었다.

나도 워게임 좀 꾸준히 해야되는 것을 몸소 깨달았다 !!

그리고 나처럼 노가다 안까고 바로 파이썬으로 쓩 푸는 사람들이 많았다 ..!

나도 다음에 파이썬 도전해보도록 ..

Comments