webhacking/sql, sql injection

mysql 레퍼런스 9. Language Structure

qkqhxla1 2015. 7. 8. 16:13

https://dev.mysql.com/doc/refman/5.7/en/index.html 의.

9. Language Structure 부분 연구. 버전은 가장 최신의 5.7을 볼 예정.

필요한부분은 차차 추가해나갈 예정.


9.1 Literal Values


9.1.1 String Literals

https://dev.mysql.com/doc/refman/5.7/en/string-literals.html


문자열은'나 "로 둘러쌓인것.

SELECT _latin1'string'; 처럼 character set을 설정해서 출력할수 있음.

SELECT N'some text'; or SELECT n'some text'; or SELECT _utf8'some text'; etc..


mysql에서의 특별한 문자들.(아스키값 같은거인듯.)

Escape SequenceCharacter Represented by Sequence
\0An ASCII NUL (0x00) character.
\'A single quote (') character.
\"A double quote (") character.
\bA backspace character.
\nA newline (linefeed) character.
\rA carriage return character.
\tA tab character.
\ZASCII 26 (Control+Z). See note following the table.
\\A backslash (\) character.
\%% character. See note following the table.
\__ character. See note following the table.

'나 "의 갯수에 따라서 다르게 출력될 수 있음.

mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';

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

| hello     |      "hello" |       ""hello"" |      hel'lo |     'hello |

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

여기서의 특이한건 'hel''lo';를 출력했을때. 중간에 ''가 있는데 '하나로 출력.


mysql> SELECT 'disappearing\ backslash';

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

|         disappearing backslash |

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

이렇게 \가 그냥 사라지는 경우도 있음.


9.1.2 Number Literals.

그냥 숫자, 함축된 소수 e가 있음.

mysql> select .1;

+-----+

| .1  |

+-----+

| 0.1 |

+-----+

1 row in set (0.00 sec)


mysql> select 1.2e3;

+-------+

| 1.2e3 |

+-------+

|  1200 |

+-------+

1 row in set (0.00 sec)


9.1.3 Date and Time Literals

Date format에서 구분자는 별로 상관없다. '2012-12-31', '2012/12/31', '2012^12^31', '2012@12@31'

는 모두 동일하다.


9.1.4 Hexadecimal Literals

x를 앞에 붙이면 16진수 아스키코드로 해석한다. 맨 아래의 0x같은건 해킹에서 자주 쓰임. 첫번째도 쓸 날이 있을듯.

mysql> SELECT X'4D7953514C';

        -> 'MySQL'

mysql> SELECT 0x0a+0;

        -> 10

mysql> SELECT 0x5061756c;

        -> 'Paul'


cast함수로 데이터형을 변환할수 있다.

mysql> SELECT 0x41, CAST(0x41 AS UNSIGNED);

        -> 'A', 65


hex함수로 hex값으로 변화시킬수 있다.

mysql> SELECT HEX('cat');

        -> '636174'


9.1.5 Boolean Literals

boolean은 true와 false가 있으며 대소문자 구별을 하지 않는다. 그리고 true==1, false==0과 같다.


9.1.6 Bit-Field Literals

mysql> CREATE TABLE t (b BIT(8));
mysql> INSERT INTO t SET b = b'11111111';
mysql> INSERT INTO t SET b = b'1010';
mysql> INSERT INTO t SET b = b'0101';
mysql> SELECT b+0, BIN(b+0), OCT(b+0), HEX(b+0) FROM t;
+------+----------+----------+----------+
| b+0  | BIN(b+0) | OCT(b+0) | HEX(b+0) |
+------+----------+----------+----------+
|  255 | 11111111 | 377      | FF       |
|   10 | 1010     | 12       | A        |
|    5 | 101      | 5        | 5        |
+------+----------+----------+----------+


처럼 변환이 가능하다.(별거없음.) 또 묵시적인 형변환이 있다.

mysql> SET @v1 = 0b1000001;

Query OK, 0 rows affected (0.00 sec)


mysql> SET @v2 = 0b1000001+0;

Query OK, 0 rows affected (0.00 sec)


mysql> select @v1, @v2;

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

| @v1    | @v2   |

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

| A       |   65    |

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


9.1.7 NULL Values

널은 데이터가 없다는뜻. \0와 null은 좀 다른것같다. 연구 필요. 


9.2 Schema Object Names

종종 테이블이나 컬럼에 `로 감싸는걸 많이 봐왔는데 그것은 id quote character이라서 그렇다고 함. ``도 두개쓰면 알아서 하나로 인식. 

mysql> CREATE TABLE `a``b` (`c"d` INT);

Query OK, 0 rows affected (0.01 sec)


mysql> desc `a``b`;

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

| Field     |    Type    |     Null |   Key |     Default |     Extra |

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

| c"d      | int(11)      |   YES  |        |    NULL    |           |

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

1 row in set (0.01 sec)


나머지는 별거 없음.


9.3 Keywords and Reserved Words

함수와 같은 키워드로 테이블을 만들 수 없지만 ``로 감싸면 가능하다.

ex) CREATE TABLE `interval` (begin INT, end INT);


9.4 User-Defined Variables

유저가 만든 변수는 @가 앞에 붙는다. 변수에 .이나 _나 $가 붙을 수도 있다. 할당은 =나 :=으로 가능하다.

:=는 오른쪽 결과를 왼쪽에 대입할때 쓰이는거같다. 

mysql> SET @t1=1, @t2=2, @t3:=4;

Query OK, 0 rows affected (0.00 sec)


mysql> SELECT @t1, @t2, @t3, @t4 = @t1+@t2+@t3;

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

| @t1  | @t2  | @t3  | @t4 = @t1+@t2+@t3 |

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

|    1 |    2 |    4 |              NULL |

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

1 row in set (0.00 sec)


mysql> SELECT @t1, @t2, @t3, @t4 := @t1+@t2+@t3;

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

| @t1  | @t2  | @t3  | @t4 := @t1+@t2+@t3 |

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

|    1 |    2 |    4 |                  7 |

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

1 row in set (0.00 sec)


변수로 쿼리문을 실행시킬 때의 예.

mysql> SET @c = "c1";
Query OK, 0 rows affected (0.00 sec)

mysql> SET @s = CONCAT("SELECT ", @c, " FROM t");
Query OK, 0 rows affected (0.00 sec)

mysql> PREPARE stmt FROM @s;
Query OK, 0 rows affected (0.04 sec)
Statement prepared

mysql> EXECUTE stmt;
+----+
| c1 |
+----+
|  0 |
+----+
|  1 |
+----+
2 rows in set (0.00 sec)


concat으로 잘 연결해야 한다. 그냥 select @c from t;처럼 하면 안됨.


9.6 Comment Syntax

주석에는 #나 -- 이 있다. 하지만 sqli를 하면서 알다싶이 ;%00처럼 널바이트나 `이 종종 사용 가능함.

다중주석은 /**/를 이용한다. /**/내부에 데이터를 넣어서 실행이 가능하다.

mysql> select /*!1234*/;

+------+

| 1234 |

+------+

| 1234 |

+------+

1 row in set (0.00 sec)