一、什么是 SQL 注入?
SQL 注入是一种常见的 Web 安全漏洞,它发生在应用程序与数据库交互的过程中。当应用程序没有对用户输入的数据进行充分的验证和过滤,攻击者就可以通过构造恶意的输入数据,将 SQL 语句插入到应用程序提交给数据库的查询中,从而改变查询的逻辑,获取敏感信息、篡改数据或者执行其他恶意操作。
例如,假设一个登录页面的 SQL 查询是这样的:
SELECT * FROM users WHERE username = '$username' AND password = '$password';
如果用户输入的用户名是admin,密码是123456,那么这个查询会正常执行,验证用户的登录信息。但是,如果攻击者输入用户名是admin' --,密码随便输入一个值,那么这个查询就变成了:
SELECT * FROM users WHERE username = 'admin' --' AND password = 'any_value';
在这个例子中,--是 SQL 中的注释符号,后面的密码验证部分被注释掉了,这样攻击者就可以绕过密码验证,成功登录系统。
二、SQL 注入的危害
-
窃取敏感信息:攻击者可以通过 SQL 注入获取数据库中的用户密码、信用卡信息、个人身份信息等敏感数据。
-
篡改数据:攻击者可以修改数据库中的数据,例如修改用户的账户余额、订单状态等。
-
执行恶意操作:攻击者可以利用 SQL 注入执行数据库中的存储过程、删除数据库表、甚至获取服务器的操作系统权限。
三、如何检测 SQL 注入攻击?
-
代码审查:仔细审查应用程序的源代码,特别是与数据库交互的部分,查找可能存在 SQL 注入漏洞的地方。例如,检查是否有直接将用户输入的数据拼接到 SQL 语句中的情况。
-
漏洞扫描工具:使用专业的漏洞扫描工具对应用程序进行扫描,这些工具可以检测出常见的安全漏洞,包括 SQL 注入。
-
手动测试:通过手动输入一些恶意的输入数据,观察应用程序的反应,看是否存在 SQL 注入漏洞。例如,可以尝试输入一些包含 SQL 关键字或特殊字符的用户名和密码。
四、如何预防 SQL 注入攻击?
(一)使用参数化查询
参数化查询是一种防止 SQL 注入的有效方法。它将用户输入的数据作为参数传递给 SQL 查询,而不是将用户输入的数据直接拼接到 SQL 语句中。这样,数据库会将用户输入的数据视为值,而不是 SQL 代码,从而防止 SQL 注入攻击。
例如,在 PHP 中使用 PDO(PHP Data Objects)进行参数化查询:
$stmt = $pdo->prepare("SELECT * FROM users WHERE username =? AND password =?"); $stmt->execute([$username, $password]);
在 Java 中使用 JDBC(Java Database Connectivity)进行参数化查询:
PreparedStatement stmt = connection.prepareStatement("SELECT * FROM users WHERE username =? AND password =?"); stmt.setString(1, username); stmt.setString(2, password); ResultSet rs = stmt.executeQuery();
(二)输入验证和过滤
对用户输入的数据进行严格的验证和过滤也是防止 SQL 注入的重要措施。可以使用正则表达式、白名单等方法来验证用户输入的数据是否符合预期的格式和范围。例如,可以限制用户名只能包含字母、数字和下划线,密码必须满足一定的长度和复杂度要求等。
(三)最小权限原则
在数据库中,应该遵循最小权限原则,即用户只应该被授予执行其任务所需的最小权限。这样,即使攻击者成功进行了 SQL 注入攻击,也只能执行有限的操作,而不会对整个数据库造成严重的破坏。
(四)定期更新和维护
定期更新数据库软件和应用程序,修复已知的安全漏洞,也是防止 SQL 注入攻击的重要措施。同时,应该定期对数据库进行备份,以便在发生安全事件时能够快速恢复数据。
五、SQL注入常用语句
SQL注入常用语法----SELECT特殊查询用法
查看时间
select now();

查看当前选择的是哪个数据库
select database();

查看版本
select version();

查看当前登录数据库的用户
select user();

查看数据路径
select @@datadir;** **

查看mysql安装路径
select @@basedir;

