SQLインジェクションの例を作成しようとしていますが、mysqli_multi_queryに変更しない限り、MySQLは毎回2番目のクエリを拒否しています。
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post" name="dummyDorm">
<label>Name: </label>
<input type="text" name="name"><br>
<input type="submit" value="Submit">
</form>
<?php
if($_SERVER["REQUEST_METHOD"] == "POST")
{
$name = $_POST['name'];
$conn = mysqli_connect("localhost", "root", "", "testDB");
if (mysqli_connect_errno()){
echo "failed to connect" . mysqli_connect_error();
die();
}
else
{
$sql = "SELECT * FROM users WHERE name = '{$name}'";
var_dump($sql);
if (mysqli_query($conn, $sql))
{
echo "Success";
}
else {
echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}
mysqli_close($conn);
}
}
?>
フォームは実際には何もしません。SQLインジェクションを使用してデータを編集できることを示したいだけです。「DROPTABLEtestTable」と入力してインジェクションを実行したいと思います。私のMySQLは次のようになります。
DROP DATABASE IF EXISTS testDB;
CREATE DATABASE testDB;
USE testDB;
CREATE TABLE users
(
userID INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255)
)engine=innodb;
CREATE TABLE testTable
(
test VARCHAR(10)
)engine=innodb;
INSERT INTO users VALUES(null, "user01");
注射に入るとき: '; DROP TABLEtestTable-
これは出力されます:エラー:SELECT * FROM users WHERE name = ''; DROP TABLE testTable-'SQL構文にエラーがあります。1行目の「DROPTABLEtestTable-」の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。
私はチュートリアルを続けており、MySQLi_queryを使用しており、正常に機能しますが、インジェクションを実行するには、チュートリアルをMysqli_multi_queryに変更する必要があります。
ありがとう
mysqli_query()
マルチクエリを許可しないのは事実です。そのためにはmysqli_multi_query()が必要であり、その関数の使用を控えれば、DROP TABLEの例のように、複数のクエリの実行に依存するSQLインジェクション攻撃から安全です。
ただし、SQLインジェクションは、DROPTABLE以外の種類のいたずらを引き起こす可能性があります。
SQLクエリのロジックを制御できる他のパラメータを使用してPHPページのURLにアクセスできます。
表のすべての行を読み取ります。
?name=x' OR 'x'='x
別の表を読む:
?name=x' UNION ALL SELECT ... FROM othertable WHERE 'x'='x
サービス拒否攻撃を実行し、1兆行の一時テーブルでデータベースサーバーを強制終了します。
?name IN (SELECT 1 FROM othertable CROSS JOIN othertable CROSS JOIN othertable CROSS JOIN othertable CROSS JOIN othertable CROSS JOIN othertable CROSS JOIN othertable) AND 'x'='x
SQLインジェクションは悪意のある攻撃である必要はありません。正当な文字列を無邪気に使用すると、意図しないSQL構文が生成される可能性があります。
?name=O'Reilly
SQLインジェクションの修正はよく知られており、単純です。パラメーター化されたクエリを使用します。
mysqli_prepare()のマニュアル、またはPHPでSQLインジェクションを防ぐにはどうすればよいかなどの一般的なStackOverflowの質問の完全な例を参照してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加