Blind SQL Injection : 참과 거짓으로 판단하기
1. Blind SQL Injection?
전 글에서 매우 기본적인 SQLi 에 대해서 잠깐 알아보고 왔다.
그러면 이번에는 SQLi의 한 종류인 Blind SQLi 에 대해서 알아 보도록 하자.
Blind SQLi 는 일반적인 SQLi와 비슷하다.
하지만 SQLi 는 한번에 값을 넣어서 결과를 도출해 내고자 하지만
Blind SQLi는 다르다. 참과 거짓으로 원하는 값을 얻어낸다.
그러면 가장 많이 쓰이는 두 종류의 Blind SQLi에 대해서 알아보도록 하자.
2. Content Based Blind SQL injection
우리가 아마도 가장 쉽게 많이 쓰지 않을까 생각한다.
뜻 그대로 콘텐츠를 기반으로 참과 거짓을 판단하는 SQLi이다.
아마 어느 워게임에 있던 문제를 예로 들어보자(정확히 어디였는지는.. 아마 이런 문제는 다 있을 것이다)
다음과 같은 쿼리를 가지고 있고 그 쿼리 리턴값을 다음과 같이 출력해 준다고 생각해보자
ⓐ Select id from db where id='$_GET[id]' and pw='$_GET[pw]';
ⓑ Hello {SQL return value : id}
그러면 저 쿼리를 조작해 보도록 하자
Select id from db where id='admin' and pw='' or '1';
이렇게 하면 어떤 id 값이 반환이 되고 Hello guest 같은 값이 화면에 출려될것이다.
하지만 지금 pw를 알아내야 하는 상황이라고 하고 단순히 참을 유도하는 것이 아니라
값을 하나하나 빼오도록 하자. 하나는 substr로 문자열을 잘라서 비교할 것이고 등호가 필터링 되었을 경우를 대비하여 like을 사용해 볼 것이며 <> 을 사용해 보도록 하겠다. (<>은 !=의 다른 표현이다.)
그러면 다음과 같은 코드가 가능하다.
Select id from db where id="admin" and pw='' or id=if(substr(pw,1,1) <> "a", "false","admin") or '0';
Select id from db where id="admin" and pw='' or id="admin" and pw like 'a%';
그러면 위의 조작된 쿼리에서 첫번째의 경우에는 pw의 첫번째 글자가 a 이면은 Hello admin 을 출력되게 할 것이고
두 번째 조작된 쿼리의 경우에는 a 로 시작하면 Hello admin을 출력하게 될것이다.
이런 식으로 참과 거짓을 판별하여 단순 SQLi의 브루트포싱보다 훨씬 적은 request로 값을 도출해 낼수 있다.
3. Time Based Blind SQL injection
아무런 출력도 없는 경우가 있을 수 있다.
그런 경우에는 이건 어떻게 참과 거짓을 알아 내야 하지 하고서 답답했었다.
이런 경우에는 sleep 함수를 이용해서 지연을 만들어 내고
그것에 의한 참과 거짓을 도출해 내면은 된다.
다음은 간단한 쿼리이다.
select id from where id="admin" and sleep(if(pw like "a%",3,0));
이 경우에는 만약 a로 pw가 시작한다면 3초의 지연이 생길 것이다.
리퀘스트 전의 시간과 후의 시간을 비교하여 3초 이상의 차가 생겼다면 참인 것으로 판단하면 된다.
4. 생각..
블라인드 인젝션은 어디서 참과 거짓을 얻어낼 수 있는지를 아는 것이 가장 중요한 듯하다.
만약 출력을 보여주지 않는다면 어떻게 출력을 하게 만들것인지. 어디가 허점인지를 아는 것.
이런 능력, 감을 기르기 위해서는 많은 경우를 접해 보거나 그냥 감이 오는 것 밖에는 없는 것 같기도 하다.
결국엔 노력과 공부이다!!
Note:
근데 Error Based Injection 도 블라인드 인젝션인가.. 아시는 분..?
그리고 substr 이 필터링 되어있어도 substring, right, left, mid 그리고 등등의 많은 것으로 대체가 가능하다. 나중에 한번쯤 정리해봐야겠다.
SQLi 의 종류 참고 : https://www.acunetix.com/websitesecurity/sql-injection2/
'Security > SQL Injection' 카테고리의 다른 글
[ 00 ] SQL Injection 기초 (0) | 2017.12.06 |
---|---|
[Memo] - MySQL 이 동일 취급하는 문자들 (0) | 2017.11.09 |