你真的了解SQL注入吗

SQL 注入漏洞,是指业务代码接收外部参数参与数据库查询,却没有对收到的参数值做合适的校验,导致攻击者可以通过参数在业务系统上注入并执行任意SQL语句。

为什么会存在SQL注入呢?因为SQL作为一种解释型语言,在运行时是由一个运行时组件解释语言代码并执行其中包含的指令的语言。基于这种执行方式,产生了一系列叫做代码注入(code injection)的漏洞 。它的数据其实是由程序员编写的代码和用户提交的数据共同组成的。程序员在web开发时,没有过滤敏感字符,没有检查变量,导致攻击者可以通过SQL灵活多变的语法,构造精心巧妙的语句,执行指定的SQL语句达成目的,或者通过系统报错,返回对攻击者有用的信息。

SQL注入漏洞作为web安全的头号杀手,是众多数据泄漏案件的"元凶"。SQL注入不仅可以进行拖库,还可以执行shell命令,包括读写文件(比如执行load_file函数),危害非常严重。

1.读取和修改数据库内容

– select/insert/update/delete

– union

– information_schema

2.占用DB资源导致DOS

– Timing

• benchmark()、sleep()

3.控制数据库服务器

– select load_file(‘/etc/passwd’)

• 必须other组可读,非mysql权限执行

– select xxx into outfile ‘/var/www/shell.php’

– select xxx into dumpfile ‘/usr/lib/mysql/plugin/udf.so’

– UDF(User-Defined Function)

• 上传UDF库来代码执行

4.作为跳板攻击内网/子网

历史上很多公司的产品都被SQL注入漏洞危害过,很多数据泄漏事件都跟SQL注入漏洞相关。

若系统有DAO,则在DAO处进行SQL注入防御;若没有DAO,则在拼凑SQL语句的地方进行SQL注入防御。

1.进行数据校验

对用户传递过来的数据进行严格的数据校验,如果接收的参数为数字型参数,判断参数值是否为数字型,如果不是数字型,拒绝处理;如果接收的参数为字符型参数,对单引号、双引号、反斜杠和NULL字节进行转义。

若是标准Mysql组件,必须使用mysql_real_escape_string()来转义特殊字符,该函数会对特殊字符如单引号、双引号、回车换行、控制类Unicode字符等进行转义,使得输入参数不被注入,参考https://dev.mysql.com/doc/refman/5.7/en/mysql-real-escape-string.html

2.使用参数化查询(又称预编译)

参数化查询(Parameterized Query 或 Parameterized Statement)是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,这个方法目前已被视为最有效可预防SQL注入攻击 (SQL Injection) 的攻击手法的防御方式。

不同的框架有不同的参数化查询方案

Language specific recommendations:

Java EE – use PreparedStatement() with bind variables

.NET – use parameterized queries like SqlCommand() or OleDbCommand() with bind variables

PHP – use PDO with strongly typed parameterized queries (using bindParam())

Hibernate - use createQuery() with bind variables (called named parameters in Hibernate)

SQLite - use sqlite3_prepare() to create a statement object

详细请见:

https://www.owasp.org/index.php/Query_Parameterization_Cheat_Sheet

详细语法请参考:

https://dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html

目前C/C++没有封装好的预编译函数

使用预编译前要进行性能测试:

1.C/C++只支持服务端PS的模式,在分库表比较多(比如百库十表 *日表)的情况下,会对服务端内存有一定的消耗

2.增加了一些RPC

4.DB账户的权限隔离及最小化,以在漏洞发生时可以降低影响

举例:A业务的帐号只能访问A业务的库表,并且根据业务场景合理分配读写权限

不仅仅是Mysql,其他数据库也有注入问题

– Oracle

– MS-SQL

– PostgreSQL

– MS-ACCESS

– SQLite(客户端)

– NoSQL

更多参考信息,请见:

https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181224G0GONS00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券