SQL注入基础知识(1)

SQL注入基础知识(1)

SQL注入基础知识(2)

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)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lilin_27

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值