SQL注入基础知识(1)
目录
1. MySQL基础语法
Show databases; 显示所有数据库
Show tables; 显示所有表信息
Select user(); 查询用户信息
Select database(); 查询数据库名称
Select version(); 查询数据库版本
Select @@basedir; 查询数据库基本路径
select
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[OFFSET M ][LIMIT N]
-
查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
-
SELECT 命令可以读取一条或者多条记录。
-
可以使用 WHERE 语句来包含任何条件。
-
可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。
-
可以使用 LIMIT 属性来设定返回的记录数。
例如:查询sqli-labs中的security数据库的users表
mysql> select * from security.users;
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 1 | Dumb | Dumb |
| 2 | Angelina | I-kill-you |
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
| 5 | stupid | stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
| 8 | admin | admin |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 | dhakkan | dumbo |
| 14 | admin4 | admin4 |
+----+----------+------------+
13 rows in set (0.00 sec)
where
SELECT field1, field2,...fieldN FROM table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....
-
查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
-
你可以在WHERE子句中指定任何条件。
-
你可以使用AND或者OR指定一个或多个条件。
-
WHERE子句也可以运用于SQL的 DELETE 或者 UPDATE 命令。
-
WHERE 子句类似于程序语言中的if条件,根据 MySQL 表中的字段值来读取指定的数据。
-
操作符也可以使用在where语句中。
操作符 | 描述 |
---|---|
= | 等号,检测两个值是否相等,如果相等返回true |
<> 或 != | 不等于,检测两个值是否相等,如果不相等返回true |
> | 大于号,检测左边的值是否大于右边的值, 如果左边的值大于右边的值返回true |
< | 大于等于号,检测左边的值是否大于或等于右边的值, 如果左边的值大于或等于右边的值返回true |
<= | 小于等于号,检测左边的值是否小于于或等于右边的值, 如果左边的值小于或等于右边的值返回true |
例如:
mysql> select * from users where username='Dumb';
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | Dumb | Dumb |
+----+----------+----------+
1 row in set (0.00 sec)
注释
方法1:使用 #
mysql> #select * from security.users;
方法2:使用 /**/
mysql> /*select * from security.users;*/
方法3:使用 –
mysql> -- select * from security.users;
主要注意:使用 – 进行注释,需要加一个空格进行分割。在注入中用到的 –+ 就是将空格转换为URL编码
union
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。其内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
注入时,使用id=-1或者超出其范围的值 + union select可以获得一些信息。
例如:
mysql> select -1 union select database();
+----------+
| -1 |
+----------+
| -1 |
| security |
+----------+
2 rows in set (0.00 sec)
order by
order by 关键字用于对结果集按照一个列或者多个列进行排序,默认按照升序对记录进行排序。
SELECT column_name,column_name
FROM table_name
ORDER BY column_name,column_name ASC|DESC;
通过使用 order by + 数字 可以对数据库表中的列数进行判断。
例如:
mysql> select * from users order by 3;
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 8 | admin | admin |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 14 | admin4 | admin4 |
| 4 | secure | crappy |
| 1 | Dumb | Dumb |
| 12 | dhakkan | dumbo |
| 6 | superman | genious |
| 2 | Angelina | I-kill-you |
| 7 | batman | mob!le |
| 3 | Dummy | p@ssword |
| 5 | stupid | stupidity |
+----+----------+------------+
13 rows in set (0.00 sec)
mysql> select * from users order by 4;
ERROR 1054 (42S22): Unknown column '4' in 'order clause'
group by
GROUP BY 语句用于结合 Aggregate 函数,根据一个或多个列对结果集进行分组。
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
例如:
首先,展示所有成员信息
mysql> select * from student;
+------+-------+------+
| id | name | sex |
+------+-------+------+
| 1 | jack | 00 |
| 2 | bill | 00 |
| 3 | tom | 00 |
| 4 | niki | 11 |
| 5 | joan | 11 |
| 6 | linda | 11 |
+------+-------+------+
6 rows in set (0.00 sec)
根据性别字段进行查询
mysql> select * from student group by sex;
+------+------+------+
| id | name | sex |
+------+------+------+
| 1 | jack | 00 |
| 4 | niki | 11 |
+------+------+------+
2 rows in set (0.00 sec)
但是每组都显示了一个信息,不够明显
使用group_concat()来查看所有信息
mysql> select group_concat(id,'~',name,'~',sex,'~') from student group by sex;
+---------------------------------------+
| group_concat(id,'~',name,'~',sex,'~') |
+---------------------------------------+
| 1~jack~00~,2~bill~00~,3~tom~00~ |
| 4~niki~11~,5~joan~11~,6~linda~11~ |
+---------------------------------------+
2 rows in set (0.00 sec)
2. 常用函数
length()
length用于获取字符串的长度
例如:
mysql> select length('hello,word');
+----------------------+
| length('hello,word') |
+----------------------+
| 10 |
+----------------------+
1 row in set (0.00 sec)
if()
if函数根据条件的结果为true或false,来返回一个值或者执行一段内容
IF(condition, value_if_true, value_if_false)
参数 | 描述 |
---|---|
condition | 必须具备的参数,是判断条件语句 |
value_if_true | 可选,当结果为true,执行该语句 |
value_if_false | 可选,当结果为false,执行该语句 |
通常用在时间盲注上。
例如:
mysql> select if(1>2,'YES','NO');
+--------------------+
| if(1>2,'YES','NO') |
+--------------------+
| NO |
+--------------------+
1 row in set (0.00 sec)
sleep()
使用sleep,设定N秒,强制停留N秒,然后继续执行后续步骤。
例如:
mysql> select sleep(5);
+----------+
| sleep(5) |
+----------+
| 0 |
+----------+
1 row in set (5.01 sec)
concat()
concat进行字符串的连接。
返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。
CONCAT(str1,str2,……)
可以有一个或者多个的参数。
例如:
mysql> select concat('123','my','sql');
+--------------------------+
| concat('123','my','sql') |
+--------------------------+
| 123mysql |
+--------------------------+
1 row in set (0.00 sec)
concat_ws()
concat_ws() 代表 CONCAT With Separator ,是concat()的特殊形式。第一个参数是其它参数的分隔符。
分隔符的位置放是连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。
CONCAT_WS(separator,str1,str2,…)
注意:如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。
例如:
mysql> select concat_ws('~','hello','word');
+-------------------------------+
| concat_ws('~','hello','word') |
+-------------------------------+
| hello~word |
+-------------------------------+
1 row in set (0.00 sec)
group_concat()
group_concat函数返回一个字符串结果,该结果由分组中的值连接组合而成。
group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator])
例如:
mysql> select group_concat(column_name,'~') from information_schema.columns where table_name='users' and table_schema='security';
+-------------------------------+
| group_concat(column_name,'~') |
+-------------------------------+
| id~,username~,password~ |
+-------------------------------+
1 row in set (0.01 sec)
left()
left函数是一个字符串函数,从左开始截取字符串,对应的是right()函数(从右开始截取字符串)。
left(str,length);
例如:
mysql> select left('hello,world',6);
+-----------------------+
| left('hello,world',6) |
+-----------------------+
| hello, |
+-----------------------+
1 row in set (0.00 sec)
floor()
floor函数用于向下取整,返回整数值。
例如:
mysql> select floor(5.98);
+-------------+
| floor(5.98) |
+-------------+
| 5 |
+-------------+
1 row in set (0.00 sec)
rand()
rand(N)函数用于产生0~1之间的随机数。
如果一个整数参数N被指定,它被当做种子值使用(用于产生一个可重复的数值):
例如:
mysql> select rand();
+---------------------+
| rand() |
+---------------------+
| 0.14505084896930573 |
+---------------------+
1 row in set (0.00 sec)
mysql> select rand();
+--------------------+
| rand() |
+--------------------+
| 0.5408434202343629 |
+--------------------+
1 row in set (0.00 sec)
mysql> select rand(1);
+---------------------+
| rand(1) |
+---------------------+
| 0.40540353712197724 |
+---------------------+
1 row in set (0.00 sec)
mysql> select rand(1);
+---------------------+
| rand(1) |
+---------------------+
| 0.40540353712197724 |
+---------------------+
1 row in set (0.00 sec)
user()
user用来显示当前用户名
mysql> select user();
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
database()
database用来显示当前所用数据库
mysql> select database();
+------------+
| database() |
+------------+
| security |
+------------+
1 row in set (0.00 sec)
current_user()
current_user可以查询当前用户名、可以用来查看权限
mysql> select current_user();
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
version()
version()用来查看数据库的版本
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.5.53 |
+-----------+
1 row in set (0.00 sec)
@@datadir
@@datadir用来查看数据库路径
mysql> select @@datadir;
+-------------------------------------+
| @@datadir |
+-------------------------------------+
| D:\PHPstudy\PHPTutorial\MySQL\data\ |
+-------------------------------------+
1 row in set (0.00 sec)
substring()
substring用来截取字段
substring(str, pos, length)
参数 | 描述 |
---|---|
str | 被截取字符串 |
pos | 从第N位开始截取,起始是从1开始 |
length | 截取长度,从第N位开始截取到结尾,该参数可以省略 |
例如:
mysql> select substring('hello,world',1,1);
+------------------------------+
| substring('hello,world',1,1) |
+------------------------------+
| h |
+------------------------------+
1 row in set (0.00 sec)
mysql> select substring('hello,world',3);
+----------------------------+
| substring('hello,world',3) |
+----------------------------+
| llo,world |
+----------------------------+
1 row in set (0.00 sec)
ascii()
可以获取字符的ASCII码,只能获取一个字符。
注意:如果参数为长度大于1的字符串,只获取第一个字符的ASCII码。
mysql> select ascii('h');
+------------+
| ascii('h') |
+------------+
| 104 |
+------------+
1 row in set (0.00 sec)
mysql> select ascii('hello');
+----------------+
| ascii('hello') |
+----------------+
| 104 |
+----------------+
1 row in set (0.00 sec)