SQL注入
大家好,我又来了,这回给大家分享一下自己总结的sql注入学习笔记,sql注入是一个极为重要的漏洞,可能博主总结的有所缺陷,希望大家多多补充,大家一起进步,好了,闲话少扯,直接上干货。
1.SQL注入介绍
SQL注入攻击就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。
(1)造成SQL注入的原因
程序开发过程中不注意书写规范,对sql语句和关键字过滤不严格,导致客户端可以通过全局性变量get或者post提交sql语句到服务器端正常运行。
-
Eg.sql注入万能密码
在搜索框中输入sql语句是select * from user where Id = ’***1‘ and ’1‘ = ’2***‘ 。
SQL注入-万能密码:
SElECT * FROM 'users' where username='[name]' and password='[pass]';
Name=' or 1='1
Password=' or 1='1
SELECT * FROM 'users' where usaername='' or 1='1' and password='' or 1='1';
万能密码练习靶场:https://nuuoj.cn/challenges buuctf[极客大挑战2019]EsaySQL
(2)SQL注入分类(查询数据库分类)
- 按数据类型分:
- 数字型注入(select * from users where id = X)
- 字符型注入(select * from users where id = ‘x’)
- 搜索型注入(select * from database.table where users like ‘%要查询的关键字%’)
- 按数据提交方式分:
- get注入
- post注入
- http头部注入(user-agent、cookie、rerferer、host)
- 其余方式:
- 还有一些常见数据库注入类型:报错注入、盲注、延时注入、宽字节注入、二次注入、堆叠注入等。
(3)SQL注入的危害
- 攻击者未经授权可以访问数据库中的数据,盗取用户的隐私以及个人信息,造成用户的信息泄漏。
- 可以对数据库的数据进行增加或删除操作,例如私自添加或删除管理员账号。
- 如果网站目录存在写入权限,可以写入网页木马。攻击者进而可以对网页进行篡改,发布一些违法信息等。
- 经过提权等步骤,服务器最高权限被攻击者获取。攻击者可以远程控制服务器,安装后门,得以修改或控制操作系统。
(4)自动化注入工具
-
Havij
是一款自动化的SQL注入工具,它能够帮助渗透测试人员 发现和利用Web应用程序的SQL注入漏洞。Havij不仅能够自动挖掘可利用的SQL查询,还能够识别后台数据类型、检索数据的用户名和密码hash、转储表和列、从数据库中提取数据,甚至访问底层文件系统和执行系统命令,当然前提是有一个可利用的SQL注入漏洞。Havij支持广泛的数据库系统,如MsSQL,MySQL,MSAccess and Oracle。Havij支持参数配置以躲避IDS,支持代理,后台登录地址扫描。
-
Sqlmap
是一个自动SQL注入工具。其可胜任执行一个广泛的数据库管理系统后端指纹,检索DBMS数据库、usernames、表格、列、并列举整个DBMS信息。Sqlmap提供转储数据库表以及MySQL、PostgreSQL、SQL Server服务器下载或上传任何文件并执行任意代码的能力。
-
The Mole
是一款开源的自动化SQL注入工具,其可绕过IPS/IDS(入侵防御系统/入侵检测系统)。只需提供一个URL和一个可用的关键字,它就能够检测注入点并利用。The Mole可以使用union注入技术和基于逻辑查询的注入技术。The Mole攻击范围包括SQL Server、MySQL、Postgres和Oracle数据库。
2.SQL注入实例
(1)mysql数据库中的重要函数
-
聚合函数
-
count:
计数函数,对元组或者属性计数。
一般格式:count(属性名)。
select count() from <表名>; /*是对整个表的元组进行计数*/
-
max:
求最大值函数,查询字段中的最大的数。
一般格式:max(属性名)select max(属性名) from 表名 [where 条件表达式];
-
min:
求最小值函数,查询字段中的最小的数。
一般格式:min(属性名)select min(属性名) from 表名 [where 条件表达式];
-
avg:
求平均值函数,查询字段中所有数的平均值。
一般格式:avg(属性名)select avg(属性名) from 表名 [where 条件表达式];
-
sum:
求和函数,查询属性中所有数的和。
一般格式:sum(属性名)select sum(属性名) from 表名 [where 条件表达式]; /*除了通过函数计算还能直接用运算符计算*/ select 属性名1*2,属性名2+属性名3 from 表名;
-
-
数学函数
-
abs:
返回X的绝对值
格式: abs(x)select abs(-10),abs(12);
-
round:
四舍五入函数。
一般格式:round(数值类型[,精确位数]);select round(1234.56); /*不加精确位数默认精确到整数位*/ select round(123.456,2); /*加上精确位数就保留多少位小数*/
-
MOD:
mod(a,b) a除以b的余数
-
rand:
获取随机数,随机数的范围在0~1之间,生成小于1的浮点小数
生成范围在0~9之间的数据select rand()*10;
-
-
三角函数
-
PI:
数据库提供了直接获取 PI 值的函数
PI() 求圆周率 -
power:
求次方函数
一般格式:power(底数,指数);
select power(2,3); # 求2的3次方的值 #可以用pow函数代替power函数 select pow(2,3); #求次方根(开方) pow(9,1/2); pow(4,0.5) #只需要把指数改一下
-
-
日期时间函数
-
now:
求当前的日期和时间。
一般格式:now()。
select now();
-
date:
求出日期的格式的函数
一般格式:date(日期时间类型的属性名)。
select date(birthday) from student;
-
time:
求时间函数的格式的函数。
一般格式:time(日期时间类型的属性名)
select time(birthday) from student;
-
date_format:
时间日期类型转字符串类型函数。
一般格式: date_format(日期时间类型,格式字符串)
/* %Y 年 %y 年(保留后2位) %M 月份英文单词 %m 数字月份 %d 日期 #D 数字th %H 时(24小时制) %h 12时制 %i 分 %s 秒 */ select date_format(now(),'%Y%m%d:%H%i%s'); #注意:大小写格式会有不一样的输出
-
-
***字符处理函数***:
-
upper:
小写字母转大写字母函数。
一般格式:upper(字符型属性名);
select upper('abc');
-
lower:
大写字母转小写字母函数。
一般格式:lower(字符型属性名);
select lower('ABC'); #也可用 lcase 函数代替 select lcase(‘ABC’);
-
substring:
提取字串函数,以给定的参数求字符串中的一个子串。
mysql 中,字符串数据下标从1开始
格式: substring(字符串,start,length); 从字符串中第start个字符开始取出长度为length的字符串。
## 要被提取的字符串 ## start 开始提取的位置 ## end 提取的数量 subsring("string",start,end); ############# select substring('abc123@#$',4,3);# 结果为123 #也可以用mid函数代替 select mid(‘abc123@#$’,4,3);
-
concat:
字符串拼接函数
格式: concat(字符串,字符串…)
char_length() 求字符串长度
-
insert:
字符串 string2 替换 string1 的 x 位置开始长度为 len 的字符串
/* string1 准备替换的字符串 x 开始位置 len 替换的长度 如果是0,就是从该位置进行插入 string2 替换的字符串 */ insert(string1,x,len,string2)
-
locate:
从字符串 s 中获取 s1 的开始位置
locate(substr,str) :返回子串 substr 在字符串 str 第一个出现的位置,如果 substr 不是在 str`里面,返回0
locate(s1,s)
-
length:
length(string) :返回字符串 string 的长度。
-
ASCII:
ASCII( str )
返回字符串 str 字符中的ASCII代码值。如果 str 是空字符串,返回0。
如果 str 是NULL,返回NULL。select ASCII('a'); #注意:只能显示一个字符的 ASCII 码值
-
-
***高级函数***:
-
md5:
不可逆的加密验证函数
-
bin:
bin(x) 返回二进制编码
-
binary:
binary(s) 将字符串 s 转换为二进制字符串
-
database:
返回当前数据库名
-
-
***分组查询***:
-
group by:
select 属性名1,属性名2,…,属性名n from 表名 group by 属性名(1~n) [having 条件表达式]; #注意:分组过后不能用where进行条件筛选,需要用having #where:从数据源去掉不符合搜索条件的数据 #having:在分好的组中去掉每组不符合条件的数据
-
(2)sql注入获取数据
手动注入过程:判断是否存在注入点➡️判断字段长度➡️判断字段回显位置➡️拿数据(库表字段数据)
(3)sql注入—寻找SQL注入点练习
-
Sqli-labs:
–Less-1
–Less-2
–Less-3
盲注函数:
-
MID(column_name,start[,length]):
string(必需)规定要返回其中一部分的字符串。
start(必需)规定开始位置(起始值是 1)。
length(可选)要返回的字符数。 -
string substr(string, start,length):截取字符串
-
Left(string,n):表示的是从字符表达式最左边一个字符开始返回指定数目的字符.若 b 的值大于 a 的长度,则返回字符表达式的全部字符a.如果 b 为负值或 0,则返回空字符串.
一般用来猜测库的名字 -
length():计算数据库长度
-
3.攻击特征
(1)注释符
- #
- --
- /* */
- --+
(2)http状态码
- 200:OK
- 204:NO CONTENT
- 403:Forbidden
- 404:Not Found
- 500:Internal Server Error
4.SQL注入防护
- 安全狗软件:能够拦截sql注入。
sql注入防护措施
- 严格限制Web应用的数据库的操作权限,给此用户提供仅仅能够满足其工作的最低权限,从而最大限度的减少注入攻击队数据库的危害。
- 检查输入的数据是否具有所期望的数据格式,严格限制变量的类型。
- 对进入数据库的特殊字符(" ’ \尖括号&*;等)进行转义处理,或编码转换。text/template包里面的HTMLEscapeString函数可以对字符串进行转义处理。
- 所有的查询语句建议使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入 变量嵌入到SQL语句中,即不要直接拼接SQL语句。
- 在应用发布之前建议使用专业的SQL注入检测工具进行检测,以及时修补被发现的SQL注入漏洞。网上有很多这方面的开源工具,例如sqlmap等。
- 避免网站打印出SQL错误信息,比如类型错误、字段不匹配等,把代码里的SQL语句暴露出来,以防止攻击者利用这些错误信息进行SQL注入。
5.利用工具
(1)sqlmap介绍
sqlmap是一个开源的渗透工具,它可以自动化检测和利用SQL注入缺陷以及接管数据库服务器的过程。他有一个强大的检测引擎,许多适合于终极渗透测试的小众特性和广泛的开关,从数据库指纹、从数据库获取数据到访问底层文件系统和通过外带接在操作系统上执行命令。
(2)sql注入参数
- -u #注入点
- -g 谷歌搜索
- -f #指纹判别数据库类型
- -b #获取数据库版本信息
- -p #指定可测试的参数(?page=1&id=2 -p"page,id")
- -D “” #指定数据库名
- -T “” #指定表名
- -C “” #指定字段
- -s “” #保存注入过程到一个文件,还可中断,下次恢复在注入(保存:-s “xx.log” -resume)
- -columns #列出字段
- -current-user #获取当前用户名称
- -current-db #获取当前数据库名称
- -users #列出数据库所有用户
- -passwords #数据库用户所有密码
- -privileges #查看用户权限(-privileges -U root)
- -U #指定数据库用户
- -dbs #列出所有数据库
- -tables -D “” #列出指定数据库中的表
- -columns -T “user” -D “mysql” #列出mysql数据库中的user表的所有字段
- -dump-all #列出所有数据库所有表
- -exclude-sysdbs #只列出用户自己新建的数据库和表
- -dump -T “” -D “” -C “” #列出指定数据库的表的字段的数据(-dump -T users -D master -C surname)
- -dump -T “” -D “” -start 2 -top 4 #列出指定数据库的表的2-4字段的数据
- -dbms #指定数据库(MySQL,Oracle,PostgreSQL,Microsoft SQL Sever,Microsoft Access,SQLite,Firebird,Sybase,SAP,MaxDB)
- -os #指定系统(Linux,Windows)
- -sql -shell 写shell
- -delay 延迟的时间
- -m 可以执行多个url
- –lever 3 --risk 5 调整SQL注入的强度
Eg.sql注入参数的实例
- sqlmap -u http://www.evil0x.com/ test.php?p=2 -f -b -current-user -current-db -v 1
意思: 读取当前数据库版本,当前数据库名称,还有当前用户名称
- sqlmap -u http://www.evil0x.com/ test.php?p=2 -dbs -v 2
意思:获取所有数据库,-v 2:检测等级
- sqlmap -u http://www.evil0x.com/ test.php?p=2 -dump -D mysql -T users -C “username,password” -s “sqlnmapdb.log” -v 2
意思:获取指定数据库中指定表中的指定字段的数据
好了,SQL注入的知识点给大家分享到这里了,愿大家更进一步,也希望多多支持博主😊,下期我还会继续更新其他漏洞知识的。