SQL注入 (英语:SQL injection ),也称SQL隐码 或SQL注码 ,是发生于应用程式与资料库层的安全漏洞 。简而言之,是在输入的字串之中夹带SQL 指令,在设计不良的程式 当中忽略了字元检查,那么这些夹带进去的恶意指令就会被资料库 伺服器 误认为是正常的SQL指令而执行,因此遭到破坏或是入侵。[ 2]
此条目
需要补充更多来源 。
(2014年9月21日 )
Quick Facts “SQL注入”的各地常用名称, 中国大陆 ...
“SQL注入”的各地常用名称 中国大陆 SQL注入 台湾 SQL注入、SQL隐码、SQL注码[ 1]
Close
有部份人认为SQL注入是只针对Microsoft SQL Server ,但只要是支援处理SQL指令的资料库伺服器,都有可能受到此种手法的攻击。
Xkcd 上的一幅漫画。该学生的姓名为“Robert'); DROP TABLE students;-- ”,导致students表被删除。[ 3]
在应用程式中若有下列状况,则可能应用程式正暴露在SQL Injection的高风险情况下:
在应用程式中使用字串联结方式或联合查询方式组合SQL指令。
在应用程式连结资料库时使用权限过大的帐户(例如很多开发人员都喜欢用最高权限的系统管理员帐户(如常见的root,sa等)连接资料库)。
在资料库中开放了不必要但权力过大的功能(例如在Microsoft SQL Server 资料库中的xp_cmdshell延伸预存程序或是OLE Automation预存程序等)
太过于信任使用者所输入的资料,未限制输入的特殊字元,以及未对使用者输入的资料做潜在指令的检查。
SQL命令可查询、插入、更新、删除等,命令的串接。而以分号字元为不同命令的区别。(原本的作用是用于SubQuery或作为查询、插入、更新、删除……等的条件式)
SQL命令对于传入的字串参数是用单引号字元所包起来。(但连续2个单引号字元,在SQL资料库中,则视为字串中的一个单引号字元)
SQL命令中,可以夹带注解(连续2个减号字元 --
后的文字为注解,或“/*
”与“*/
”所包起来的文字为注解)
因此,如果在组合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注入被俗称为骇客的填空游戏。
资料表中的资料外泄,例如企业及个人机密资料,帐户资料,密码等。
资料结构被骇客探知,得以做进一步攻击(例如SELECT * FROM sys.tables)。
资料库伺服器被攻击,系统管理员帐户被窜改(例如ALTER LOGIN sa WITH PASSWORD='xxxxxx')。
取得系统较高权限后,有可能得以在网页加入恶意连结、恶意代码 以及Phishing 等。
经由资料库伺服器提供的作业系统支援,让骇客得以修改或控制作业系统(例如xp_cmdshell "net stop iisadmin"可停止伺服器的IIS服务)。
攻击者利用数据库提供的各种功能操纵文件系统,写入Webshell,最终导致攻击者攻陷系统
破坏硬碟资料,瘫痪全系统(例如xp_cmdshell "FORMAT C:")。
取得系统最高权限后,可针对企业内部的任一管理系统做大规模破坏,甚至让其企业倒闭。
网站首页被窜改,导致声誉受到损害。
在设计应用程式时,完全使用参数化查询 (Parameterized Query)来设计资料存取功能。
在组合SQL字串时,先针对所传入的参数加入其他字元(将单引号字元前加上跳脱字元)。
如果使用PHP 开发网页程式的话,需加入跳脱字元之功能(自动将所有的网页传入参数,将单引号字元前加上跳脱字元)。
使用php开发,可写入html特殊函式,可正确阻挡XSS 攻击。
其他,使用其他更安全的方式连接SQL资料库。例如已修正过SQL注入问题的资料库连接元件,例如ASP.NET 的SqlDataSource物件或是 LINQ to SQL。
增强网页应用程式防火墙 的防御力
有关SQL注入的首次公开讨论始于1998年左右。[ 4] 例如,Phrack Magazine 中的1998年文章。[ 5]
Microsoft. SQL Injection . [2013-08-04 ] . (原始内容存档 于2013-08-02). 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.
存档副本 . [2016-12-16 ] . (原始内容存档 于2016-12-17).