什么是 sql 注入?

应用程序在向后台数据库传递(Sql结构化查询语言)查询时,如果为攻击者提供了影响该查询的能力,就会引发Sql注入。
例如:www.xxx.com/products.php?val=100 修改成 www.xxx.com/products.php?val=100 or 1=1
结论是get请求查询,极易被注入。

  1. `select * from product where price = ${val}`
  2. // 拼接时可能变成下面语句,结果看后台程序如何处理,如果处理成下面结构,就存在注入风险
  3. select * from product where price = 100 or 1 = 1

极大危害性

  1. 获取用户相关信息,userId,userName等等

Sql注入的产生过程

1.构建动态的字符串

  1. // 不正确的处理?参数,可能导致被注入
  2. const sql = `select * from i18n_config where key_name = ?`

2.转译字符处理不当

  1. // 最常见的就是 " ' ` 处理不当,导致sql存在注入风险

3.类型处理不当

  1. // 假设某个查询,类型是整型的,所以没有做校验,可能存在风险
  2. `select * from i18n_config_status_data where id = ?`
  3. // 原sql
  4. select * from i18n_config_status_data where id = 10010
  5. // 注入后
  6. select * from i18n_config_status_data where id = '10010' or '1' = '1'

4.查询语句组织不当

有一些后台可能提供动态能力,动态查询哪些表,哪些动态列字段,攻击者可能替换一些值

5.错误处理不当

会导致将详细的错误信息显示给用户或攻击者,这些错误信息会暴露一些实现细节。这些细节会为攻击者提供与网站潜在缺陷相关的重要线索。例如,攻击者可以利用详细的数据库错误信息来提取信息,得知如何操作数据库以便取出附加数据信息。

6.提交处理不当

黑名单是一种除了黑名单以外的内容允许访问的技术,建议使用白名单,只有白名单允许的才允许访问的技术

7.不安全的数据库配置

使用数据库的默认用户名,默认密码等等。