【问题标题】:Test sofware for SQL injectionSQL注入测试软件
【发布时间】:2020-08-19 20:21:02
【问题描述】:

我们必须使用旧版本的 ERP 系统 (1993)。

它有多个模块。这些模块有窗口(选项卡)。标签有 cols(显然)。

在这个选项卡中,用户可以创建一个“新列” -> 它就像一个子查询。查询只能在括号中使用 ()。

我只是好奇,是否可以由用户进行注射。

例如:

 --basic query (self join)
(select i.my_col from my_table i where my_pk = i.pk)

 --illlustrating
(select replace(i.my_col, 'UPDATE...') from my_table i where my_pk = i.pk)

有没有办法使第二个查询可行?我的意思是,用户可以通过这种方法以某种方式更新列吗?

我该如何测试它?

【问题讨论】:

  • 我不太明白这个问题。你是说这个现成的 ERP 系统的 UI 允许最终用户向预定义的查询添加子查询,并为这些子查询指定 SQL,以便向 UI 添加更多信息?什么是底层数据库引擎?如果 Oracle,哪个版本 - 如果 ERP 是 1993 年的,RDBMS 是否同样古老?
  • 整体描述非常模糊,它混合了小部件和数据库实体(如果一个窗口选项卡明显有列,那么它可能是一个表而不是一个选项卡)但是如果,正如您所建议的,用户实际上可以键入 SQL 代码,然后 SQL 注入,无论是否存在错误,肯定是一个内置功能。我认为这个问题可以使用一些额外的信息,甚至可能是几个屏幕截图。
  • @NevilleKuyt Oracle 数据库 11g 版本 11.2.0.4.0 - 64 位生产。
  • 明确一点:您是在问是否可以运行 SELECT 语句,该语句将 UPDATE 语句作为其投影中的一列执行?
  • @APC 在这种情况下,是的。如果可能的话,他们必须“撤销”用户的一些特权。这就是原因,为什么测试它会很棒..如果它有效,我认为这是一个很大的风险。

标签: sql oracle security sql-injection dynamic-sql


【解决方案1】:

避免 SQL 注入取决于将用户输入转换为可执行语句的机制。您发布的实际示例不会运行,但我可以想到可能劫持 SELECT 以运行恶意 DML 的方法。这取决于框架:鉴于底层软件很古老,我怀疑它可能非常脆弱。

一般来说,如果您担心 SQL 注入,您应该使用 Oracle 的内置 DBMS_ASSERT package 来验证您的 SQL 字符串。 Find out more

【讨论】:

    【解决方案2】:

    可以通过preparedStatementsetParameter 处理where 条件的动态值,但不幸的是,该选项不适用于动态column 选择。

    最好的办法是在传递给查询之前拥有所有可能/适用的列名。

    // check if my_col is possible values else throw the error.
    (select replace(i.my_col, 'UPDATE...') from my_table i where my_pk = i.pk)
    

    【讨论】:

    • 我不认为 “不幸” 在这里是正确的词。 Seeker 正在询问是否有可能让不良行为者劫持 SELECT 以执行恶意 UPDATE。
    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多