1

我需要修复分配给我们维护的非 IT 应用程序中的一些安全问题。它位于 Microsoft Access 前端(SQL Server 后端)。

有谁知道 SQL 注入是否可以通过 Microsoft Access 控件的 RecordSource 或 RowSource 属性来完成?例如,如果我将列表框的记录源设置为

Me.SomeListBox.Recordsource = 'SELECT * FROM SomeTable WHERE SomeField = ''' & Me.txtSomeTextBox & '''.

我不确定微软是否为这些属性内置了预防功能,所以我想知道我是否应该通过清理功能运行 Me.txtSomeTextBox。

这当然是一个快速的解决方案……该应用程序将在今年晚些时候重新设计并从 Access 中迁移出来(耶!)。

提前谢谢各位!

4

6 回答 6

2

可以使用 VBA 来消除 WHERE 条件中字段名称的明显使用。

Sub btnLogin_OnClick()

If instr(0, me.txtBox, someFieldName) > 0 Then
        Msgbox("Foo Bar!")
Else
   Login
End If

End Sub
于 2013-06-21T22:21:16.337 回答
1

如果您正在执行字符串连接,那么您很容易受到攻击。

于 2013-06-21T21:40:14.310 回答
1

在您的情况下,注入无法进入 sql server。通过链接表访问本地查询仅限于一个 sql 语句。因此,虽然“小”可能注入 Access 是可能的,但 sql 字符串不能作为多个 sql 语句到达 SQL 服务器,也不能在您给定的示例中运行服务器端 SQL。

所以“内置预防”是这样的 SQL 仅限于一个字符串。

因为生成的字符串不能是多个 sql 语句,并且因为文本框结果被“引用”,所以您只能提供字符串表达式作为条件,并且您给定的示例不可能注入 sql。

如果有人可以根据文本框的示例 VBA sql + concat 发布一个有效的注入示例,那么我会全神贯注。

因此,虽然 Access 中可能会发生“某些”注入情况,但您所举的例子肯定不是我所知道的这种情况。

知识渊博的用户可能会得到一个在该表达式中运行的 VBA() 函数,但他们必须知道实际 VBA 函数的名称。即使在这种情况下,它也不会执行一些您不想执行的 SQL。

我想可以查看任何删除记录并且值/表达式由用户提供的 sql 字符串,但是您给定的示例不是典型的 sql 注入风险。

于 2019-01-17T00:42:58.290 回答
1
Me.SomeListBox.Recordsource = 'SELECT * FROM SomeTable WHERE SomeField = ''' & Me.txtSomeTextBox & '''

你可以做一个包装,只是为了避免破坏组合的 SQL 查询,例如

Me.SomeListBox.Recordsource = 'SELECT * FROM SomeTable WHERE SomeField = ''' & Replace(Me.txtSomeTextBox,"'","''") & '''

在这种情况下,您添加成对的'符号('-->''),查询不会被破坏。

于 2019-04-25T08:36:01.767 回答
1

与用户输入的字符串连接是危险的!

我设置了一个例子。使用这个 SQL:

CREATE TABLE SomeTable (SomeField varchar(20), read_permission int)
INSERT INTO SomeTable VALUES ('a', 1), ('b', 1), ('c', 0)

这个VBA代码:

Private Sub FilterButton_Click()
   Me.SomeListBox.RowSource = "SELECT * FROM SomeTable WHERE SomeField = '" & Me.txtSomeTextBox & "' AND read_permission = 1"
End Sub

看起来,您创建了一个基于行的权限。只有带有的行read_permission = 1才会显示在组合框中。

但是如果用户' OR 1=1 OR'在文本框中输入,他突然可以看到所有数据(甚至那些带有read_permission = 0.

示例数据库

在用户输入中替换'''似乎使执行 sql 注入变得更加困难。我找不到任何字符串来打破它(还)。但最好的想法可能是找到另一种构建 sql 字符串的方法。

Private Sub FilterButton_Click()
   Me.SomeListBox.RowSource = "SELECT * FROM SomeTable WHERE SomeField = '" & Replace(Me.txtSomeTextBox, "'", "''") & "' AND read_permission = 1"
End Sub
于 2020-09-24T08:39:52.117 回答
0

回答您最初的问题:这取决于控件。列表框和组合框可以有一个选择查询作为它们的记录源。不是动作查询。

文本框控件只能绑定到表格字段。

这些控件对任何最终用户均不可用,因此他们可以在编译为 .accde 文件类型时重新定义记录源。

于 2019-01-16T23:08:43.310 回答