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에서의 특별한 문자들.(아스키값 같은거인듯.)
'나 "의 갯수에 따라서 다르게 출력될 수 있음.
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)
'webhacking > sql, sql injection' 카테고리의 다른 글
mysql 레퍼런스 12.1 Function and Operator Reference (0) | 2015.07.09 |
---|---|
시간 기반 sqli 인젝션2 (0) | 2015.07.08 |
WeChall The Guestbook, Blinded by the light, Addslashes (0) | 2015.07.06 |
securitytraps.pl Language, adm1nkyj님의 새 워게임 3. (0) | 2015.07.05 |
chall.tasteless.eu Unsolvable, Never Trust The Obvious (0) | 2015.07.04 |