sql注入概述| 青训营笔记

194 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第4篇笔记。

什么是sql注入?

通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手段之一。

SQL注入攻击实现过程

    SQL注入攻击可以手工进行,也可以通过SQL注入攻击辅助软件如HDSI、Domain、NBSI等,其实现过程可以归纳为以下 几个阶段:

graph TD
寻找SQL注入点 --> 获取和验证SQL注入点 --> 获取信息 --> 实施直接控制 --> 间接进行控制
  1. 寻找SQL注入点;寻找SQL注入点的经典查找方法是在有参数传入的地方添加诸如“and 1=1”、“and 1=2”以及“’”等一些特殊字符,通过浏览器所返回的错误信息来判断是否存在SQL注入,如果返回错误,则表明程序未对输入的数据进行处理,绝大部分情 况下都能进行注入。
  2. 获取和验证SQL注入点;找到SQL注入点以后,需要进行SQL注入点的判断,常常采用1中的语句来进行验证。
  3. 获取信息;获取信息是SQL注入中一个关键的部分,SQL注入中首先需要判断存在注入点的数据库是否支持多句查询、子查询、 数据库用户账号、数据库用户权限。如果用户权限为sa,且数据库中存在xp_cmdshell存储过程,则可以直接转4。
  4. 实施直接控制;以SQL Server 2000为例,如果实施注入攻击的数据库是SQL Server 2000,且数据库用户为sa,则可以直接添加管理员账号、开放3389远程终端服务、生成文件等命令。
  5. 间接进行控制。间接控制主要是指通过SQL注入点不能执行Dos等命令,只能进行数据字段内容的猜测。在Web应用程序中, 为了方便用户的维护,一般都提供了后台管理功能,其后台管理验证用户和口令都会保存在数据库中,通过猜测可以获取这些内容,如果获取的是明文的口令,则可 以通过后台中的上传等功能上传网页木马实施控制,如果口令是明文的,则可以通过暴力破解其密码。

sql注入实例

假设登录时是通过拼接字符串的方式构造动态sql语句,然后到数据库中校验用户名密码是否存在,假设其后台sql语句是:

sql='select * from users where user='&user&' and passwd='&passwd&'

那么我们使用admin做用户名,用'1’ or 'a'='a来做密码的话,那么查询就变成了

select * from users where user= ‘admin’ and passwd='1‘ or 'a'='a'

这样的话,根据运算规则(先算and 再算or),最终结果为真,这样就可以进到后台了。

Go语言sql注入预防方案

从上述攻击过程可以看出,不使用动态拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据查询存取可以实现sql注入的预防。 参数化查询例子:

SELECT * FROM userinfo WHERE username = ? AND password = ?", sename, partname;

参数化查询做了哪些事来防止sql注入?

  • 参数过滤
  • 采用了预编译的方法,先将SQL语句中可被客户端控制的参数集进行编译,生成对应的临时变量集,再使用对应的设置方法,为临时变量集里面的元素进行赋值,而QueryRow()方法会对传入参数进行强制类性检查和安全检查,所以就避免了SQL注入的产生。

青训营项目实践

借助gorm 对所有sql语句实现了预编译的实现,有效防止sql注入语句的产生。