一、mysql常用语句
mysql -u root -p
show databases # 查看那些数据库
use 数据库名 #进入指定数据库
show tables # 查看数据库中有哪些表
desc 表名 # 查看数据
show create table 表名 # 查看表的细节
select version(); # 查询当前数据库版本
select @@version; # 查询数据库版本
select user(); # 查看当前用户
order by 1; # 指定第几列进行排序
数据库操作:
create database mytest; # 创建名为mytest的数据库
alter database mytest character set utf8; # 修改数据库编码为utf8
show create database mytest; # 查看数据库状态
drop database mytest; # 删除数据库
select database();# 查询当前使用的数据库是哪一个
表操作:
create table tablename(column_name1 colunm_type1, column_name2 colunm_type2); # 创建表
alter table 表名 drop column 列名; # 删除指定列
alter table 表名 add column 列名 column_type; # 添加列
alter table 表名 change 旧列名 新列名 新列名属性; # 修改列名
alter table 表名 modify 列名 新的列名属性; # 修改列属性
show create table 表名; # 查看创建表的语句
desc 表名; # 查看表结构
例子:创建数据表library
CREATE TABLE IF NOT EXISTS `library`(
`lib_id` INT UNSIGNED AUTO_INCREMENT,
`lib_title` VARCHAR(100) NOT NULL,
`lib_author` VARCHAR(40) NOT NULL,
`submission_date` DATE,
PRIMARY KEY ( `lib_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
重点语句
查询表中数据
select * from 表名; # 查询表中所有内容
select name from users; # 查询 users 表中 name 值;
select * from users where age<30; # where条件语句,可以写 "=" ">" "<"
select * from users limit 1,2; # limit 第一个参数是指定开始位置,第二个参数是个数
插入数据
insert into table_name values(值1, 值2, ......);
insert into table_name (列1, 列2,...) VALUES (值1, 值2,....);
删除数据
delete from 表名 [WHERE Clause]; # 删除指定条件的语句
delect from 表名; # 删除所有数据
更新数据
update 表名 SET 字段1=new-value1, 字段2=new-value2 [WHERE Clause]; # 指定条件更新
语句
二、SQL注入概念
SQL注入是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的。本质是修改当前查询语句的结构,从而获得额外的信息或执行内容。
原理:
用户查询某个信息或者进行订单查询业务时,用户提交相关查询参数,服务器收到参数后进行处理,再将处理后的参数提交到数据库进行查询,之后,将数据库返回的结果显示在页面上,这样就完成了一次查询的过程。但如果用户提交的数据中拼接了查询语句,恰好服务器没有对用户输入的参数进行有效过滤,那么数据库就会根据用户提交的语句进行查询,返回更多信息。
1. 产生原因
通常有一下几点:
- 参数处理问题:
对用户参数进行了错误的类型处理。
转义字符处理环节产生遗漏或可被绕过。 - 服务配置问题:
不安全的数据库配置。
Web应用对错误的处理方式不当:不当的类型处理、不安全的数据库配置、不合理的查询集处理、不当的错误处理、转义字符处理不当、多个提交处理不当。
2. 攻击分类
根据前台的数据是否回显和后台安全配置及防护情况进行区分,主要有两种类型:
- 回显注入
- 盲注
影响SQL注入过程的主要有以下几个方面:
- 数据库是否开启报错请求。
- 服务器端是否允许数据库报错展示。
- 有过滤代码机制
- 服务器开启了参数化查询或对查询过程预编译
- 服务器对查询进行了限速
三、攻击流程
典型的攻击流程如下:
- 判断Web系统使用的脚本语言,发现注入点,并确定是否存在sql注入漏洞
- 判断Web系统的数据库类型
- 判断数据库中表及其相应字段的结构
- 构造注入语句,得到表中的数据内容
- 查找网站管理员后台,用得到的管理员账号和密码登录
- 结合其他漏洞,得到服务器的WebShell并持续链接
- 进一步提权,得到服务器的系统权限
sql手工注入的思路:查找注入点、查库名、查表名、查字段名、查重点数据
1. 常用检测语句如何识别SQL注入
2. Mysql注入常用函数
函数名称 | 函数功能 |
---|---|
system_user() | 系统用户名 |
user() | 用户名 |
current_user() | 当前用户名 |
session_user() | 连接数据库的用户名 |
database() | 数据库名 |
version() | 数据库版本 |
@@datadir | 数据库路径 |
@@basedir | 数据库安装路径 |
@@version_compile_os | 操作系统 |
count() | 返回执行结果数量 |
concat() | 没有分隔符地连接字符串 |
concat_ws() | 有分隔符地连接字符串 |
group_concat() | 连接一个组的所有字符串,并以逗号分隔每一条数据 |
load_file() | 读取本地文件 |
into outfile | 写文件 |
ascii() | 字符串的ASCII代码值 |
ord() | 返回字符串第一个字符的ASCII值 |
mid() | 返回资格字符串的一部分 |
substr() | 返回一个字符串的一部分 |
length() | 返回字符串的长度 |
MySql内置数据库 information_schema
information_schema:提供访问数据库元数据的方式,其中保存着关于MYSQL服务器所维护的所有其他数据库的信息,如数据库名,数据库的表,表的数据类型与访问权限等。因此可利用SQL注入方式,通过远程注入查询语句方式实现直接读取MySql数据中information_schema库的信息。
3. 查询数据的核心语法
功能名称 | 查询语句 |
---|---|
查库 | select schema_name from information_schema.schemata |
查表 | select table_name from information_schema.tables where table_schema=库名 |
查列 | select column_name from information_schema.columns where table_name=表名 |
查数据 | select 列名 from 库名.表名 |
4. 联合查询
sql语法:
select * from users union select 1,2,3; # 联合查询要保证两次查询的列数相等
union select 1,2,3 -- -
order by ? # 帮我们确定数据表中有多少列数据,二分法快速判定
5. 报错注入
select * from users where id=1 and (select 1 from (select count(),concat(user(),floor(rand(0)2))x
from information_schema.tables group by x)a);
select * from users where id=1 and updatexml(1,concat(0x7e,(select user()),