目录
-
MySQL
-
MySQL简介
MySQL是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系型数据库管理系统)应用软件之一。
-
MySQL基础结构
库:MySQL下可以存在多个库,可以理解为一个仓库。
表:一个库下可以窜访多个表,仓库内的储物架。
列:字段名,类似表格的列,储物架上的不同的列。
值:存放的数据,存放的工具。
-
数据库连接
明文连接
mysql -h127.0.0.1 -P3306 -uroot -proot
密文连接
mysql -uroot -p
Enter password:****
-
基础语法
查询当前数据库版本 select version();
查询当前数据库 select database();
查询当前数据库用户 select user();
查询当前路径 select @@basedir;
查询所有数据库 show databases;
选择一个数据库 use + 数据库名;
查询当前数据库 select database();
查询所有表名 show tables;
创建一个数据库 create database 数据库名;
删除一个数据库 drop database 数据库名;
查询一个表的结构 desc 表名;
查询服务期的系统版本 select @@version_compile_os;
查询数据库 select schema_name from information_schema.schemata;
查询表名 select table_name from information_schema.tables where table_schema='库名' limit 0,1;
查询列名 select column_name from information_schema.columns where table_schema='库名' and table_name='表名' limit 0,1;
创建表
语法:create table 数据表名字(字段 类型 约束[,字段 类型 约束]);
约束:auto_increament 表示自动增长
not null 表示不能为空
primary key 表示主键
default 默认值
插入数据
语法:insert into 表名(字段名1,字段名2,...)values(值1,值2,...); //指定字段名
insert into 表名 values(值1,值2,...); //不指定字段名
insert into 表名(字段名1,字段名2,...)values(值1,值2,...)(值1,值2,...)...; //同时添加多条数据
删除数据
语法:delete from 表名 where 条件表达式; //删除指定数据
delete from 表名; //删除所有数据
更新数据
语法:update 表名 set 字段名1=值1,[,字段名2=值2,...][where 条件表达式]; //更新指定数据
update 表名 set 字段名=xx; //更新全部数据
查询数据
语法:select 字段名1,字段名2,...from 表名; //查询所有数据
select * from 表名; //查询所有数据
select 字段名1,字段名2,...from 表名; //查询指定的部分字段
select 字段名1,字段名2,...from 表名 where 条件表达式; //带关系运算符的查询
select * 字段名1,字段名2,... from 表名 where 字段名 [NOT] IN (元素1,元素2,...); //带IN关键字的查询
select * {字段1,字段2,...} from 表名 where 字段名[NOT] BETWEEN 值1 AND 值2; //带BETWEEN AND 关键字的查询
select * 字段名1,字段名2,... from 表名 where 字段名 IS [NOT] NULL; //空值查询
select distinct 字段名 from 表名; //用来过滤重复值得出现
select * | 字段名1,字段名2,... from 表名where字段名 [NOT] LIKE '匹配字符串'; //带LIKE关键字的查询,查询数据库中“x%”表示查询以字符x开头的字符串;下划线通配符只能表示单个字符,如果需要匹配多个字符,需要使用多个下划线通配符。
select * | 字段名1,字段名2,... from 表名 where 条件表达式1 AND 条件表达式2; //带AND 关键字的查询
select * | 字段名1,字段名2,... from 表名 where 条件表达式1 or 条件表达式2 or ...; //带OR关键字的查询
-
内置库知识
在MySQL>5.0的版本中,把information_schema看作是一个自带的内置数据库,也是信息数据库。
schemata表:schema_name这个字段,它存放着所有数据库库名。
tables表:table_name用来存放所有数据库的表名。
columns表:用来存放数据库里所有字段信息。
table_schema列用来存放数据库库名字段
table_name列用来存放所有数据
column_name列用来存放所有的字段/内容
-
MySQL相关函数
hex()函数:参数可用于任何参数外面,对数据进行十六进制编码;
unhex()函数:则是用来解码,将十六进制的内容转换回十进制。
substr()函数:语法:substr(start,length).
从起点截取某个长度的字符串。
substring()函数:语法:substring(start,end).
截取两个位置之间某个长度的字符串。
mid()函数:语法:mid(column_name,start,length).
用于得到一个字符串的一部分。
left()函数:语法:left(string,n)。
得到字符串左部指定个数的字符。
updatexml()函数:语法:updatexml(目标xml文档,xml路径,更新的内容)
更新xml文档的函数。
extractvalue()函数:语法:extractvalue(目标xml文档,xml路径)
对xml文档进行查询的函数
load_file()函数:MySQL读取本地文件。
into outfile()函数:用来导出文件。
在SQL注入时,我们可以利用load_file或者into outfile()函数对文件进行读取,或者写入webshell,但是需要注意以下几点:
- 要能使用union;
- 要有secure_file_priv权限;
- 必须有读取权限;
- 必须知道绝对路径,且目录必须是可读、可写权限;
- 必需小于配置文件中设置的文件大小,也就是max_allowed_packetde.
注意:若过滤了单引号,则可以将函数中的字符进行hex编码
关于secure_file_priv函数:查询方法:show variable like '%secure_file_priv%'
查询结果为:secure_file_priv NULL时,表示不允许导入导出;
查询结果为:secure_file_priv /xxx/时,表示只允许在当前目录导入导出;
查询结果为:secure_file_priv(空白)时,表示可以在任意目录进行导入导出。
MySQL5.6.34版本以后secure_file_priv的值默认为NULL。且无法用sql语句对其进行修改,只能够通过以下方式修改mysql.ini或my.cn:
Windows:mysql.ini中添加secure_file_priv=。
linux:/etc/my.cnf的[mysqld]下面添加local-infile=0
-
内联注释的特性
内联注释符是一种基于注块注释衍生出来的注释风格,它可以执行整个SQL语句,内联注释有个特殊点,和MySQL版本息息相关,也就是当内联注释中出现小于或等于当前版本号的时候,内联注释符里的子句会被执行,大于时则不会被执行,注意版本的写法,例如,5.5.34,在内联注释中需要写为50534,版本号第二位加0,然后注意版本号和内联注释中间不能有空格。
%a0=空格
-
SQL注入实战
-
sqli_labs搭建
- 启动PHP集成环境搭建,把源码放到www目录下;
- 修改数据库配置文件:sql-connections\db-creds.inc;
- URL中访问sqli_labs所在的目录。
-
SQL注入简介
SQL注入是指web应用程序对用户输入数据的合法性未进行判断、处理,前端传入的参数是攻击者可控的,并且参数被正常的代入到数据库查询,攻击者可以通过构造不同的SQL语句来进行对数据库的操作,正常情况下攻击者可以对数据库进行高危操作,例如,数据查询、webshell写入、命令执行等操作。
SQL注入漏洞的产生必须满足两个条件:
- 参数是可控的;
- 参数可以被代入数据库进行查询。
-
SQL注入漏洞的危害
数据库信息泄露:泄露数据库中存放的数据、用户隐私等;
获取webshell:当权限为root且知道绝对路径时,可以直接写一句话木马到服务器。
网页篡改:注入出后台管理员用户,登录后台后发布恶意数据、篡改后台数据等。
网站挂马:当拿到webshell或者获取到服务器的权限后,可将一些网页木马挂在服务器上。
获取系统权限:当权限足够高时,可以获取系统主机的权限。
万能密码:利用特定的payload登录后台或者其他页面。
文件读取:读取敏感文件。
-
SQL注入类型
按数据库类型分:access、MSSQL、MySQL、Oracle、DB2等。
按提交方式分:GET、post、cookie、HTTP头、XFF。
按注入点类型分:数字型、字符型、搜索型
按执行结果分:布尔盲注、时间盲注、报错盲联合注堆叠查询注入。
-
类型详解
数字型:
像其注入点id类型为数字,所以叫数字型注入点。
字符型:
像其注入点name=admin这种形式为字符型。
搜索型:
一些网站为了方便用户查找网站的资源,都对用户提供了搜索的功能,因为是搜索功能,往往是程序员在编写代码是忽略了对其变量的过滤,而且这样的漏洞在国内的系统中普遍地存在。搜索型注入又称文本框注入。
布尔盲注:
即可以根据返回页面判断条件真假的注入。
时间盲注:
即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即返回页面时间是否增加)。
报错注入:
即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
联合注入:
可以使用union的情况下的注入。
堆查询注入:
可以使用执行多条语句的执行时的注入。
-
宽字节注入
原理:程序员为了防止SQL注入,对用户输入中的单引号进行处理,在单引号加上斜杠进行转义,这样被处理好后的SQL语句中单引号不再具有作用,仅仅是内容而已,换句话说,这个单引号无法发挥和前后单引号闭合的作用,仅仅成为内容。
当某字符的大小为一个字节时,称其字符为窄字节。
当某字符的大小为两个字节时,称其字符为宽字节。
所有英文默认占一个字节,汉字占两个字节。
常见的宽字节编码:GB2312,GBK,GB18030,BIG5,shift_JIS等。
使用%df,会被转义成\,在GBK编码中,\被转义成%5c。
安全人员要绕过这个转义处理,使单引号发挥作用,有两个思路:
- 让斜杠失去作用;
- 让斜杠消失。
思路一:借鉴程序员的防范思路,对斜杠转义,使其失去转义单引号的作用,成为“内容”。
思路二:宽字节注入
当使用MySQL使用宽字节编码,如:GBK时,两个连接在一起的字符会被认为是汉字,我们可以在单引号前加一个字符,使其和斜杠组合被认为成汉字,从未达到让斜杠消失的目的,进而使单引号发挥作用。
注意:前一个字符的ASCII要大于128,两个字符才能组合成汉字,如%df%5c%27,此时%df和%5c会被GBK认为是一个汉字,也就是繁体字,而后面的%27也就是单引号 ,这就绕过了闭合问题。