本页使用了标题或全文手工转换

SQL注入

维基百科,自由的百科全书
跳到导航 跳到搜索
“SQL注入”的各地常用别名
中国大陆 SQL注入
港台 SQL注入、SQL隐码、SQL注码[1]

SQL注入(英语:SQL injection),也称SQL注入SQL注码,是发生于应用程序与数据库层的安全漏洞。简而言之,是在输入的字符串之中注入SQL指令,在设计不良的程序当中忽略了字符检查,那么这些注入进去的恶意指令就会被数据库服务器误认为是正常的SQL指令而运行,因此遭到破坏或是入侵。[2]

有部分人认为SQL注入是只针对Microsoft SQL Server而来,但只要是支持批处理SQL指令的数据库服务器,都有可能受到此种手法的攻击。

原因[编辑]

Xkcd上的一幅漫画。该学生的姓名为“Robert'); DROP TABLE students;--”,导致students表被删除。[3]

在应用程序中若有下列状况,则可能应用程序正暴露在SQL Injection的高风险情况下:

  1. 在应用程序中使用字符串联结方式或联合查询方式组合SQL指令。
  2. 在应用程序链接数据库时使用权限过大的账户(例如很多开发人员都喜欢用最高权限的系统管理员账户(如常见的root,sa等)连接数据库)。
  3. 在数据库中开放了不必要但权力过大的功能(例如在Microsoft SQL Server数据库中的xp_cmdshell延伸存储程序或是OLE Automation存储程序等)
  4. 太过于信任用户所输入的数据,未限制输入的特殊字符,以及未对用户输入的数据做潜在指令的检查。

作用原理[编辑]

  1. SQL命令可查询、插入、更新、删除等,命令的串接。而以分号字符为不同命令的区别。(原本的作用是用于SubQuery或作为查询、插入、更新、删除……等的条件式)
  2. SQL命令对于传入的字符串参数是用单引号字符所包起来。(但连续2个单引号字符,在SQL数据库中,则视为字符串中的一个单引号字符)
  3. SQL命令中,可以注入注解(连续2个减号字符 -- 后的文字为注解,或“/*”与“*/”所包起来的文字为注解)
  4. 因此,如果在组合SQL的命令字符串时,未针对单引号字符作转义处理的话,将导致该字符变量在填入命令字符串时,被恶意窜改原本的SQL语法的作用。

例子[编辑]

某个网站的登录验证的SQL查询代码为

strSQL = "SELECT * FROM users WHERE (name = '" + userName + "') and (pw = '"+ passWord +"');"

恶意填入

userName = "1' OR '1'='1";

passWord = "1' OR '1'='1";

时,将导致原本的SQL字符串被填为

strSQL = "SELECT * FROM users WHERE (name = '1' OR '1'='1') and (pw = '1' OR '1'='1');"

也就是实际上运行的SQL命令会变成下面这样的

strSQL = "SELECT * FROM users;"

因此达到无账号密码,亦可登录网站。所以SQL注入被俗称为黑客的填空游戏。

可能造成的伤害[编辑]

  1. 数据表中的数据外泄,例如企业及个人机密数据,账户数据,密码等。
  2. 数据结构被黑客探知,得以做进一步攻击(例如SELECT * FROM sys.tables)。
  3. 数据库服务器被攻击,系统管理员账户被窜改(例如ALTER LOGIN sa WITH PASSWORD='xxxxxx')。
  4. 获取系统较高权限后,有可能得以在网页加入恶意链接恶意代码以及Phishing等。
  5. 经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统(例如xp_cmdshell "net stop iisadmin"可停止服务器的IIS服务)。
  6. 黑客经由上传php简单的指令至对方之主机内,PHP之强大系统命令,可以让黑客进行全面控制系统(例如:php一句话木马)。
  7. 破坏硬盘数据,瘫痪全系统(例如xp_cmdshell "FORMAT C:")。
  8. 获取系统最高权限后,可针对企业内部的任一管理系统做大规模破坏,甚至让其企业倒闭。
  9. 企业网站主页被窜改,门面尽失。

避免的方法[编辑]

  1. 在设计应用程序时,完全使用参数化查询(Parameterized Query)来设计数据访问功能。
  2. 在组合SQL字符串时,先针对所传入的参数加入其他字符(将单引号字符前加上转义字符)。
  3. 如果使用PHP开发网页程序的话,需加入转义字符之功能(自动将所有的网页传入参数,将单引号字符前加上转义字符)。
  4. 使用php开发,可写入html特殊函数,可正确阻挡XSS攻击。
  5. 其他,使用其他更安全的方式连接SQL数据库。例如已修正过SQL注入问题的数据库连接组件,例如ASP.NET的SqlDataSource对象或是 LINQ to SQL。
  6. 使用SQL防注入系统。
  7. 增强WAF英语Web_application_firewall的防御力

参考文献[编辑]

  1. ^ 国家教育研究院双语词汇、学术名词暨辞书信息网
  2. ^ Microsoft. SQL Injection. [2013-08-04]. (原始内容存档于August 2, 2013). SQL injection is an attack in which malicious code is inserted into strings that are later passed to an instance of SQL Server for parsing and execution. Any procedure that constructs SQL statements should be reviewed for injection vulnerabilities because SQLi Server will execute all syntactically valid queries that it receives. Even parameterized data can be manipulated by a skilled and determined attacker.  已忽略未知参数|df= (帮助)
  3. ^ https://xkcd.com/327/

外部链接[编辑]