【问题标题】:SQL Injection within a stored procedure?存储过程中的 SQL 注入?
【发布时间】:2013-05-03 19:18:35
【问题描述】:

我在代码中的某个地方发现一个字符串没有被正确转义。我一直在尝试看看它是否可以被利用(别担心,我最终会逃避它或使用准备好的语句,这只是为了学习经验)。

这是使用mysqli->query()函数;

查询是在 PHP 中生成的,如下所示:

$Query = "CALL some_proc(".$_SomeID.",'".$_UnescapedString."')";

通过将$_UnescapedString 输入为test'); DROP TABLE SomeTable; -- 我得到了查询:

CALL some_proc(1, 'test'); DROP TABLE SomeTable; -- ')

此查询已成功运行,但似乎没有运行第二个查询。我通过在第二个查询中放入无效的 SQL 来测试这一点并且没有错误。我认为这意味着 mysqli 足够聪明,只能执行一个查询?

现在我的问题是,我能否以某种方式将 SQL 注入存储过程本身?流程如下:

BEGIN
   SELECT COUNT(*) AS SomeCount
   FROM DataTable
   WHERE DataTable.SomeID = _SomeID
   AND DataTable.SomeValue LIKE CONCAT('%',_UnescapedString,'%');
END

我尝试了各种 SQL,例如 test','%')-- 来查看查询是否会正常进行,但它只会更改存储过程调用,即:

CALL some_proc(1, 'test', '%')--');

有没有办法让DROP TABLE 命令进入_UnescapedString?

【问题讨论】:

    标签: php mysql sql mysqli sql-injection


    【解决方案1】:

    免责声明,我使用 SQL Server 而不是 mySQL,但假设存储过程中参数的行为是相同的,并且还假设 _UnescapedString 是输入参数,将 DROP TABLE 放入参数中看起来像这个:

    SELECT COUNT(*) AS SomeValue
    FROM DataTable
    WHERE DataTable.SomeID = _SomeID
    AND DataTable.SomeValue LIKE '%DROP TABLE%');
    

    关于查询:

    CALL some_proc(1, 'test'); DROP TABLE SomeTable; -- ')
    

    可能是DROP TABLE 命令没有执行,因为您运行的用户帐户没有足够的权限来执行 DDL 语句?

    限制用于从 Web 服务器访问数据库的用户帐户的权限是一种限制 SQL 注入攻击可能造成的损害的方法。但是,它不会阻止他们。

    【讨论】:

    • 我想知道是否可以使用%DROP TABLE% 部分过早关闭CONCAT,然后再运行DROP 命令?我正在使用的帐户具有完全访问权限,在网上查看后我认为这是因为mysqli->query()出于安全原因只允许单个查询。
    • 根据我的经验,没有通过参数输入可以过早关闭CONCAT。
    猜你喜欢
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 2017-08-24
    • 1970-01-01
    • 2019-06-26
    • 2019-08-20
    • 1970-01-01
    相关资源
    最近更新 更多