SQL注入的含义是什么?我听不懂这个词。SQL注入可能会导致哪些问题?
发布于 2012-01-24 13:52:05
SQL注入最常见的情况是程序员使用用户提供的输入追加(或内插)字符串来构建SQL命令。
例如,想象一下从虚拟web应用程序中提取的易受攻击的用户身份验证(登录)伪代码。
username = getPostData( "username" );
password = getPostData( "password" );
sql = "select id, username from users'
+ ' where username='" + username + "' and password='" + password +"'";
result = executeQuery( sql );
if (result[ 0 ]) {
loginUser( result[ 0 ][ 'id' ] );
print "You are logged in as " + encodeAsHtml( result[ 0 ][ 'username' ] );
}乍一看,您可能认为这是明智的,但问题是,它没有区分用户提供的数据和SQL代码;数据可以被视为代码。这意味着恶意用户可以更改SQL语句的逻辑。
恶意用户如果能够更改SQL命令的逻辑以生成保证始终至少返回一行的答案,则可以完全绕过登录保护。
例如,如果他输入了一个真实的用户名bob,但是将密码设置为:
' or 1=1 --这样他就可以进入别人的账户了。这是因为生成的SQL如下所示:
select id, username
from users
where username='bob' and password='' or 1=1 --'注意,逻辑表达式1=1总是计算为true。还请注意,注入向量以两个连字符结尾,这将行的其余部分标记为注释。因此,SQL在逻辑上与
select id, username
from users
where (username='bob' and password='') or true它在逻辑上与
select id, username
from users
where true它在逻辑上与
select id, username
from users因此,数据库中的所有用户都将被返回,他将作为列表中的第一个登录--通常是管理员。
此外,SQL注入还可以用于从数据库中读取所有数据。输入用户名如下( Server语法)将列出用户定义的表名
' union select -1, name, from sysobjects where xtype = 'U' order by id --因为这会产生
select id, username
from users
where username = ''
union
select -1, name
from sysobjects
where xtype = 'U'
order by id asc由于注入的数据的id为-1,并且我们按id对数据进行排序,因此从数据库返回的第一行将是sysobjects表中的select。因此,我们现在显示的"username“将是数据库中第一个用户创建的表的名称。可以重复使用类似的技术来读取每个可访问表的每一行的每一列的所有数据。请注意,即使在被攻击的特性完全没有输出的情况下,也可以这样做!
编程语言、数据库库和DBMS的一些组合也允许查询堆叠。这是一种将一个全新的SQL命令追加到最后的技术。然后,数据库将执行这两个查询。用户名:
'; delete from users --产生
select id, username
from users
where username='';
delete from users 现在,您的应用程序没有任何用户(并且需要SQL注入才能登录)。见强制性XKCD漫画。
如果您对攻击者和漏洞测试人员通常使用的更多技术感兴趣,请参阅此SQLi备忘单。
实际上,在许多常见的情况下,这是如此容易。Prepared statements将数据从代码中分离出来,并且不允许将参数视为SQL代码。只需重新编码查询以使用准备好的语句,并将单个参数绑定到占位符。
伪码:
username = getPostData( "username" );
password = getPostData( "password" );
sql = "select id, username from users where username=? and password=?";
query = prepareStatement( sql );
query.setParameter( 0, username );
query.setParameter( 1, password );
result = executePreparedStatement( query );一如既往,这并不是整个故事的全部..。
不要忘记在深度上进行防御,并且总是进行输入验证,就像你总是(应该)那样。当从句需要特别注意时,像%这样的特殊字符可能是不需要的。在将用户数据作为参数传递给数据库函数时要特别小心,并且要注意它们如何被滥用。如果您有生成动态查询的存储过程,则可能需要在过程本身中进行进一步的保护。
发布于 2012-01-24 12:43:03
SQL注入是一种使用有效的SQL命令篡改、删除或将数据注入后端数据库的技术,它通过验证调用数据库的web应用程序的代码输入的弱点直接将数据注入后端数据库。
它是OWASP十大最常用的攻击路径之一,因为它非常容易利用。
它可以用来破坏客户数据、信用卡数据、财务记录等的整个数据库,或者获取这些数据的副本。一般都是相当大的影响!
好的一点是,通过输入验证可以很容易地减轻风险--大多数框架都提供了这样的模块。
https://security.stackexchange.com/questions/10974
复制相似问题