sql注入漏洞介绍与防护(网络安全)-爱代码爱编程
一、什么是SQL注入漏洞
SQL注入漏洞是一种常见的网络安全漏洞,指的是攻击者通过在输入参数中插入恶意的SQL语句,从而使得应用程序执行了未经授权的数据库操作。这种攻击手法通常出现在Web应用程序中。黑客可以通过修改应用程序中的SQL查询语句或者直接构建一个伪造的SQL查询指令来实现对数据库的非法访问,并获取敏感信息。将恶意的SQL脚本嵌入其中,从而篡改数据、窃取用户信息、甚至完全控制服务器。
二、SQL注入型
SQL注入漏洞有多种形式,以下是一些常见的SQL注入形式:
1、基于字符串拼接的注入:当应用程序将用户提供的输入直接拼接到SQL查询语句中时,攻击者可以通过在输入中插入SQL语句片段改变原始查询的意图。
select * from users where username = ' + userInput + ';
攻击者可以在userInput中输入' OR '1'='1' --来绕过用户名验证,获取所有用户的信息。
2、基于注释符的注入:攻击者使用SQL注释符(例如–)来终止正常的SQL查询,然后添加自己的恶意代码。
select * from users where username = 'admin' -- ' and password = '123456';
在这个例子中,' and password = '123456';部分被注释掉了,攻击者成功绕过密码验证。
3、基于布尔盲注的注入:攻击者利用应用程序对查询结果的响应来判断自己的注入是否成功。通过构建恶意的条件语句并观察应用返回的页面或响应时间等信息,来推测出数据库中的数据。
select * from users where id = 1 and substring((select password from users where username = 'admin'), 1, 1) = 'a';
攻击者可以通过逐个字母地检查密码字段的值,并观察页面响应来获取管理员的密码。
三、判断SQL有没有注入点
判断SQL注入点的方法很多,以下是一些常用的SQL注入点判断语句:尝试在输入参数中添加一个单引号 ’ ,观察是否会产生SQL语法错误。
例如,假设存在以下查询:
select * FROM users where username = '<input>';
尝试输入 ' OR 1=1; --,如果查询结果返回所有用户信息,那么可能存在SQL注入点。语法错误测试: 尝试在输入参数中添加一些SQL语法错误,观察是否会产生异常或错误消息。
尝试输入 1 OR 1=1; delete from users;,如果出现语法错误,或者用户表中的数据被删除,那么可能存在SQL注入点。
可以尝试输入 ' union select username, password from users; --,如果查询结果中包含用户表的用户名和密码,那么可能存在SQL注入点。
四、SQL基础要点
1.MYSQL5.0以上版本:
自带的数据库名information_schema,遇见的数据库基本都是5.0以上。
2. 各对应名:
information_schema:存储数据库下的数据库名及表名,列名信息的数据库
information_schema.schemata:记录数据库名信息的表
information_schema.tables:记录表名信息的表
information_schema.columns:记录列名信息表
schema_name:information_schema.schemata记录数据库名信息的列名值
table_schema:information_schema.tables记录数据库名的列名值
table_name:information_schema.tables记录表名的列名值
column_name:information_schema.columns记录列名的列名值
细节:查询的结果很多,需要全部显示加上group_concat(),在末尾加上limit 0,1显示第一条数据,limit 0,2 显示第二条数据。后面的数据代表显示多少行从第一个数字后面开始不包括第一个数字的范围。
五、SQL注入点会发生在哪些参数里面
1、用户名和密码:
当用户登录时,用户名和密码通常是作为输入参数传递给数据库查询。如果应用程序没有正确验证和过滤这些参数,攻击者可能通过注入恶意的SQL语句来绕过认证机制。
2、URL 参数:
URL 中的参数,尤其是在动态网页中,可能会被直接拼接到SQL查询中。如果应用程序在构建 SQL 查询时没有正确处理这些参数,攻击者可以通过修改 URL 参数来进行注入攻击。
3、表单数据:
表单提交的数据也需要进行合理的验证和过滤。如果应用程序在接收表单数据后没有正确处理和转义特殊字符,那么攻击者可以利用表单参数进行注入攻击。
4、Cookie 数据:
Cookies 可能包含用户的敏感信息,并且在应用程序中会被使用。如果应用程序没有正确处理和验证 Cookies 中的数据,攻击者可以通过注入攻击来获取或篡改用户的信息。
5、HTTP 头部:
HTTP 请求中的头部信息也可能被应用程序使用到。如果应用程序在处理头部信息时没有进行适当的验证和过滤,攻击者可以通过注入攻击来利用头部信息进行攻击。
六、SQL盲注
盲注:就是在注入过程中,获取的数据不能回显至前端页面。我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。
1、基于布尔的SQL盲注-逻辑判断
regexp,like,ascii,left,ord,mid
2、基于时间的SQL盲注-延时判断
if,sleep
3、基于报错的SQL盲注-报错回显
floor,updatexml,extractvalue
延迟:
and sleep(1);
and if(1>2,sleep(1),0);
and if(1<2,sleep(1),0);
布尔:
and length(database())=7;
and left(database(),1)='p';
and left(database(),2)='pi';
and substr(database(),1,1)='p';
and substr(database(),2,1)='i';
and ord(left(database(),1))=112;
报错:
and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)
and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));
七、如何防护SQL注入攻击
1、使用参数化查询或预处理语句:对于静态SQL查询,使用参数化查询,将用户输入的数据作为参数传递给查询,而不是直接拼接到SQL语句中。对于动态生成SQL语句的情况,使用预处理语句,确保用户输入的数据被正确地转义和处理。
2、输入验证和过滤:对用户输入的数据进行验证,确保输入符合预期的格式和类型。例如,检查输入是否是数字、长度是否在有效范围内等。对用户输入的数据进行过滤,移除或转义特殊字符。使用数据库或编程语言提供的函数或API来实现输入过滤和转义。
3、最小权限原则:给予数据库用户最小限度的权限。确保数据库用户只具有执行必要操作的权限,并限制其对敏感数据和表的访问。
4、错误处理和日志记录:不要向用户显示详细的错误消息,尤其是包含数据库相关信息的错误。显示友好的错误消息,同时将详细的错误信息记录到服务器端的日志中,以供后续审计和调试使用。
5、检查更新数据库软件和框架:定期更新和修补数据库软件和应用程序所使用的框架和库,以确保已经修复了已知的安全漏洞。
6、安全审计和代码审查:定期进行安全审计,检查应用程序中是否存在潜在的SQL注入漏洞。进行代码审查,特别是关注与用户输入相关的部分,确保输入的数据被正确验证、过滤和处理。