一、SQL注入简介
SQL注入是指攻击者通过在Web表单输入或URL参数中插入(或“注入”)恶意的SQL代码片段,这些代码片段被后端数据库系统错误地当作SQL语句的一部分执行,从而实现对数据库的非法查询、修改、删除等操作。这种攻击方式违背了“数据与代码分离”的基本原则,使得用户输入的数据被当作代码执行,进而引发安全漏洞。
二、SQL注入的产生
了解网站的分类:静态,动态,伪静态
静态:
静态网站是指网站内容以HTML、CSS、JavaScript等静态文件形式存在,用户访问时直接从服务器读取这些文件,无需服务器端处理即可呈现给用户。
安全,不会存在sql注入漏洞
动态:
动态网站是指网站内容通过服务器端脚本(如PHP、ASP.NET、Node.js等)动态生成,根据用户请求和数据库中的数据实时生成HTML页面。
存在安全风险,可能存在SQL注入漏洞
伪静态:
伪静态网站实际上是动态网站的一种优化方式,通过URL重写技术将动态URL转换为看似静态的URL格式。
存在安全风险,可能存在SQL注入漏洞
是否为动态网站可以在控制台借助一个js函数来判断
document.lastModified
多次执行如果返回一个固定的时间则为静态
如果实时变化则为动态
三、SQL注入的原理
SQL注入之所以能够成功,主要基于以下两个核心原理:
- 用户输入可控:Web应用程序在处理用户输入时,未能有效验证和过滤输入数据,使得攻击者能够控制输入内容。
- 输入内容带入数据库查询:用户输入的数据被直接或间接地拼接到SQL查询语句中,并被送入数据库执行。如果输入的是恶意的SQL代码,那么这些代码也会被执行。
例如,在一个简单的登录表单中,用户输入用户名和密码,服务器端可能执行如下SQL查询:
SELECT * FROM users WHERE username = 'input_username' AND password = 'input_password';
如果攻击者提交如下的用户名:
admin' --
则服务器端接收到后可能会形成如下错误的SQL查询:
SELECT * FROM users WHERE username = 'admin' -- ' AND password = 'input_password';
注释符--
后面的文本将被视为注释,因此该查询实际上变成了:
SELECT * FROM users WHERE username = 'admin';
这样攻击者无需正确的密码,只需要用户名存在即可成功登录。