mysql诸如漏洞攻击_MySQL及漏洞笔记
sql背景
随着⽹络的发展和普及,⽇常⽣活中也出现了很多⽹络结构模式。
⽐如我们最常见的就是B/S结构和C/S结构。
C/S(Client/Server)字⾯意思就是 客户端/服务器 模式,我们很容易理解这是⼀种软件体系结构,⽐如WeChat,qq,⼿游等⼿机应⽤便是采⽤这种结构。
B/S(Browser/Server)字⾯意思就是 浏览器/服务器 模式,我们⽇常⽣活中的访问⽹页等就是使⽤这种结构进⾏数据交互。
这⾥我们就不详细展开这两种结构了,现在通过我们的常识很容易便会发现B/S结构维护升级要⽐C/S结构简单,但这是为什么呢?
因为B/S结构让数据处理在服务器上完成,通常⽤户只需安装浏览器就可与数据库进⾏交互,完成⼀系列操作。但也会引发安全问题,这时候就要关注到我们的sql语⾔上了。
sql简介
SQL(Structured Query Language)是⼀种结构化查询语⾔,⽅便⽤户查询。详情可见
sql语法
所谓⼯欲善其事,必先利其器,
我们要先了解⼀下⽐较常见的sql语法,要注意的是sql语句不区分⼤⼩写,但数据库名表名区分。
之后我们都以MySQL的语法为例:
⾸先,我们先登录⾃⼰的数据库(下载安装就不展开了,新⼿可以⽤PHPstudy)
mysql -h hostname -u username -p
-h是指定登录的主机,我们在本地环境测试的时候可以忽略,
-u是指定登录的⽤户名,phpstudy默认⽤户名是root,
-p是指定登录的密码,为了安全性我们不在代码上直接输⼊密码,MySQL会向你询问密码,若⽆密码可以忽略-p。
登录到数据库后,我们先掌握最基本的对数据库的增删查改,
create database 你好xluo charset=utf8;
use 你好xluo;
select database();
create table lalala(hahaha int);
nosydrop table lalala;
drop database 你好xluo;
show databases;
以上流程为:1.我创建了⼀个名为'你好xluo'的数据库(charset=utf8可省略),
2.并进⼊了这个数据库,
3.然后显⽰当前数据库,
4.创建了⼀个名为lalala的表,⾥⾯有⼀个列名为hahaha,是int型,left join 效率
5.然后把这个表删了,
6.然后我觉得这个数据库名字不好听就不讲武德地删了这个数据库,
7.然后我瞧了⼀眼确定这个带着羞耻名字的数据库被我删掉了。
create database xluo;
use xluo;
create table users(userid int primary key,age int,sex varchar(4),phonenumber int);
desc users;
alter table users add birthday char(10);desc users;
alter table users change birthday birthday datetime not null;
alter table users modify birthday date not null;
tui,我删掉⼲啥,重新来⼀遍吧,以上流程为:
1.创建名为'xluo'的数据库,
2.进⼊所创建的数据库xluo,
3.创建⼀张新的表名为users,⾥⾯有userid,age,sex,phonenumber这⼏个字段名,
语句结构为create table 表名(字段名1 数据类型1 可选约束条件1,字段名2 数据类型2 可选约束条件2……)
4.查看users这张表的结构,我们可以看到userid不能为空,这是
因为我们前⾯设置了约束条件primary key,
PRI主键约束;UNI唯⼀约束;MUL可以重复。
5.向表⾥新增⼀个字段birthday,长度限制为10个字符,并看⼀下表的结构
,
注意char和varchar的区别,此处语句结构为alter table 表名 add 字段名 类型。
6.语句结构alert table 表名 change 原表名 新表名 新类型 新约束。
7.alter table 表名 modify 字段名 新类型 新约束。
(ps:如果要删除字段也可以alter table 表名 drop 字段名)
8.
sql漏洞
现在我们知道使⽤sql语⾔对开发维护是⼀件很⽅便的事情,但是通常情况下,如果开发⼈员在编写代码的时候并没有考虑到各种⽤户⾏为并对交互数据或页⾯信息进⾏合法性判断,攻击者就容易⽤⼀段查询代码获得数据库信息。
可以说,代码是⼈编写的,那么漏洞便会⼀直存在,甚⾄很多⼈依赖预编译就并没有对任何东西进⾏过滤,这实际上是⼀件很危险的事情,后⾯笔者会详细讲到。
⾸先,我们先来了解最简单的sql注⼊,假如开发者并没有对语句进⾏过滤,构建类似下⾯的这串代码,
$id=$_GET['id']
$sql="select * from users where id =".$id
我们可以发现get⽅法传⼊了参数id,⽽id直接放进了数据库查询语句执⾏,并没有任何的过滤,那么当我们输⼊sql语句就可以对数据库执⾏查询等⼀系列操作。
⽐如⾸先url构造?id=-1 or 1=1 #
这是我们发现-1将返回false,但是1=1恒成⽴,那么sql语句也成⽴,于是会查询所有users。
简单来说sql漏洞有很多,接下来已经了解sql增删查改的我们来看⼀下基于MySQL的绕过。
基于MySQL的注⼊
关于MySQL注⼊基础
1.了解MySQL注释风格
1.#
单⾏注释,#后⾯直接加内容
2.--
单⾏注释,--后⾯必须要加空格
我们常⽤--+是因为字符'+'在URL编码后为空格手机mysql安装配置教程
3./**/
多⾏注释,/**/中间可以跨⾏
2.MySQL中的内联注释:
内联注释是MySQL数据库为了保持与其他数据库兼容,特意新添加的功能。为了避免从MySQL中导出的SQL语句不能被其他数据库使⽤,它把⼀些MySQL特有的语句放在 /*!...*/中,这些语句在不兼容的数据库中使⽤时便不会执⾏。⽽MySQL⾃⾝却能识别、执⾏。
/*50001*/表⽰数据库版本>=5.00.01时中间的语句才会执⾏。
在SQL注⼊中,内联注释常⽤来绕过waf。
3.union联合查询
union 操作符⽤于拼接两个或者多select查询语句
union中的每个查询必须拥有相同的列数
ORDER BY 语句⽤于根据指定的列对结果集进⾏排序。
ORDER BY 语句默认按照升序对记录进⾏排序。
5.注释在SQL注⼊中的应⽤:
select user from student where id = 1 limit 0,1;select user from student where id = 1 and 1=2 union select user() # limit
0,1;
攻击者注⼊⼀段包含注释符的SQL语句,将原来的语句的⼀部分注释,注释掉的部分语句不会被执⾏6.SQL注⼊中⼀些常⽤的MySQL函数/语句:
函数/语句功能
user()
当前⽤户名
特斯拉y2023大改款database()
当前所⽤数据库
current_user()
当前⽤户名(可⽤来查看权限)
version()
数据库的版本
@@datadir
数据库的路径
load_file()
读⽂件操作
Into outfile() / into dumpfile
写⽂件操作
7.SQL注⼊读写⽂件的根本条件:
数据库允许导⼊导出(secure_file_priv)
当前⽤户⽤户⽂件操作权限(File_priv)
secure_file_prive参数的设置含义
secure_file_prive=null
限制mysqld 不允许导⼊导出
secure_file_priv=/tmp/
限制mysqld的导⼊导出只能发⽣在/tmp/⽬录下
secure_file_priv=' '
不对mysqld 的导⼊导出做限制
secure_file_prive直接在my.ini⽂件⾥设置即可
8.load_file()读⽂件
9.into outfile / into dumpfile写⽂件
outfile与dumpfile的区别:
dumpfile适⽤于⼆进制⽂件,它会将⽬标⽂件吸⼊同⼀⾏内;
outfile则更适⽤于⽂本⽂件
条件:
1.对web⽬录具有读写权限
2.知道⽂件绝对路径
3.能够使⽤联合查询(sql注⼊时)
命令:
select load_file(‘d:/phpstudy/www/anyun.php’);sort code怎么查
select ‘anyun’ into outfile ‘d:/phpstudy/www/anyun.php’;
10.字符串连接函数
concat(str1,str2..)函数直接连接
group_concat(str1,str2..)函数使⽤逗号做为分隔符
concat_ws(sep,str1,str2..)函数使⽤第⼀个参数做为分隔符
11.sql本质
把⽤户输⼊的数据当作代码执⾏。
$id = $_GET['id'];
mysql_query($query);
$query = "select * from information where id = "$id" limit 0,1";
变量id的值由⽤户提交,在正常情况下,假如⽤户输⼊的是1,那么SQL语句会执⾏:select * from information where id = 1 limit 0,1
但是假如⽤户输⼊⼀段有SQL语义的语句,⽐如:
1 or 1 =1 %23
那么,SQL语句在实际的执⾏时就会如下:
select * from information where id = 1 or 1 = 1 %23
条件⼀:⽤户能够控制变量id;条件⼆:原本要执⾏的代码,拼接了⽤户的输⼊。12.关于information_schema
苏联素描和欧洲素描
13.基础语法
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论