Blind SQL Injection

이정민·2023년 12월 6일

웹 해킹 공부 정리

목록 보기
8/18

이번에는 Blind SQLI에 대해 알아보겠습니다.

Blind SQL Injection

select문에 대한 결과를 눈에 보이게 출력해주면 UNION SQLI, 에러 메시지를 출력해주는 경우에는 Error Based SQLI였습니다. Blind SQLI는 결과값을 출력해주지 않는 경우에 사용하는 SQLI입니다. 예를 들면 로그인 페이지, ID 중복검사 페이지 같은 경우에는 쿼리에 대한 결과값을 처리해주지 않습니다. 하지만 이런 경우에 참과 거짓값은 우리가 알 수 있죠. 예를 들면 ID 중복검사를 했을 경우에 a라는 아이디가 있으면 참, 없으면 거짓입니다. 이 부분에 SQL문을 끼워넣어서 이 SQL문이 맞아? 라고 물어보는 것입니다. 이번에 사용하는 함수는 substr([문자열],[시작 위치],[추출 개수])함수와 ascii([변환할 문자])함수입니다. substr()함수는 첫 인자에 적힌 문자열에서 문자를 추출하는 함수입니다. 예를 들면 첫 인자에 'abc'를 적었다고 하면 두 번째 인자는 시작 위치는 1이면 a부터, 2면 b부터 추출하는 것입니다. 이 두 번째 인자가 1이라고 가정했을 때, 세 번째 인자는 몇개를 추출할 지 물어보는 것으로 1이면 a부터 1개를 추출하니 결과는 a이고, 2인 경우에는 a부터 2개를 추출하니 ab가 결과값이 되는 것입니다. ascii()함수는 의미 그대로 문자를 ascii코드로 변환하는 함수로 여기서는 문자를 숫자로 변환해 비교식을 사용해서 참의 범위를 좁히고, 95~100 등 범위가 작게 좁혀졌을 때 찾는게 쉬워지기 때문에 사용됩니다. 이번에도 테스트 페이지를 이용해 실습해보겠습니다.

Blind SQL Injection 사용법

먼저 형태는 아이디가 normaltic이라고 가정하고, normaltic' and (SQL문) and '1'='1의 형태입니다. normaltic 뒤에 '를 붙이는 이유는 '개수를 맞춰서 SQL 쿼리를 사용하기 위해서고, 마찬가지로 뒤에 and 구문을 통해 '1'='1을 넣는 이유도 '를 맞춰주기 위해서입니다. 여기서 substr()함수와 ascii()함수를 추가한 format을 만들어보면 normaltic' and ascii(substr([SQL문],1,1)) and '1'='1 입니다. 여기에 추가로 여러 개 있을 경우는 limit문도 사용해야합니다.
먼저 Blind SQLI가 가능한지부터 알아보겠습니다.

and 구문을 사용했는데 문제 없이 값이 나옵니다. 또한 참일때는 '존재하는 아이디입니다.' 라는 구문을 보여주네요.

다음은 '1'='2 구문을 통해 거짓인 경우의 값을 출력했습니다. 거짓인 경우에는 '존재하지 않는아이디입니다.' 라는 구문이 나오는 것을 확인했습니다. 여기서 이제 flag를 찾아보겠습니다. 해당 SQLI는 반복을 자주 해야할 것 같으니 Burp Suite의 리피터를 사용하겠습니다.
먼저 DB이름을 찾아보겠습니다.

범위를 95~100 사이로 좁히고, 하나씩 늘리다보니 DB의 첫 글자가 98인 것을 찾았습니다. 98은 b네요. 이런식으로 하나씩 찾아보니 DB의 이름은 blindSqli입니다.

테이블은 limit문을 사용하지 않으면 에러가 나오는 것으로 보아 여러 개 존재하는듯 합니다. 테이블도 같은 방식으로 찾아보니, 테이블 이름은 flagTable입니다.
같은 방식으로 idx와 flag라는 칼럼을 찾았습니다.
찾아낸 테이블과 칼럼으로 select문을 이용해 flag를 한 글자씩 얻어내서 찾을 수 있었습니다.

profile
공부중

0개의 댓글