黑客通过注射一个畸形的查询到SQL语句中从而中断了系统。这样之所以能运行是因为给输入的user连接了一个固定的字符串和值,看下面所示:[翻译不准,看原文This particular hack works because the executed query is formed by the concatenation of a fixed string and values entered by the user, as shown here:]
以下是引用片段:string strQry = "SELECT Count(*) FROM Users WHERE UserName='" + txtUser.Text + "' AND Password='" + txtPassword.Text + "'"; |
当用户输入一个无效的用户名‘Paul’ 密码 ‘Password’ 的时候,strQry变量成为
SELECT Count(*) FROM Users WHERE UserName='Paul' AND Password='password'
但时当黑客输入
以下是引用片段: ' Or 1=1 -- |
时,语句却变成了
SELECT Count(*) FROM Users WHERE UserName='' Or 1=1 --' AND Password=''
因为两个” --” 符号指定了开始查询的SQL语句,查询条件变成:
SELECT Count(*) FROM Users WHERE UserName='' Or 1=1
(这里译得可能不太准,给出源文Because a pair of hyphens designate the beginning of a comment in SQL, the query becomes simply:)
[译者加:两个连字符――后面的内容被当做注释内容被系统忽略了,所以“――”后面的语句等同于无效]
表达式1=1是恒成立的,而这个条件为真的值与任何表达式OR运算,返回结果永远是真,所以最少有一行返回记录可以保证,这条查询经常会返回一个非零的记录集。
不是所有的SQL 注入攻击都包括验证注入的(翻译不太好,译者加:也就是说其它情况也会有注入)[原:Not all SQL injection attacks involve forms authentication],一些动态的构造SQL语句和未验证的输入都会让攻击发生。给出正确的危害发生的限定情况,范围,或许可以一个攻击限定到黑客仅有的SQL语言知识或是数据库情况。
现在我们再考虑“代码段二”取自于BadProductList.aspx.这个页面从NORTHWIND DATABASE[译者加:装完SQL2000后会自带这个数据库] 中显示产品,并且允许用户通过一个名为textFilter的textbox来过滤输出结果。如最后的这个例子,这个页面可以成功的被SQL注入攻击,因为执行语句是由用户输入的值来动态构建而成的。这个特殊的页面就成了电脑黑客的天堂,是因为他可以让这个机敏的黑客劫持机密数据,改变数据库的的数据,损害数据库记录,甚至创建一个新的数据库帐户。
代码段 2 BadProductList.aspx.cs
以下是引用片段:private void cmdFilter_Click(object sender, System.EventArgs e) { dgrProducts.CurrentPageIndex = 0; bindDataGrid(); } private void bindDataGrid() { dgrProducts.DataSource = createDataView(); dgrProducts.DataBind(); } private DataView createDataView() { string strCnx = "server=localhost;uid=sa;pwd=;database=northwind;"; string strSQL = "SELECT ProductId, ProductName, " + "QuantityPerUnit, UnitPrice FROM Products"; //This code is susceptible to SQL injection attacks. if (txtFilter.Text.Length > 0) { strSQL += " WHERE ProductName LIKE '" + txtFilter.Text + "'"; } SqlConnection cnx = new SqlConnection(strCnx); SqlDataAdapter sda = new SqlDataAdapter(strSQL, cnx); DataTable dtProducts = new DataTable(); sda.Fill(dtProducts); return dtProducts.DefaultView; } |
许多SQL-compliant 数据库,包括SQL SERVER,保存metadata 到一系列的系统表中,有着这样的名字 sysobjects,syscolumns,sysindexes等。这意味着黑客们通过使用这些系统表来进一步获得数据库的大概信息。如,下面的字输入到texFilter的 textbox中,可能会显示数据库中的用户表
以下是引用片段: ' UNION SELECT id, name, '', 0 FROM sysobjects WHERE xtype ='U' -- |
UNION查询语句对黑客来说是非常有用的,因为它可以把一个查询语句附合到另一个查询语句上去。在这个例子中,黑客把数据库中的表名附加到最初的产品查询表上。只有一点不好的是要计算原查询列的数量和数据类型。最先的查询可能会显示一个命名为数据库中用户存在的表。第二次的查询能够显示用户表中的列。用这些信息,黑客可能输入下面的字符到testbox中:
以下是引用片段: ' UNION SELECT 0, UserName, Password, 0 FROM Users – |
输入这个查询,显示了用户表中存在的USERNAME和PASSWORD,像下面显示的 FIGURE .3的示
Figure 3 Querying the Users Table
SQL注入攻击还可以被用来改变数据或损坏数据库。SQL注入的黑客可能输入下面的txtFilter 去改变第一个产品的价格从18美元到0.01美元,并且在别人察觉到他的行为之前,迅速的购买这些产品。
'; UPDATE Products SET UnitPrice = 0.01 WHERE ProductId = 1--
黑客能够得成是因为SQL SERVER充许你把多个SQL语句通过一个分号或空格连成一个。在这个例子中DataGrid什么也不显示,但是更新语句却正常的被执行了。利用相同的技术,可能被用来执行一条删除表的语句,或是执行一条系统存储扩展,用来创建一个用户,并加入系统管理员权限组中。这些黑客们都可能用例2中的BadProductList.aspx页面。