webhacking/sql, sql injection

mysql의 이상한 형변환과 컬럼 갯수.

qkqhxla1 2015. 2. 11. 16:31

http://rubiya-kr.tumblr.com/ rubiya님의 옮긴 블로그에서 언젠가 나중에 유용하게 쓸것 같아서 가져왔다.

컬럼 갯수를 알아내는 방법인데 

1234
select(select*from mysql.user)=1
select(select*from mysql.user)in(1)
#1241 - Operand should contain 42 column(s)
view rawcountByError.sql hosted with ❤ by GitHub


이런 식으로 컬럼 갯수를 알아낼 수 있다고 한다. mysql.user대신 알아내고 싶은 테이블명을 넣으면 된다.

그리고 형변환에 대한 것인데......(지인에게서 들은 정보) 난 여태까지 문자열은 정수 0과 같다고 생각하고있었다.


mysql> select 'abc'=0;

+---------+

| 'abc'=0 |

+---------+

|       1 |

+---------+

1 row in set, 1 warning (0.00 sec)


mysql> select 'abcsadfwe'=0;

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

| 'abcsadfwe'=0 |

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

|             1 |

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

1 row in set, 1 warning (0.00 sec)


mysql> select 'hi there'=0;

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

| 'hi there'=0 |

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

|            1 |

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

1 row in set, 1 warning (0.00 sec)



그런데 그게 또 아니었다. ''로 둘러쌓여진 문자열에서 내부의 문자 앞쪽에 숫자가 있으면 그 숫자로 정수변환된다. 무슨 소리인지 예시를 들어보자면.

mysql> select '123a'=123;

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

| '123a'=123 |

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

|          1 |

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

1 row in set, 1 warning (0.00 sec)


mysql> select '45abcw'=45;

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

| '45abcw'=45 |

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

|           1 |

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

1 row in set, 1 warning (0.00 sec)

이렇게 문자가 나오기 전의 정수만 정수로 형변환이 된다. '123a456' 같은 문자열은 123과 456사이에 a라는 문자열이 하나 있으므로 왼쪽의 123만 정수로 형변환이 된다. 




정말 php만큼 더러운 형변환이다........