SQL注入 | 青训营笔记

94 阅读3分钟

这是我参与「第五届青训营 」笔记创作活动的第8天。

引言

今天的课程是关于黑灰产监控与防御的一个科普,主要是讲解了目前国内黑灰产的背景和一些案例,我个人的专业并不是网络安全相关,但接触了数据库安全方面的,因此这篇文章主要是记录自己对于SQL注入相关知识的笔记。


一、什么是SQL注入

SQL注入(SQL Injection)是发生Web程序中数据库层的安全漏洞问题。

攻击者在Web程序中事先定义好的SQL语言中添加其他的SQL语句,在管理员(程序员)等不知情的情况下实现非法操作,来欺骗数据库服务器执行非授权的查询,从而获取数据,从而进行其它违法操作。

造成SQL注入的主要原因 :程序没有对用户输入的数据进行相关的判断和处理

二、SQL注入的原理

1️⃣ 恶意拼接SQL语句

SELECT * FROM sys_user WHERE id = $userId
#恶意拼接后
SELECT * FROM sys_user WHERE id = 1; DELETE FROM sys_user

若执行上述语句那么将会将表中的数据全部删除

2️⃣ 传入非法参数

SQL 语句中传入的字符串参数是用单引号引起来的,如果字符串本身包含单引号而没有被处理,那么可能会篡改原本 SQL 语句的作用。

SELECT * FROM sys_user WHERE user_name = $userName
# 但userName为 zc'pdx
SELECT * FROM sys_user WHERE user_name = 'zc'pdx'

会造成相应的错误

3️⃣ 利用注释

SQL语句可以添加注释

SELECT * FROM sys_user WHERE name=$userName

# userName 包含了恶意的字符串`'gj' AND SLEEP(1000)--`
SELECT * FROM sys_user WHERE name='gj' AND SLEEP(1000)

这会导致恶意查询,消耗资源

4️⃣ 添加额外条件

将查询条件变为真值表达式

UPDATE sys_user SET password=$userPass WHERE user_id=$userId;

#userId 被传入恶意的字符串“123 OR TRUEUPDATE sys_user SET password= '123456' WHERE user_id=1234 OR TRUE;

执行上述被注入攻击的SQL语句会使所有用户的密码都被修改,后果:相当于攻击者知道了当前系统所有用户的密码

三、抵御SQL注入攻击

  1. 对输入的内容(参数)进行过滤

数据提交到数据库之前,把用户输入中的不合法字符剔除掉。我们可以使用编程语言提供的处理函数或自己的处理函数来进行过滤,还可以使用正则表达式匹配安全的字符串。

  1. 采用预编译技术即参数化查询
INSERT INTO sys_user (name, age, sex) VALUES(?, ?, ?)

使用预编译的SQL语句,SQL语句的语义不会是不会发生改变的。预编译语句在创建的时候就已经将指定的SQL语句发送给了DBMS,完成了解析,检查,编译等工作,所以攻击者无法改变SQL语句的结构,只是把值赋给?

参数化查询也是目前使用最多的解决SQL注入问题的技术

四、总结

在开发一个系统时,我们应该避免使用动态SQL,不要将用户的输入数据直接放入SQL语句中,并且对于一些危险操作(删表,删库等)应该设置高权限用户才可执行,系统的普通用户对应数据库来说是最低级别权限的。

其实在上了今天这门关于黑灰产监控与防御的课程后,我才真正意识到系统安全的重要性,一个小小的漏洞不仅危害公司的利益,更是伤害了每一个系统用户的权益,做好系统安全也是在保护每一个系统的用户。

五、引用参考

[1] 青训营课程资料 juejin.cn/post/719438…