Php 存储过程中的SQL注入?

Php 存储过程中的SQL注入?,php,mysql,sql,mysqli,sql-injection,Php,Mysql,Sql,Mysqli,Sql Injection,我发现代码中的某个地方没有正确转义字符串。我一直在试着看看它是否可以被利用(别担心,我最终会逃避它或者使用预先准备好的语句,这只是为了学习经验) 这是使用mysqli->query()函数 查询是在PHP中生成的,如下所示: $Query = "CALL some_proc(".$_SomeID.",'".$_UnescapedString."')"; 通过输入$\u UnescapedString作为test');把桌子放在桌子上--我得到了查询: CALL some_proc(1, 'te

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

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

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

$Query = "CALL some_proc(".$_SomeID.",'".$_UnescapedString."')";
通过输入
$\u UnescapedString
作为
test');把桌子放在桌子上--我得到了查询:

CALL some_proc(1, '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
命令放入
\u UnescapedString
中?

免责声明,我使用的是SQL Server而不是mySQL,但假设存储过程中的参数行为相同,并且假设
\u 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; -- ')
CALL some_proc(1, 'test'); DROP TABLE SomeTable; -- ')
可能是由于您运行的用户帐户没有足够的权限执行DDL语句,所以没有执行
DROP TABLE
命令


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

免责声明,我使用的是SQL Server而不是mySQL,但假设存储过程中参数的行为是相同的,并且假设
\u 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; -- ')
CALL some_proc(1, 'test'); DROP TABLE SomeTable; -- ')
可能是由于您运行的用户帐户没有足够的权限执行DDL语句,所以没有执行
DROP TABLE
命令


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

我想知道是否可以使用
%DROP TABLE%
部分提前关闭
CONCAT
,然后运行
DROP
命令?我使用的帐户具有完全访问权限,在联机查看后,我相信这是因为出于安全原因,
mysqli->query()
只允许一次查询。根据我的经验,没有通过参数的输入可以过早关闭
CONCAT
。我想知道
%DROP TABLE%
部分是否可以用于过早关闭
CONCAT
,然后运行
DROP
命令?我使用的帐户具有完全访问权限,在联机查看后,我相信这是因为出于安全原因,
mysqli->query()
只允许一次查询。根据我的经验,没有通过参数输入的内容会过早关闭
CONCAT