创建易受多语句 SQL 注入攻击的 PHP 应用程序

Create a PHP application vulnerable to multi-statement SQL injections

我正在尝试使用 PDO 在 PHP 中创建一个应用程序,该应用程序故意容易受到 SQL 注入的攻击,用于教育目的。底层数据库是Postgres。

使用 pdo->query 我可以很容易地演示 ' OR 1=1; -- 样式注入,例如:

$stmt = $pdo->query("SELECT amount FROM client.transactions WHERE clientid='". $id ."' ORDER BY amount DESC");

但是,如果我尝试使用 '; UPDATE client.transactions SET amount=50000000 WHERE id=1; -- 之类的东西来搭载第二条语句,则它不起作用,因为该语句在附加 $id 之后作为准备好的语句发送,并且 Postgres 给出:

SQLSTATE[42601]: Syntax error: 7 ERROR: cannot insert multiple commands into a prepared statement

理想情况下,代码应该相当自然,因为我想分享并与使用 pdo->prepare 的版本进行比较。我想我需要的是 mysqli::multi_query 之类的东西,但我可以在 Postgres 上 运行,或者以任何方式执行未准备好的 SQL query/statement。

我找到了使用 pg_query 而不是 PDO 的解决方案。

$conn = pg_connect("host = ... port = ... dbname = ... user = ... password = ...");
$stmt = pg_query($conn, "SELECT amount FROM client.transactions WHERE clientid='". $id ."' ORDER BY amount DESC");
while ($row = pg_fetch_assoc($result))
{
   // ...
}

这很容易受到 '; UPDATE client.transactions SET amount=50000000 WHERE id=1; -- 风格的攻击。