THIS IS B3c0me

记录生活中的点点滴滴

0%

SQL注入

一、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
配置用户组
1
groupadd docker
启动docker
1
systemctl start 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
1
service docker restart
拉取SQL镜像
1
docker pull mysql:5.7
将用户添加到docker组
1
sudo gpasswd -a {your user name of linux} docker
重启docker-daemon
1
sudo systemctl restart docker
更新用户组
1
newgrp 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)
1
mysql -uroot -p    

二、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 常见数据库和数据表
3.1.1information_schema库:

是信息数据库,其中保存着关于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.6 performance_schema库:

内存数据库,数据放在内存中直接操作的数据库,相对于磁盘,内存中的数据读写更快

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.注释
-- 注释1 、 #注释2
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注入漏洞

欢迎关注我的其它发布渠道