一、docker环境准备
ubuntu环境:
卸载旧版本
1
| apt-get remove docker docker-engine docker.io containerd runc
|
安装前提依赖
1 2
| apt update apt-get install ca-certificates curl gnupg lsb-release
|
安装GPG证书
1
| curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
|
写入软件源信息
1
| add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
|
安装新版本
1
| apt-get install docker-ce docker-ce-cli containerd.io
|
配置用户组
启动docker
docker换源
修改 /etc/docker/daemon.json (如果该文件不存在,则创建)
1 2 3 4 5
| { "registry-mirrors": [ "https://hub-mirror.c.163.com" ] }
|
必要工具
安装必要的一些系统工具
1
| apt-get -y install apt-transport-https ca-certificates curl software-properties-common
|
配置 docker
添加 docker 配置 /etc/docker/daemon.json
1 2 3 4 5 6 7 8 9
| { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2", "registry-mirrors": ["docker镜像仓库国内加速"] }
|
重启 docker
拉取SQL镜像
将用户添加到docker组
1
| sudo gpasswd -a {your user name of linux} docker
|
重启docker-daemon
1
| sudo systemctl restart docker
|
更新用户组
run起mysql:
设置端口为4001 ,密码为123
1
| docker run --name sqlinjectmysql -d -p 4001:3306 -e MYSQL_ROOT_PASSWORD=123 14905234a4ed(image_id)
|
进入容器
1
| docker exec -it sqlinjectmysql /bin/bash
|
进入数据库(需要输入密码123)
二、SQL注入基础
1.查询用户
1 2 3 4 5 6 7 8 9 10 11 12
| select user,host from mysql.user; -> +---------------+-----------+ | user | host | +---------------+-----------+ | root | % | //可以使用此用户进行远程连接 | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | +---------------+-----------+ 4 rows in set (0.00 sec)
|
2.用数据库工具新建远程连接
注意:这里连接时的IP地址需要在ubuntu下查看:$ ifconfig | grep inet
3.数据库介绍
3.1 常见数据库和数据表
是信息数据库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息,比如数据库名,数据库表,表字段的数据类型与访问权限等,web渗透过程中用途很大;
3.1.2 SCHEMATA表:
提供了当前MySQL实例中所有的数据库信息,show databases结果取之此表
3.1.3 TABLES表:
提供了关于数据中表的信息
3.1.4 COLUMNS表:
提供了表中的列信息,详细描述了某张表的所有列以及每个列的信息
3.1.5 MySQL库:
MySQL的核心数据库,主要负责存储数据库中的用户、权限设置、关键字等MySQL自己需要使用的控制和管理信息
内存数据库,数据放在内存中直接操作的数据库,相对于磁盘,内存中的数据读写更快
3.1.7 sys库:
通过这个数据库,可以查询谁使用了最多的资源,基于IP或者用户,哪张表被访问过最多等等
3.2 数据库操作(复习)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 1.注释
2.创建用户(mysql8.x) create user test@"host" identified by "password" with_native_password; 3.show databases; 4.查看当前使用的库 select database(); 5.查看版本 select version(); 6.查看当前登录数据库的用户 select user(); 7.查看数据路径 select @@datadir; 8.查看mysql安装路径 select @@basedir; 9.查看安装mysql的系统 select @@version_compile_os;
|
三、防止SQL注入的方法
SQL注入的问题最终可以归结到用户的对输入的控制,有输入的地方就可能存在风险。
SQL注入的防御要从代码入手
3.1数据类型判断防止数字型注入
数字型注入的防御方法相对较容易:
- 强类型语言如Java,c#等存在数字型注入的风险极低
- 在程序中严格判断参数的数据类型人,如is_numeric(),ctype_digit()等
3.2 特殊字符转移防止字符型注入
- 程序判断字符串中是否存在敏感字符,如单引号,双引号等
- 如果存在,则根据相应的数据库进行转义,具体转义方法可参考OWASP ESAPI
3.3 使用预编译的语句
如Java中的prepaedStatement,但是该语句中的参数只能传递不能拼接
3.4 框架技术
具有代表性的框架有Hibernate,Mybatis,JORM等
- Hibernate是跨平台的,依然存在注入的风险
- 对象关系映射注入也成为ORM注入
- Hibernate自定义了一种HQL的语言,使用此语言时不能使用拼接,否则可能造成SQL注入
- Hibernate最好使用参数名称或位置绑定的方式传递参数,类似于preparedStatement
3.5 存储过程中的SQL注入问题
存储过程具有较高的安全性,但是若编写不当也可能存在SQL注入漏洞