SQL注入概述

image-20250210100658794

SQL

  结构化查询语言(Structured Query Language)简称SQL,一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。

  结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统, 可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。

漏洞原理

  • 造成SQL注入漏洞的原因在于程序员编写程序时,没有对客户端提交的数据进行严格的过滤和判断,导致用户可以修改构造参数,提交SQL语句并传递到服务器端,从而获取想要的敏感信息,甚至进行执行危险的代码或者系统命令。
  • SQL注入原理:服务器端没有严格校验客户端发送的数据,从而导致服务器端的SQL语句被恶意修改并且成功执行的行为。
  • SQL注入成功的核心:1.用户可以控制参数,2.拼接到后端代码中的语句成功执行。

可能出现的位置点

只要与数据库产生交互的地方,都有可能存在SQL注入!

  • URL传参
  • HTTP的请求头
  • 新闻/商品等可以进行查询的地方
  • 登录框/注册框/找回密码/修改密码等表单处
  • 搜索框
  • ……

漏洞危害

输入验证

  • 对所有用户输入进行验证 :包括 URL 参数、表单数据、HTTP 头等,确保输入符合预期的数据类型、格式和长度。
  • 过滤特殊字符 :在应用程序层面,禁止或转义用户输入中的特殊字符,如分号 ;、单引号 '、双引号 "、反引号 等,以防止攻击者构造恶意 SQL 语句。例如,可以使用 PHP 中的 mysql_real_escape_string()` 函数对字符串进行转义处理。

使用参数化查询

  • 采用预编译语句 :利用参数化查询(如 Java 的 PreparedStatement、Python 的 paramstyle 等),将 SQL 语句和数据分离,预先定义 SQL 语句结构,然后为每个用户输入分配占位符(如 ?:name),在执行时将实际数据作为参数传入。这可以有效防止 SQL 注入,因为数据库驱动程序会处理占位符的值,而不受恶意构造的输入影响。例如,以下是一个使用 PHP 的 PDO 预处理语句的示例:

php复制

1
2
3
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = ? AND password = ?');
$stmt->execute([$username, $password]);
$user = $stmt->fetch();
  • 避免拼接 SQL 语句 :不要将用户输入直接拼接到 SQL 查询字符串中,以免攻击者通过注入恶意代码篡改 SQL 逻辑。

权限控制

  • 限制数据库账户权限 :为 Web 应用创建专门的数据库账户,并遵循最小权限原则,仅授予其访问和操作必要数据表的权限。例如,如果应用程序仅需要读取数据,就不应授予写入权限。
  • 避免使用特权账户 :不要使用数据库管理员账户(如 saroot)连接应用程序,因为一旦攻击者通过 SQL 注入获取控制权,将能够对整个数据库进行无限制的操作。

数据库设计安全

  • 严格限定数据库对象权限 :为每个表、视图、存储过程等数据库对象设置合理的权限,避免过度授权。
  • 对敏感数据加密存储 :对于密码、密钥、信用卡号等敏感信息,应采用加密或哈希算法(如 bcryptSHA-256 等)进行存储。
  • 注意表和字段命名约定 :避免使用过于明显的表名和字段名,可适当添加前缀或后缀,增加攻击者猜测表结构的难度。

启用 Web 应用防火墙(WAF)

  • 配置 SQL 注入规则 :WAF 可以拦截包含常见 SQL 注入特征(如 UNION SELECTDROP TABLE 等)的请求。例如,ModSecurity 是一个流行的开源 WAF,可以使用其规则集来检测和阻止 SQL 注入攻击。

更新和维护软件

  • 及时打补丁 :定期更新数据库管理系统、Web 服务器、应用程序框架和所有相关软件,以修复已知的安全漏洞。
  • 使用安全的数据库版本和配置项 :选择安全的数据库版本,并按照最佳实践配置数据库,如关闭不必要的功能和服务。

安全审计和监控

  • 记录日志 :在数据库和应用程序层面记录详细的访问日志和操作日志,包括用户活动、参数值、错误信息等,以便在发生安全事件时进行溯源和分析。例如,可以记录所有对数据库的查询、修改操作,以及登录尝试。
  • 监控异常流量和行为 :实时监控 Web 应用程序和数据库的流量、响应时间、错误率等指标,以及对数据库的异常访问模式(如短时间内大量重复的查询),及时发现潜在的注入攻击。
  • 定期进行安全审计和渗透测试 :由专业的安全团队或使用自动化工具定期对应用程序和数据库进行安全审计和渗透测试,查找潜在的 SQL 注入漏洞和其他安全问题。

注入类型

按照数据类型分类:数字型、字符型。

按照HTTP请求方法分类:GET型注入、POST型注入。

按照注入方式分类:

  • 联合注入(union注入)
  • 报错注入
  • 盲注(时间型盲注与布尔型盲注)
  • 堆叠注入
  • 宽字节注入
  • 二次注入
  • cookie注入
  • 编码注入
  • XFF注入(X-Forwarded-For)
  • DNS外带注入
  • ……