创建易受多语句 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; --
风格的攻击。
我正在尝试使用 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; --
风格的攻击。