웹 보안

Blind SQL injection

JNU 2023. 2. 6. 22:51
반응형

이번 시간에는 Blind SQL injection에 대해서 배워보도록 할 거야
저번 시간에 SQL injection의 종류는 크게 두 가지로 나눠져 있다고 했지?
바로 Non blind injection과 Blind injection으로 나눠져 있는데 지난 시간까지는
Non blind injection을 통해서 직접적으로 query에 대한 응답을 확인해 가면서 injection을 수행했어

오늘은 지난 시간과는 다르게 Blind injection에 대해서 배워보고
어떻게 injection이 수행되는지 하나씩 실습해 보도록 할게 바로 go~ go~!



substring 활용


substring 함수를 통해서 입력한 JNU에 대해 구간을 정해서 문자를 출력하도록 하고 있어
substring ('JNU',1,3)의 결과를 보면 JNU,
substring ('JNU',2,3)의 결과를 보면 NU,
substring ('JNU',3,3)의 결과를 보면 U가 출력되는 것을 볼 수 있지?
즉, 전달 인자 뒤에 첫 번째 숫자는 입력한 글자의 시작을 지정해 주고
두 번째 숫자는 입력한 글자를 어디까지 출력해 줄지 지정해 주는 부분이라는 것을 알 수 있어
그러면, substring 함수를 활용해서 참, 거짓을 분별해 보도록 할게


substring('jinwoo',1,1) = 'a'라는 뜻은 jinwoo라는 글자의 첫 번째 글자 j의 값이
a라는 문자와 동일하니?라고 묻고 있는데 당연히 아니겠지?
마찬가지로 b도 동일한 결과로 0을 반환하고 있어

마지막으로 substring('jinwoo',1,1) = 'j'를 입력하니까 참이라는 결과인 1을 반환해주고 있지!
substring 함수를 통해서 입력한 data에 대한 값을 가지고 내가 찾고자 하는 값과 비교하여
참과 거짓을 1과 0으로 구분할 수 있는 걸 볼 수 있지?

음... 그렇다면 mysql에서는 문자를 어떻게 참과 거짓을 0,1로 값을 반환해 주는 근거는 무엇일까?
어떤 것을 기준으로 이러한 판단을 내리게 된 걸까?
바로 아스키 code를 기준으로 이러한 판단을 내리게 된 거야!


기본적으로 컴퓨터는 2진수로 이뤄져 있기 때문에 문자 또한 1과 0으로 만들어낸 값으로 해석하게 돼
해당 code 표는 16진수로 표현을 해주고 있으니 a와 j 값을 한 번 찾아보는 건 어떨까?
(a=0x61, j=0x6 A)

그렇다면 mysql database로 가서 data를 substring 함수를 통해서 추출해 보도록 할게
mysql database로 들어가 볼까?


우리가 test 할 database에 들어있는 metadata들이야!
여기서 substring을 통해서 각 field의 이름들을 하나씩 추출해 보도록 할게


현재 내가 만든 database table안에 값들을 알고 있는 상황에서 다음과 같이 data를 추출해 봤어!
그렇다면, 만약 공격자 입장에서 database table 안에 값들을 알지 못할 경우 어떻게 해야 할까?
아까 위에서 test 했던 것처럼
한 글자씩 or 한 단어씩 입력해서 내가 생각하고 있는 값과 동일한 값이 들어있는지 확인을 하면 가능하지 않을까..?



예를 들어 jinwoo라는 값을 알아내기 위해 첫 번째 글자인 j를 유추해보려고 한다면 어떻게 해야 할까?
select ascii(substring((select 이름 from info limit 0,1),1,1) =106;
혹은
select hex(ascii(substring((select 이름 from info limit 0,1),1,1)='6A';
와 같이 입력하면 'j'라는 단어에 대한 값을 hex 또는 ascii 값으로 유추해 낼 수 있겠지?
그리고 값을 하나씩 대입해 보면서 해당 값이 참인지 거짓인지 하나씩 하나씩 맞춰보다가
참이 될 경우 1을 반환하겠고, 거짓일 경우에는 0을 반환하게 되는 process를 이해하면 좋을 것 같아



이제 blind injection을 가지고 login창에 직접 injection을 수행해 볼 거야
현재 login 정보를 가져오는 DB와 연동한 취약한 web page의 code야
저번에 non-blind SQL injection 공격을 했을 때 'or '1=1 공격을 진행했던 취약한 web page code야



현재 사용하고 있는 DB의 이름을 sevas로 설정되어 있는 것을 보고
이를 활용해서 injection 공격을 해보도록 할 건데
위의 취약한 code를 보면 '$id' 값에 query문을 넣어 참으로 만들어주면 login이 가능하게 되는 구조인 것을 볼 수 있어
DB 이름의 첫 글자인 's'에 대해 query문을 보내 참으로 반환할 수 있도록 sql 구문을 만들어보도록 할게



s의 ascii 값을 hex code로 치환하면 73이라는 값이 나오기 때문에
해당 query문에 대하여 참인 것을 확인할 수 있어
이제 해당 query를 이제 login 창에 적용해 보면 어떨까?
' or hex(ascii(substring(database(),1,1)))=73#
다음과 같이 id 창에 해당 query문을 삽입하면 참으로 반환함과 동시에 login이 되는 것을 볼 수 있어
database() 함수를 통해서 sevas라는 DB의 이름을 추출하고 DB의 첫 글자인 s를 ascii code로 변환 후
이를 hex code로 치환하면 73이라는 값이 나오는데 이를 비교하여 참과 거짓을 반환하게 하는 query문이야





그렇다면 문득 이런 생각이 들 거야......
이렇게 하나하나씩 입력해서 injection을 하는 것보다 자동화해서 brute forcing을 해볼 수는 없을까?
맞아! 충분히 해볼 수 있어
kali linux에 들어가면 mysqlmap 명령을 통해서 sql의 값들을 injection 해보는 방식이 있는데..!
오늘은 여기서 끊어가도록 할게~
다음 시간에 이어서 보자
안뇨옹~

반응형