一、数据库分关系型数据库和非关系型数据库
1、关系型数据库主要是做数据持久化的(重点):mysql(搭档php)、oracle(一般银行使用)、sqlserver(黄金搭档.net,一般用于电力等工业化的项目)
2、非关系型数据库是做缓存的:redis、mongodb(有rce漏洞),存储session
二、cookcie和session的关系
通常第一次登录网站的过程中,会把相关信息存储在session文件中,session有可能是以文件的形式存储,也可能以数据的形式存储
以文件形式存储,比如说phpstudy,具象化在了一个文件中,会把个人的一些登录信息存储在session文件中,存了以后会把文件名发送回客户端存储在Application(应用)下的Cookies,当下次登录的时候,如果cookies值没过期,浏览器会把cookies带到服务端,服务会直接在他的盘符里找有没有以cookies那一长串命名的文件,如果有,会查一下cookies时间有没有过期,如果没过期,则免密登录
这就意味着,假设有一个网站管理员登录到网站的后台了,只要我有办法可以把这个管理员登录的cookies偷到,那我不需要密码可以直接进到这个网页的后台
3、如果Ubuntu系统没有mysql,往Ubuntu系统中加入mysql环境
mysql的作者写了一个和mysql孪生的mariadb,供这个源使用
查看,命令:apt search mariadb
下载,命令:apt-get install -y mariadb-server
登录,命令:mysql -uroot -pouya123
查看是否启动,命令:sudo systemctl status mysql
自启动:sudo systemctl enable mariadb
重新启动:systemctl restart mariadb.service
检测3306端口命令:netstat -nlp
运行安全脚本:sudo mysql_secure_installation
除了第一个选择n,其它就建议使用默认Y。
1、Switch to unix_socket authentication 选择是否使用 Unix Socket 身份验证代替传统的用户名和密码方式,如果需要远程连接数据库,请选择n
2、Change the root password 为 root 设置一个强密码,这是提升安全性的关键步骤
3、Remove anonymous users 匿名用户可能带来安全风险,建议删除
4、Disallow root login remotely 限制 root 用户只能在本地登录,增加安全性
5、Remove test database and access to it 删除 MariaDB 默认提供的测试数据库,减少安全风险
6、Reload privilege tables now 立即重新加载权限表,让所有更改立即生效
报错1045表示说明有连接的权限,只不过账号密码写错了
而报错2002根本就没用远程连接的权限
查看数据库有没有做存储,命令:mysql -uroot -pouya123
MariaDB [(none)]> SHOW DATABASES;
查看当前所属数据库的库名:
MariaDB [(none)]> use security;
查看当前用户登录的权限:
MariaDB [security]> select user();
查看当前数据库的版本:
MariaDB [security]> select version();
length函数:
MariaDB [security]> select length('aaaa');
截取函数:
MariaDB [security]> select substr('abcd',1,1);
转16进制:MariaDB [security]> select hex('a');
转ascii码:MariaDB [security]> select ascii('a');
查看建库的语句:MariaDB [security]> show create database security;
查表:MariaDB [security]> show tables;
查看表的结构:MariaDB [security]> desc users;
查id:MariaDB [security]> select * from users;
如果出现不用密码都能进入的情况,就按下面操作:
修改密码命令:mysql>UPDATE mysql.user SET authentication_string = PASSWORD('新密码'), plugin = 'mysql_native_password' WHERE User = 'root' AND Host = 'localhost';
记得重启服务:systemctl restart mariadb.service
4、sqllabs文件的部署
sqllabs是一个印度工程师写的,国人给它升级到了php7的一个版本,将其从windows主机移动到Ubuntu系统可以用以下命令:scp -r "C:\Users\yhx\Desktop\sqli-labs-php7-master\sqli-labs-php7-master" root@192.168.249.128:
然后在Ubuntu系统下将这个这个文件移动到html目录下,命令:mv sqli-labs-php7-master /usr/local/nginx/html/
在主机通过网页打开,根据前面学习的nginx和php工具的使用,可以做到用域名打开或者ip地址打开
查看映射,命令:vim /etc/hosts
对应你mariadb用户和密码
然后点击setup……
出现上面页面就是数据库安装成功了
5、解决各个关卡的问题
如果点进关卡出现出现403Forbidden的问题,可能是权限不够,在后面手动输入index.php
Less-1:请输入一个数字型的ID
isset --- 检测变量是否已声明并且其值不为null(此代码的意思是有没有传参传传递了一个ID,目前还没有所以执行了下面那个Please……)
Get传参:在浏览器的地址栏传参
Post传参:在form表单传参
记录日志的文件:
查询语句,把前面的id放入这个mysql的查询语句中,这个id在数据库中,如下图
讨论此代码存在的问题:
1、对用户的输入没有做任何过滤
假如说,当前查询的表在电商平台,这个表是goods(商品)表,商品也有ID,拿到ID之后,mysql的联表查询要保证前后两张表的字段数一致,当然现在成熟的电商不可能用“12345……”这样有顺序的ID,因为很容易被爬虫爬取,现在基本都是用UID,mysql自带的函数,可以给提供随机字符,类似下图
创建一个goods表:
MariaDB [security]> create table goods (
-> gid int(10) unsigned not null primary key auto_increment,
-> gname varchar(100) not null,
-> gprice varchar(100) not null
-> );