webhacking/sql, sql injection

효율적인 블라인드 인젝션

qkqhxla1 2014. 8. 20. 15:39

일반적으로 블라인드 sql인젝션시 ascii(substr('문자열',1,1)) 이런식으로 값을 뽑아냅니다.

뽑아낼 문자열을 예를들어서 'zabcde'라고 하면 대부분 포문을 돌릴때 아스키코드값의 범위인

32~127이나 48~127사이로 포문을 돌리는데.. 

ascii(substr('zabcde',1,1))=32~127이라고 포문을 돌린다고 가정하면 첫번째 문자 z를 뽑아내려면

z의 아스키코드값인 122가 나올때까지 32~122까지 91번을 돌려야 값을 뽑아낼수 있습니다.

비밀번호에 영문자만 있는걸 알면 97~122사이로 돌릴텐데 그걸 모른다는게 문제이죠.

더군다나 다른 문자도 껴있다면 굳이 효율을 위해 97~122보다 시간이 조금 오래 걸리겠지만

32~127범위로 포문을 돌릴겁니다. 평균적으로 한 문자 돌리는데 최소 40번정도 이상은 쿼리를

보내야 한다는뜻이죠. 효율의 필요성을 느낀 뛰어난 해커분들이 효율적으로 값을 빼내는 방법을 

알아내었습니다.

lpad,bin함수를 써서 값을 뽑아내는거죠.

참고.

bin함수는 2진수로 변경.



lpad함수 : lpad(문자열, 맞출자리수, 채울문자)

lpad('aa',4,'?') 의 뜻은 첫번째 문자열 'aa'를 4자리로 길이를 맞추되, 모자라는 부분은 왼쪽에 ?를

채워서 자리를 맞춘다는 뜻입니다. 두번째 길이보다 첫번째 문자열이 더 길어질때는 문자열이

길이에 맞게 잘립니다.


1. 한글자를 뽑아내어 아스키코드값으로 만든다.

2. 아스키코드값을 2진수로 바꾸고 7자리로 자리를 맞춰준다.

3. 7자리로 맞춰진 2진수를 한자리씩 뽑아낸다.

2번에서 7자리로 자리를 맞춰주는건 아스키코드값이 127까지 있기 때문입니다.

127이면 2진수로 1111111 이죠?? 이 자리를 맞춰주기위해 7자리로 맞춰줍니다.

위의 과정대로 쿼리를 뽑아내면 어떤 수던 7번이면 값을 뽑아내는게 가능합니다.

ex) 'zabcde'라고 할 경우.(진한부분은 전 과정에서 쓰인 쿼리)

1번과정 : select ascii(substr('zabcde',1,1));

2번과정 : select lpad (bin( ascii(substr('zabcde',1,1)) ) ,7,0);

3번과정 : select substr( lpad (bin( ascii(substr('zabcde',1,1)) ) ,7,0) ,1,1);

첫번째 문자 z같은경우는 아스키코드값이 122, 2진수는 1111010 입니다.

1111010에서 첫번째 문자를 뽑으면 1, 두번째도 1, 5번째 문자는 0이 나오겠죠?

확인을 위해서...


2진수 7자리에서 하나하나 값을 뽑아내는거니 7번만 쿼리를 보내면 한 글자를 알아낼 수 있습니다.

몇십번씩 보내는것보다 매우 효과적이죠... 

'webhacking > sql, sql injection' 카테고리의 다른 글

rubiya.kr 1번.  (0) 2014.08.28
시간 기반 sql 인젝션.  (0) 2014.08.22
숫자 뽑아오기.  (0) 2014.08.19
webhacking.kr 7번 소스코드  (0) 2014.08.19
webhacking.kr 7번  (0) 2014.08.19