SQL注入

在计算中, SQL注入是一种用于攻击数据驱动应用程序的代码注入技术,其中将恶意SQL语句插入到输入字段中以进行执行(例如,将数据库内容转储给攻击者)。 SQL注入必须利用应用程序软件中的安全漏洞,例如,当用户输入错误地过滤用户输入以嵌入了SQL语句中的字符串逃生字符,或者没有强烈键入用户输入并出乎意料地执行。 SQL注入主要是网站的攻击向量,但可用于攻击任何类型的SQL数据库。
SQL注入攻击使攻击者能够欺骗身份,篡改现有数据,导致否定问题,例如排斥交易或变化余额,允许完全披露系统上的所有数据,破坏数据或使其不可用,并成为其管理员的管理员,并成为成为管理员的管理员数据库服务器。面向文档的NOSQL数据库也可能受到此安全漏洞的影响。
在2012年的一项研究中,观察到平均每月收到四次攻击活动,零售商收到的攻击是其他行业的两倍。
历史
关于SQL注射的第一次公开讨论开始于1998年左右。例如,1998年《 Phrack》杂志上的一篇文章。
形式
SQL注入(SQLI)被开放的Web应用程序安全项目视为2007年和2010年前10个Web应用程序漏洞之一。 2013年,SQLI被评为OWASP前十名的第一名。 SQL注入有四个主要子类:
- 经典sqli
- 盲或推理SQL注入
- 数据库管理系统- 特定SQLI
- 复合SQLI
风暴蠕虫是复合sqli的一种代表。
该分类代表了SQLI的状态,尊重其演变直到2010年,即将进行。
技术实施
错误构造的SQL语句
这种注射形式依赖于以下事实:SQL语句由SQL语句使用的数据和控制SQL语句如何执行的命令组成。例如,在SQL语句中 select * from person where name = 'susan' and age = 2
字符串'susan
'是数据和片段 and age = 2
是命令的示例(值 2
在此示例中也是数据)。
当接收程序以一种允许输入退出数据上下文并输入命令上下文的方式处理专门制作的用户输入时,就会发生SQL注入。这使攻击者可以更改执行的SQL语句的结构。
作为一个简单的例子,请想像数据'susan
'在上述语句中由用户输入提供。用户输入字符串'susan
'(没有撇号)在Web表单文本输入字段中,该程序使用字符串串联语句从三个片段中形成上述SQL语句 select * from person where name='
,用户输入'susan
', 和 ' and age = 2
.
现在想像,而不是进入susan
攻击者进入 ' or 1=1; --
.
该程序将使用相同的字符串串联方法与3个片段 select * from person where name='
,用户输入的 ' or 1=1; --
, 和 ' and age = 2
并构建声明 select * from person where name='' or 1=1; -- and age = 2
。许多数据库将忽略“ - ”字符串之后的文本,因为这表示评论。 SQL命令的结构现在为 select * from person where name='' or 1=1;
这将选择所有人行,而不仅仅是那些年龄的名为“苏珊”的人。
现在提出了一个更复杂的示例。
想像一个程序使用以下字符串分配命令创建SQL语句:
var statement = "SELECT * FROM users WHERE name = '" + userName + "'";
此SQL代码旨在从其用户表中撤出指定的用户名的记录。但是,如果恶意用户以特定方式制作“用户名”变量,则SQL语句可能比代码作者预期的要多。例如,将“用户名”变量设置为:
' OR '1'='1
或使用注释甚至阻止其余查询(有三种类型的SQL注释)。这三行的最后都有一个空间:
' OR '1'='1' -- ' OR '1'='1' { ' OR '1'='1' /*
通过父语言呈现以下SQL语句之一:
SELECT * FROM users WHERE name = '' OR '1'='1';
SELECT * FROM users WHERE name = '' OR '1'='1' -- ';
如果要在身份验证过程中使用此代码,则可以使用此示例强制所有用户的每个数据字段(*)的选择,而不是从一个特定用户名中迫使编码器的预期,因为评估'1'= '1'总是正确的。
以下声明中的“用户名”的以下值将导致“用户”表的删除以及从“ userInfo”表中选择所有数据(本质上,揭示了每个用户的信息),使用API ,允许多个语句:
A';DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't
此输入呈现最终的SQL语句,如下所示:
SELECT * FROM users WHERE name = 'a';DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't';
虽然大多数SQL Server实现允许以这种方式执行多个语句,但某些SQL API(例如PHP ) mysql_query()
出于安全原因,功能不允许这样做。这样可以防止攻击者注入完全独立的查询,但不会阻止他们修改查询。
盲目注射
当Web应用程序容易受到SQL注入时,使用盲SQL注入,但是注射的结果对攻击者看不到。带有漏洞的页面可能不是显示数据的页面,但会根据注入合法的SQL语句的逻辑语句的结果而显示不同的页面。传统上,这种类型的攻击被认为是时间密集型的,因为每个地方都需要制定一个新的声明,并且根据其结构,攻击可能包括许多不成功的请求。最近的进步使每个请求都可以恢复多个位,而没有任何不成功的请求,从而可以更加一致,有效地提取。一旦建立了漏洞的位置和目标信息的位置,就有几种工具可以自动化这些攻击。
有条件的响应
一种类型的盲型SQL注入迫使数据库在普通应用程序屏幕上评估逻辑语句。例如,图书评论网站使用查询字符串来确定要显示的书评。所以URL https://books.example.com/review?id=5
将导致服务器运行查询
SELECT * FROM bookreviews WHERE ID = '5';
它将从中填充审核页面,其中包含ID 5的评论数据,该数据存储在表BookReviews中。查询完全在服务器上发生。用户不知道数据库,表格或字段的名称,用户也不知道查询字符串。用户只看到上述URL返回书评。黑客可以加载URL
和 https://books.example.com/review?id=5 OR 1=1
,这可能会导致查询
https://books.example.com/review?id=5 AND 1=2
SELECT * FROM bookreviews WHERE ID = '5' OR '1'='1';
SELECT * FROM bookreviews WHERE ID = '5' AND '1'='2';
分别。如果原始评论带有“ 1 = 1” URL加载,并且从“ 1 = 2” URL返回空白或错误页面,并且尚未创建返回的页面以提醒用户输入无效,或者在其他单词是被输入测试脚本所捕获的,该站点可能很容易受到SQL注入攻击的影响,因为在两种情况下查询都可能成功地通过了。黑客可以继续使用此查询字符串,旨在揭示服务器上运行的mySQL的版本号:
,这将显示在运行MySQL 4的服务器上的书籍评论,否则将显示空白或错误页面。黑客可以在查询字符串中继续使用代码直接实现其目标,或者从服务器中收集更多信息,希望发现另一种攻击途径。
https://books.example.com/review?id=5 AND substring(@@version, 1, INSTR(@@version, '.') - 1)=4
二阶SQL注入
当提交值包含存储而不是立即执行的恶意命令时,二阶SQL注入发生。在某些情况下,该应用程序可以正确编码SQL语句并将其存储为有效SQL。然后,该应用程序的另一部分无需控制以防止SQL注入,可能会执行存储的SQL语句。此攻击需要更多了解以后如何使用提交值的知识。自动化的Web应用程序安全扫描仪不会轻易检测到这种类型的SQL注入,并且可能需要手动指示在哪里检查是否正在尝试证明它正在尝试。
减轻
SQL注入是一种众所周知的攻击,很容易通过简单的措施阻止。在2015年对TalkTalk进行了明显的SQL注射攻击之后,英国广播公司(BBC)报告说,安全专家被这么大公司容易受到影响。图案匹配,软件测试和语法分析等技术是减轻这些攻击的一些常见方法。
逃脱
防止注射的最简单方法是逃避在SQL中具有特殊含义的所有字符。 SQL DBMS的手册说明了哪些字符具有特殊的含义,该字符允许创建需要翻译的字符的综合黑名单。例如,每次出现单个报价('
)在字符串参数中必须用后斜切(\
),以便数据库理解单个报价是给定字符串的一部分,而不是其终止器的一部分。 PHP提供 mysqli_real_escape_string()
根据MySQL语义逃避字符串的功能;下面的示例通过逃脱用户名和密码参数来参数化SQL查询:
$mysqli = new mysqli('hostname', 'db_username', 'db_password', 'db_name');
$query = sprintf("SELECT * FROM `Users` WHERE UserName='%s' AND Password='%s'",
$mysqli->real_escape_string($username),
$mysqli->real_escape_string($password));
$mysqli->query($query);
依靠程序员逃脱所有查询参数是错误的,因为很容易忘记逃脱给定的字符串。程序员可以选择实施自己的抽象来自动逃脱上述参数,这可以减少对错误的易感性,即使不是完全消除它。
对象关系映射器
对象 - 相关映射(ORM)框架(例如Hibernate和ActivereCord)为在关系数据库上提供了面向对象的界面。作为框架查询API的一部分,大多数(如果不是全部)ORMS会自动处理防止SQL注入攻击所需的逃逸。但是,许多ORM提供了绕过其映射设施并发出原始SQL语句的能力。不当使用此功能可以引入注射攻击的可能性。
参数化语句
对于大多数开发平台,可以使用与参数一起使用的参数化语句(有时称为占位符或绑定变量),而不是在语句中嵌入用户输入。占位符只能存储给定类型的值,而不能存储任意SQL片段。因此,SQL注入将被简单地视为一个奇怪的(可能是无效的)参数值。在许多情况下,SQL语句是固定的,每个参数是标量,而不是表。然后将用户输入分配(绑定)到参数。
模式检查
可以检查整数,float或布尔字符串参数,以确定其值是否是给定类型的有效表示。还可以检查必须遵守特定模式或条件的字符串(例如日期, UUID ,电话号码),以确定是否匹配上述模式。
数据库权限
将Web应用程序使用的数据库登录的权限限制为仅需要的内容可能有助于降低利用Web应用程序中任何错误的任何SQL注入攻击的有效性。
例如,在Microsoft SQL Server上,可以限制数据库登录,从而在某些系统表上选择,这些系统表将限制试图将JavaScript插入数据库中所有文本列中的exploits。
deny select on sys.sysobjects to webdatabaselogon;
deny select on sys.objects to webdatabaselogon;
deny select on sys.tables to webdatabaselogon;
deny select on sys.views to webdatabaselogon;
deny select on sys.packages to webdatabaselogon;
例子
- 2002年2月,耶利米·杰克斯(Jeremiah Jacks)发现猜use.com容易受到SQL注射攻击的攻击,允许任何能够构建适当的URL的人,可以在该网站的客户数据库中提取200,000多个以上的名称,信用卡号和到期日期。
- 2005年11月1日,一名少年黑客使用SQL注入从技术目标组中闯入台湾信息安全杂志的地点,并窃取客户的信息。
- 2006年1月13日,俄罗斯计算机犯罪分子闯入了一个罗德岛政府网站,据称从与州机构在线开展业务的个人偷走了信用卡数据。
- 2007年9月19日和2009年1月26日,土耳其黑客集团“ M0STED”使用SQL注入来利用微软的SQL Server攻击属于麦克莱斯特陆军弹药工厂和美国陆军工程兵团的网络服务器。
- 2008年4月13日,俄克拉荷马州的性和暴力罪犯注册处关闭了其网站,以进行“常规维护”,此前被告知,已通过SQL注射攻击下载了10,597个属于性犯罪者的社会安全号码
- 2009年8月17日,美国司法部指控一名美国公民阿尔伯特·冈萨雷斯(Albert Gonzalez )和两名未命名的俄罗斯人,使用SQL注射攻击盗窃了1.3亿个信用卡号码。据报导,在“美国历史上最大的身份盗用案件”中,该人在研究其付款处理系统后,从许多公司受害者那里偷了卡。热门公司包括信用卡处理器Heartland支付系统,便利店连锁7-11和超市连锁店Hannaford Brothers 。
- 2010年7月,一名由句柄“ CH Russo”从流行的Bittorrent网站The Pirate Bay获得了敏感用户信息的南美安全研究员。他获得了对网站的管理控制面板的访问权限,并利用了SQL注入漏洞,使他能够收集用户帐户信息,包括IP地址, MD5密码哈希和洪流单个用户已上传的记录。
- 从2010年7月24日至26日,来自日本和中国的攻击者使用SQL注入来访问一家基于大阪的公司Neo Beat的客户信用卡数据,该公司运营着大型在线超市网站。这次攻击还影响了七个商业伙伴,包括超市链Izumiya Co,Maruetsu Inc和Ryukyu Jusco Co.的数据盗窃影响了据报导的12,191名客户。截至2010年8月14日,据报导,第三方使用了300多个信用卡信息来在中国购买商品和服务。
- 9月19日,在2010年瑞典大选期间,选民试图通过手工写出SQL命令作为书面投票的一部分进行守则注入。
- 2010年11月8日,英国皇家海军网站被一位名为Tinkode的罗马尼亚黑客使用SQL注射损害。
- 2011年4月11日,使用SQL注射缺陷妥协了梭子鱼网络。员工的电子邮件地址和用户名是获得的信息。
- 在2011年4月27日的4个小时内,宽带报告网站上发生了自动化的SQL注射攻击,该攻击能够提取8%的用户名/密码对:8,000个活跃和90,000个旧帐户的随机帐户。
- 2011年6月1日, Lulzsec集团的“ HackTivers ”被指控使用SQLI窃取优惠券,下载密钥和密码,这些密码和密码存储在Sony的网站上,访问了一百万用户的个人信息。
- 2011年6月, PBS被Lulzsec入侵,最有可能是通过使用SQL注射。在此IMPerva博客中描述了黑客执行SQL注射的完整过程。
- 据报导,2012年7月,一个黑客小组从Yahoo!中窃取了450,000个登录证书。登录名是用纯文本存储的,据称是从雅虎子域中拿走的雅虎!声音。该小组使用“基于工会的SQL注入技术”违反了雅虎的安全性。
- 2012年10月1日,一个名为“ Ghostshell”的黑客小组出版了来自哈佛,普林斯顿,斯坦福大学,康奈尔,约翰·霍普金斯和苏黎世大学的53所大学的学生,教职员工,员工和校友的个人记录。 com 。黑客声称,他们正试图“提高人们对当今教育的变化的认识”,使欧洲改变教育法的变化和学费增加。
- 2013年11月4日,据称HackTivist Group“ Raptorswag”使用SQL注射攻击对中国国际商会损害了71个中国政府数据库。泄漏的数据是与匿名合作公开发布的。
- 2014年8月,基于密尔沃基的计算机安全公司Hold Security披露,它通过SQL注射发现了近420,000个网站的机密信息盗窃。 《纽约时报》通过雇用安全专家检查索赔来证实这一发现。
- 2015年10月,使用SQL注射攻击来窃取英国电信公司TalkTalk的服务器的156,959名客户的个人详细信息,从而利用了传统网络门户网站中的漏洞。
- 2020年8月,由于Link的不安全数据消毒标准,SQL注射攻击被用来访问许多斯坦福大学学生浪漫利益的信息,Link的不安全数据卫生标准是本科生Ishan Gandhi在校园建立的一家初创公司。
- 在2021年初,通过SQL注射攻击从极右翼网站GAB中淘汰了70 GB的数据。 GAB的CTO Fosco Marotto将漏洞引入了GAB代码库中。下周,使用OAuth2代币在第一次攻击中使用OAuth2代币发动了第二次对GAB的攻击。
在流行文化中
- 2007年的XKCD卡通涉及角色Robert');滴桌学生; -命名进行SQL注射。由于这部动画片,SQL注入有时被非正式地称为“ Bobby Tables”。
- 通过SQL注入未经授权登录到网站,构成了JK Rowling 2012年小说《休闲空缺》中一个子图的基础。
- 2014年,波兰的一个人合法地将自己的业务重命名为Dariusz Jakubowski X';删除表用户;选择“ 1试图破坏垃圾邮件发送者收获机器人的操作。
- 2015年的Game Hacknet有一个名为SQL_MemCorrupt的黑客程序。它被描述为注入一个表条目,该输入在SQL数据库中导致损坏错误,然后查询说表,导致SQL数据库崩溃和核心转储。
也可以看看
- 代码注入
- 跨站脚本
- Metasploit项目
- OWASP打开Web应用程序安全项目
- 及时注射,适用于人工智能的类似概念
- SGML实体
- 不受控制的格式字符串
- W3AF
- Web应用程序安全