SQL注入系列 [案头笔记]Sql注入篇-01mysql基础
[案头笔记]Sql注入篇-02报错型联合注入
系列摘要 SQL注入是一种普遍而危险的网络攻击手段,它允许攻击者操纵数据库,访问敏感数据,甚至完全控制受影响的系统。本系列文章深入探讨了SQL注入的多个方面,包括其历史、基本概念、攻击技术和防御策略。本系列的目的是为了提高网络安全从业人员和对网络安全感兴趣的读者对SQL注入的全面认识。希望这个系列的文章能成为大家日常工作和学习中的重要参考资料,不仅增强对SQL注入攻击的防御能力,也可以丰富在网络安全领域的知识和技能。希望这个系列可以提供必要的信息和实用的技巧。
SQL注入的产生原因 SQL注入的根本原因在于网站和应用程序未能充分验证和过滤用户输入。当开发者未对用户输入数据进行适当的处理和转义,就有可能在数据库查询中插入恶意SQL代码。这种疏忽使得攻击者能够篡改原本的SQL查询,实施非法数据库操作,如获取敏感信息、删除重要数据或执行恶意命令。此外,不安全的数据库配置和不完善的错误处理机制也可能增加SQL注入的风险。因此,编写安全的代码和采取严格的输入验证措施对于预防SQL注入至关重要。
核心原理 SQL注入攻击的核心在于利用应用程序中的安全漏洞,将恶意的SQL代码注入到数据库查询中。这通常发生在用户输入被不加验证地用于构建SQL语句的情况下。攻击者利用这些漏洞来操纵数据库查询,使之执行非预期的命令。这可能包括读取或修改敏感数据、执行管理操作(如关机数据库或删除数据表)或者获取系统的后门访问权限。成功的SQL注入攻击可能导致数据泄露、数据完整性破坏和认证机制绕过。因此,理解SQL注入的
原理对于开发安全的网站和应用至关重要。这要求开发人员编写健壮的代码,确保所有的用户输入都经过严格的验证和适当的处理,如使用参数化查询和适当的转义机制。此外,了解常见的攻击模式和示例也有助于更好地防御这类攻击,确保应用程序和用户数据的安全。
MySQL基础
本节将深入探讨MySQL的基本操作和概念,为后续理解SQL注入提供必要的背景知识。我们将从基础的MySQL连接开始,介绍如何查询数据库、选择特定数据库、查看表格和数据,以及执行基本的数据检索操作。通过具体的命令示例,如show databases;
、use database_name;
和select * from table_name;
等。
链接mysql
查询数据库 show databases
选择数据库 use database_name 1 use security; // # 选择数据库
查寻表 show tables
查询数据 select * from table_name
查询语句中可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。 可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
检索所有列 1 select * from table_name
1 select * from users; // 检索users的所有列
检索单个列 1 select column_name from table_name // 从table_name 数据表中检索column_name 列,检索单个列
1 select username from users;
检索多个列 1 select column1_name, column2_name from table_name; // 检索多个列
1 2 当然,我们也可以使用完全限制来进行数据检索:select users.id, users.username from users ; // 输出users 表中id 列,username列的数据
限制输出的结果 limit 1 select * from users limit 2; // 返回前2行结果,注意,当行数不够时,只能返回数据表中有限的行数
1 select * from users limit 2 ,4 ;
过滤数据 where 常用的select子句在过滤数据时使用的是单一的条件,为了进行更强的过滤控制,可以下多个where子句,这些子句有两种方式:以and子句和or子句的方式使用。
1 2 select * from goods where id = 2 and num > 10 // 检索id为2并且num大于10的记录 select * from goods where id = 3 or num > 15 // 检索id为3或num大于15的记录
操作符UNION
UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。注意:UNION内部的SELECT语句必须拥有相同数量的列。列内也必须拥有相类似的数据类型。
1 2 3 4 5 6 7 8 mysql> show tables; +----------------+ | Tables_in_test | +----------------+ | book || reader | +----------------+ 2 rows in set (0.00 sec)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 mysql> select * from book; +------------+--------+ | name | author | +------------+--------+ | c language | skama | | java | harry || python | houder | +------------+--------+ 3 rows in set (0.00 sec)mysql> select * from reader; +--------+----------+------+ | name | date | sex | +--------+----------+------+ | kumata | 20180530 | man | | kumata | 20180530 | man || looper | 20187475 | NULL | +--------+----------+------+ 3 rows in set (0.00 sec)
1 2 3 4 5 6 7 8 9 10 11 12 mysql> select book.name from book union select reader.name from reader; +------------+ | name | +------------+ | c language | | java | | python | | kumata | | kusada || looper | +------------+ 6 rows in set (0.00 sec)
排序检索数据 order by select语句默认返回结果是没有特定顺序的,在排序检索数据时也可以指定排序的方向,比如升序或者降序等,order by子句默认为升序排列。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 mysql> select * from 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)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 mysql> select * from users order by username; // 以username列进行升序排列 +----+----------+------------+ | id | username | password | +----+----------+------------+ | 8 | admin | admin | | 9 | admin1 | admin1 | | 10 | admin2 | admin2 | | 11 | admin3 | admin3 | | 14 | admin4 | admin4 | | 2 | Angelina | I-kill-you | | 7 | batman | mob!le | | 12 | dhakkan | dumbo | | 1 | Dumb | Dumb | | 3 | Dummy | p@ssword | | 4 | secure | crappy | | 5 | stupid | stupidity | | 6 | superman | genious | +----+----------+------------+ 13 rows in set (0.00 sec)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 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'
拼接字段concat 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 mysql> select * from 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) mysql> select users.username,users.password from users; +----------+------------+ | username | password | +----------+------------+ | Dumb | Dumb | | Angelina | I-kill-you | | Dummy | p@ssword | | secure | crappy | | stupid | stupidity | | superman | genious | | batman | mob!le | | admin | admin | | admin1 | admin1 | | admin2 | admin2 | | admin3 | admin3 | | dhakkan | dumbo | | admin4 | admin4 | +----------+------------+ 13 rows in set (0.02 sec)
group_concat()
将字符串连接成一组
1 2 3 4 5 6 7 mysql> select group_concat(users.username) from users; +---------------------------------------------------------------------------------------------+ | group_concat(users.username) | +---------------------------------------------------------------------------------------------+ | Dumb,Angelina,Dummy,secure,stupid,superman,batman,admin,admin1,admin2,admin3,dhakkan,admin4 | +---------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
1 2 3 4 5 6 7 mysql> select id,group_concat(users.username,users.password) from users; +----+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | id | group_concat(users.username,users.password) | +----+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | 1 | DumbDumb,AngelinaI-kill-you,Dummyp@ssword,securecrappy,stupidstupidity,supermangenious,batmanmob!le,adminadmin,admin1admin1,admin2admin2,admin3admin3,dhakkandumbo,admin4admin4 | +----+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
concat()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 mysql> select concat(users.username,users.password) from users; +---------------------------------------+ | concat(users.username,users.password) | +---------------------------------------+ | DumbDumb | | AngelinaI-kill-you | | Dummyp@ssword | | securecrappy | | stupidstupidity | | supermangenious | | batmanmob!le | | adminadmin | | admin1admin1 | | admin2admin2 | | admin3admin3 | | dhakkandumbo || admin4admin4 | +---------------------------------------+ 13 rows in set (0.00 sec)mysql> select concat(users.username,users.password) from users limit 0,1; +---------------------------------------+ | concat(users.username,users.password) | +---------------------------------------+ | DumbDumb | +---------------------------------------+ 1 row in set (0.00 sec)
concat_ws() 含有分隔符的连接字符串
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 mysql> select concat_ws(':',users.username,users.password) from users; +----------------------------------------------+ | concat_ws(':',users.username,users.password) | +----------------------------------------------+ | Dumb:Dumb | | Angelina:I-kill-you | | Dummy:p@ssword | | secure:crappy | | stupid:stupidity | | superman:genious | | batman:mob!le | | admin:admin | | admin1:admin1 | | admin2:admin2 | | admin3:admin3 | | dhakkan:dumbo || admin4:admin4 | +----------------------------------------------+ 13 rows in set (0.00 sec)mysql> select concat_ws(':',users.username,users.password) from users limit 0,1; +----------------------------------------------+ | concat_ws(':',users.username,users.password) | +----------------------------------------------+ | Dumb:Dumb | +----------------------------------------------+ 1 row in set (0.00 sec)
1 2 3 4 5 6 7 mysql> select group_concat(concat_ws(':',users.username,users.password)) from users limit 0,1; +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | group_concat(concat_ws(':',users.username,users.password)) | +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Dumb:Dumb,Angelina:I-kill-you,Dummy:p@ssword,secure:crappy,stupid:stupidity,superman:genious,batman:mob!le,admin:admin,admin1:admin1,admin2:admin2,admin3:admin3,dhakkan:dumbo,admin4:admin4 | +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
添加数据 查看有哪些表
新建表:CREATE TABLE xxxx();
1 2 3 4 5 // 书:书名和作者 CREATE TABLE book(name char(20),author char(20)); // 读者:人名、借书日期以及性别 CREATE TABLE reader(name char(20),date int(10),sex char(5));
插入内容到表:INSERT INTO xxx VALUES();
1 2 3 4 5 6 7 INSERT INTO book VALUES('c language','skama'); INSERT INTO book VALUES('java','harry'); INSERT INTO book VALUES('python','houder'); INSERT INTO reader VALUES('kumata',20180530,'man'); INSERT INTO reader(name,sex) VALUES('kusada','man'); INSERT INTO reader(name,date) VALUES('looper',20187475);
查询book表
1 2 3 4 5 6 7 8 9 mysql> SELECT * FROM book; +------------+--------+ | name | author | +------------+--------+ | c language | skama | | java | harry || python | houder | +------------+--------+ 3 rows in set (0.00 sec)
查询reader表
1 2 3 4 5 6 7 8 9 mysql> SELECT * FROM reader; +--------+----------+------+ | name | date | sex | +--------+----------+------+ | kumata | 20180530 | man | | kusada | NULL | man || looper | 20187475 | NULL | +--------+----------+------+ 3 rows in set (0.00 sec)
删除 删表 1 DROP TABLE xxx(table_name )
常见函数
函数名
描述
用法示例
version()
获取MySQL数据库版本
SELECT VERSION();
database()
获取当前数据库名
SELECT DATABASE();
user()
获取当前连接的用户名
SELECT USER();
current_user()
获取当前数据库用户
SELECT CURRENT_USER();
system_user()
获取系统用户名
SELECT SYSTEM_USER();
@@datadir
获取数据库文件路径
SELECT @@datadir;
@@version_compile_os
获取操作系统版本
SELECT @@version_compile_os;
length()
返回字符串长度
SELECT LENGTH('ffdfs');
或 SELECT LENGTH(VERSION());
substring()
截取字符串
SELECT SUBSTRING("dhffjf", 2, 2);
substr()
截取字符串
SELECT SUBSTR("version()", 2);
或 SELECT SUBSTR(VERSION(), 2, 10);
mid()
截取指定长度的字符串
SELECT MID(' select ', 2, 6);
left()
从左侧截取指定字符个数的字符串
SELECT LEFT('adc', 2);
或 SELECT LEFT(VERSION(), 2);
concat()
连接字符串(无分隔符)
SELECT CONCAT('a', 'b', 'c');
concat_ws()
连接字符串(带分隔符)
SELECT CONCAT_WS('/', 'a', 'b', 'c');
返回 a/b/c
group_concat()
连接一组字符串
SELECT GROUP_CONCAT(id) FROM users;
ord()
返回字符的ASCII码值
SELECT ORD('a');
ascii()
返回字符的ASCII码值
SELECT ASCII('a');
hex()
将字符串转换为十六进制
SELECT HEX('a');
unhex()
十六进制的反向操作
SELECT UNHEX(61);
md5()
计算字符串的MD5哈希值
SELECT MD5('123456');
floor(x)
返回不大于x的最大整数
SELECT FLOOR(x);
round(x)
返回参数x最接近的整数
SELECT ROUND(x);
rand()
返回0到1之间的随机浮点数
SELECT RAND();
load_file()
读取文件内容并返回为字符串
SELECT LOAD_FILE('file.txt');
sleep(seconds)
程序休眠指定秒数
SELECT SLEEP(5);
IF(condition, t, f)
条件判断函数
SELECT IF(TRUE, 1, 0);
或 SELECT IF(FALSE, 1, 0);
FIND_IN_SET(str, strlist)
返回字符串在字符串列表中的位置
SELECT FIND_IN_SET('value', 'value1,value2,value3');
BENCHMARK(count, expression)
执行指定语句多次以测试性能
SELECT BENCHMARK(1000000, MD5('test'));
NAME_CONST(name, value)
返回常量值
SELECT NAME_CONST('myconst', 42);