webhacking/sql, sql injection

새롭게 찾아낸 유용한 함수.

qkqhxla1 2015. 2. 8. 12:42

rubiya.kr 19번을 풀때 도움을 받았던 http://randa.tistory.com/category/MySQL/MySQL%20Syntex


에서 개인적으로 쓸모있는 함수가 몇개 더 있을거라 생각했었는데 잊고있었다가 지금 삽질해보니 더 발견!!



1. interval함수



5. INTERVAL(N,N1,N2,N3,...)

INTERVAL은 값 N과 그 뒤의 값을 비교하여 결과를 리턴한다. 최소 1개 이상의 N(num) 값이 있어야 한다.


 * N < N1 일 경우 뒤 N과 관계없이 무조건 0을 리턴한다.

 * N1 < N2 < N3 ... 와 같이 N(num)은 뒤로갈 수록 값이 커야 한다. 내부적으로 Binary 형태로 결과를 구하기 때문이 고 만약 

   그렇지 않을 경우 원하는 결과가 나오지 않을 수 있다.

 * N이 NULL 일 경우는 -1을 리턴한다.

 * N > N(num)이 될때까지의 N(num)에 대한 개수를 구한다. 왼쪽부터 읽는다.


1
2
3
4
5
SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200);
SELECT INTERVAL(10, 1, 10, 100, 1000);
SELECT INTERVAL(22, 23, 30, 44, 200);
SELECT INTERVAL(NULL, 3, 5, 7, 9);
SELECT INTERVAL(100, 1, 10, 100, 10, 1000, 10);

1line - N(23)보다 큰 N(num)은 30이다. 그럼 그 사이의 1, 15, 17의 개수 3. 따라서 3을 리턴한다.

2line - N(10)보다 큰 N(num)은 100이다. INTERVAL에서 >= 는 조건에 포함되지 않는다. 따라서 1, 10 2개. 2를 리턴한다.

3line - N(22) < N1(23)이다. 따라서 0을 리턴한다.

4line - N이 NULL값이기 때문에 -1을 리턴한다.

5line - N(100)보다 큰 N(num)은 1, 10, 100, 10 이 있다. N < N(num)이 만족한 1000에서 종료되기 때문에 뒤에 10은 무시된다. 

          따라서 4를 리턴한다.



interval함수는 첫번째 인자가 null이면 뒤의 인자를 실행을 하지 않고 -1을 리턴한다.

mysql> select interval(null,(select 1 union select 2));

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

| interval(null,(select 1 union select 2))                     |

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

|                                       -1                      |

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

1 row in set (0.00 sec)


이 성질을 이용해서 if문 대신 쓸수있다!!!


mysql> select * from web01;

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

| id              | pw                      | msg   | sadmin    |

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

| 127.0.0.1     | dptmdhkdldps3ck      | hi      |      1     |

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

1 row in set (0.00 sec)


요러한 테이블이 있다고 하면 pw를 뽑아온다고 가정하자.



첫번째 글자가 틀렸을시 or null로 가게되어 첫번째인자가 null이 되므로 두번째 에러가 발생하는 쿼리를 실행하지 않는다.


그러나 첫번째글자가 맞았을경우 or null로 가지 않게 되고, 두번째의 에러가 나는 쿼리를 실행하게 되어 에러가 발생한다.




2. greatest함수.



3. GREATEST(value1,value2 ...)

GREATEST는 범위안에 값 중 가장 큰 인수를 리턴한다.

1
2
3
4
SELECT GREATEST(2,0);
SELECT GREATEST(34.0,3,5.0,767.99);
SELECT GREATEST('B','A','C');
SELECT GREATEST(NULL,'B','C');

1line - 2, 0중 가장 큰 수인 2를 리턴한다.

2line - 가장 큰 수치인 767.99를 리턴한다.

3line - a, b, c중 가장 뒤인 c를 리턴한다.

4line - 값 중 NULL이 포함될 경우 NULL을 리턴한다.



이것도 null이 포함된 경우 뒷부분을 검사하지 않는다. 



웹해킹 공부좀 하신 분이면 사진 한장으로 설명이 가능하다....




3. least함수.


greatest함수와 똑같다. if대용으로 쓸수있음.






4. in()의 재발견.


이건 좀 신기했는데 in함수라고 하면 대부분 =,like,regexp등이 막혔을때의 용도로 쓰는데


in도 if문대신 쓰는게 가능하다 (대박)


사진 한장으로 설명이 가능하다. 맞을경우 제대로 출력, 아닐경우 에러발생하는 쿼리 실행.