什么是 sql 注入?
应用程序在向后台数据库传递(Sql结构化查询语言)查询时,如果为攻击者提供了影响该查询的能力,就会引发Sql注入。
例如:www.xxx.com/products.php?val=100 修改成 www.xxx.com/products.php?val=100 or 1=1
结论是get请求查询,极易被注入。
`select * from product where price = ${val}`
// 拼接时可能变成下面语句,结果看后台程序如何处理,如果处理成下面结构,就存在注入风险
select * from product where price = 100 or 1 = 1
极大危害性
- 获取用户相关信息,userId,userName等等
Sql注入的产生过程
1.构建动态的字符串
// 不正确的处理?参数,可能导致被注入
const sql = `select * from i18n_config where key_name = ?`
2.转译字符处理不当
// 最常见的就是 " ' ` 处理不当,导致sql存在注入风险
3.类型处理不当
// 假设某个查询,类型是整型的,所以没有做校验,可能存在风险
`select * from i18n_config_status_data where id = ?`
// 原sql
select * from i18n_config_status_data where id = 10010
// 注入后
select * from i18n_config_status_data where id = '10010' or '1' = '1'
4.查询语句组织不当
有一些后台可能提供动态能力,动态查询哪些表,哪些动态列字段,攻击者可能替换一些值
5.错误处理不当
会导致将详细的错误信息显示给用户或攻击者,这些错误信息会暴露一些实现细节。这些细节会为攻击者提供与网站潜在缺陷相关的重要线索。例如,攻击者可以利用详细的数据库错误信息来提取信息,得知如何操作数据库以便取出附加数据信息。
6.提交处理不当
黑名单是一种除了黑名单以外的内容允许访问的技术,建议使用白名单,只有白名单允许的才允许访问的技术
7.不安全的数据库配置
使用数据库的默认用户名,默认密码等等。