webhacking/sql, sql injection

mysql hex()함수에 관해서

qkqhxla1 2014. 9. 6. 14:55

블라인드 인젝션시 한글자씩 값을 뽑아와야되는데 ascii나 ord가 막혀서 hex로 값을 뽑아오는 


경우가 있다고 가정하자.


일단 프로그래밍으로 자동화하기에 앞서 mysql에서 구문이 제대로 동작하는지 확인해봐야 될 것이다.


mysql> select * from prob;

+-------+-------+

| id    | pw    |

+-------+-------+

| admin | 1234  |

| guest | guest |

| oop   | nop   |

+-------+-------+

3 rows in set (0.00 sec)


mysql>


요런 테이블이 있다고 가정하면 



연습으로 pw에서 제일 첫번째 글자를 뽑아와서 그것을 hex했을시 아스키코드값인 0x67(10진수 103)


이 나오는걸 확인할수 있다. 


그런데 단순히 이거만 확인하고 값을 뽑아온다고 가정하면, 뒤의 67부분만 32~128사이의 숫자를


16진수로 변환시킨 값을 반복문으로 돌리면 될것같다. http://syn3ck.tistory.com/10


여기에 적은것처럼 파이썬 리스트로 가정하면 a = ['{:x}'.format(i) for i in range(128)]


같이 만들어서 돌리면 0,1,2,3,4,5,6,7,8,9,a,b,c,d,.... 7d,7e,7f로 잘 들어가서 값이 잘 나올 것 같다.


그런데 문제가 있는데 hex함수의 결과값이 7f,6a처럼 십진수 숫자를 넘어가서 알파벳이 들어가게 되면


쿼리문에서 알수 없는 숫자,문자라고 에러가 뜬다. 즉 16진수로 바꿨을시 순수하게 숫자만으로 이루어졌으면


제대로 나오지만, 영문자가 포함되있으면 값이 나오지 않는다.


ex)



n의 아스키코드값은 110이고, 16진수로는 6e이므로 첫번째 글자를 뽑아왔을시 6e인것을 가져오라고 하면


id oop, pw nop이 나와야 되지만 에러가 떠서 안나온다.


아.... 별거 아닌 것 같지만 이거 잊어버리면 나중에 실수할것 같다. 비교할시에는 같이 hex함수를 써서


10진수숫자로 비교하면 문제없다.


mysql> select * from prob where hex(substr(pw,1,1))=hex(110);

+------+------+

| id   | pw   |

+------+------+

| oop  | nop  |

+------+------+

1 row in set (0.00 sec)


mysql>



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

rubiya.kr 19번 다른방법.(원래방법?)  (3) 2014.09.11
rubiya.kr 19번.  (0) 2014.09.10
rubiya.kr 15번.  (0) 2014.09.06
webhacking.kr 13번.  (2) 2014.09.04
rubiya.kr 20번.  (0) 2014.09.04