查看mysql安装的系统
select @@version_compile_os;

查询数据
查所有字段select * from mysql.user;
查某几个比较重要的字段select user,host from mysql.user;

SQL注入常用语法----WHERE条件用法
where用于指定查询条件
查看用户为root的用户信息
select user,host from mysql.user where user = 'root';

SQL注入常用语法----CREATE创建库、表后的相关用法
创建库
create database test charset utf8mb4;
test为表名, utf8mb4为字符编码

创建表
使用刚刚创建的数据库use test
创建一个表create table t1(id INT);
t1为表名, id为字段, INT为字段类型

添加字段
alter table t1 add name varchar(32);
t1为要修改的表名, name为增加的字段名, varchar(32)是字段类型

查看添加t1表的字段
desc t1;

插入数据
insert into t1 value (1,"aa"),(2,"bb"),(3,"cc");

多条件查询—and
为了方便演示,在数据库test中再插入一条name为aa的数据insert into t1 value (4,"aa")
然后查询name为aa,id为1的数据select * from test.t1 where name = "aa" and id =1;

多条件查询—or(重要!!!)
and是必须两个条件都成立,or是前后成立一个条件即可,在sql注入里经常使用or 1=1,因为1=1这个条件必然成立,就不用关其他条件是什么了
select * from test.t1 where name = "aa" or 1=1;
因为1=1必然成立,查询语句会直接忽略name=“aa”,因此并没有查询name为aa的数据,而是查询了所有的数据。

联合查询—union(重要!!!)
union可用于将两个sql语句联合起来,把结果合并在一个结果集里
select * from test.t1 union select 1,2;

前半部分select* from test.t1查询了t1表的全部数据
后半部分select 1,2可以用于测试该表中有多少个字段,具体用法如下:
使用
select * from test.t1 union select 1;会报错,因为select 1的字段只有1个,而select * from test.t1的字段有两个,字段个数不匹配因此会报错。可以通过这种报错进行字段数量的探测,字段数量不一致会报错,字段数量一致则不会报错。
增加字段进行探测,使用select * from test.t1 union select 1,2;探测成功,该t1表的字段暴露

删除表
drop table t1;

SQL注入常用语法—特殊表的使用
information_schema.SCHEMATA表
先看下information_schema.SCHEMATA表里有哪些字段:
select * from information_schema.SCHEMATA;

可以发现show databases;等价于select SCHEMA_NAME from information_schema.SCHEMATA;

information_schema.TABLES表
先看下information_schema.SCHEMATA表里有哪些字段:
select * from information_schema.TABLES;

查看指定数据库的表信息
select * from information_schema.TABLES where table_schema = "test";

查看指定数据库的列信息
select * from information_schema.COLUMNS where table_schema = "test";

网络安全学习路线&学习资源
下面给大家总结了一套适用于网安零基础的学习路线,应届生和转行人员都适用,学完保底6k!就算你底子差,如果能趁着网安良好的发展势头不断学习,日后跳槽大厂、拿到百万年薪也不是不可能!

需要高清完整学习路线图,和全套网络安全技术教程的小伙伴!
↓↓↓ 扫描下方图片即可前往获取↓↓↓
学习资料电子文档
压箱底的好资料,全面地介绍网络安全的基础理论,包括逆向、八层网络防御、汇编语言、白帽子web安全、密码学、网络安全协议等,将基础理论和主流工具的应用实践紧密结合,有利于读者理解各种主流工具背后的实现机制。

网络安全源码合集+工具包
视频教程
很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,,每个章节都是当前板块的精华浓缩。(全套教程点击领取哈)

因篇幅有限,仅展示部分资料,需要扫描下方图片即可前往获取

好了就写到这了,大家有任何问题也可以随时私信问我!希望大家不要忘记点赞收藏哦!
特别声明:
此教程为纯技术分享!本文的目的决不是为那些怀有不良动机的人提供及技术支持!也不承担因为技术被滥用所产生的连带责任!本书的目的在于最大限度地唤醒大家对网络安全的重视,并采取相应的安全措施,从而减少由网络安全而带来的经济损失。!!!

3527

被折叠的 条评论
为什么被折叠?



